XP WIN7 下获取Kernel32.exe基址的程序片段(通杀 xp win7 (32位 64位)
这俩天写一个shellcode的小程序,调用以前XP下从PEB获取kernel32基址的方法在win7(64位)下失效。程序代码:
mov eax,fs:[30h] ;得到PEB结构地址 mov eax,[eax + 0ch] ;得到PEB_LDR_DATA结构地址 mov esi,[eax + 1ch] lodsd ; 得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址 mov edx,[eax + 8h] ;得到BaseAddress,既Kernel32.dll基址上面是XP下以前的方法可惜在WIN7下不能用了
有没有通用的办法那,要不咋的shellcode没法整了,别急看下面的
程序代码:
assume fs:nothing xor ecx,ecx mov eax,fs:[30h] ;得到PEB结构地址 mov eax,[eax + 0ch] ;得到PEB_LDR_DATA结构地址 mov esi,[eax + 1ch] next_module: mov eax,[esi+08h] ;取列表中模块基址到eax mov edi,[esi+20h] ;取所属模块的字串首地址到EDI mov esi,[esi] cmp [edi+12*2],cx ;cx=0 比较字串的尾部是否为0 jnz next_module ;继续枚举 mov edx,eax ;eax保存着kernel32的基址其中[edi+12*2]为啥要取这个偏移那?
因为kernel32.exe在PEB中的字串是以unicode的形式保存着,
所以kernel32.exe占内存24个字节
首地址加24个字节就是kernel32的尾部
比较模块尾部是否为0来确定是否是kernel32的基址
此方法通用于XP WIN7 32位和64位,俺亲自做了测试可以通用哦;
亲们写注入又有好办法了
说明:此方法非自己原创