![]() |
#2
zklhp2012-09-05 13:38
|

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下不能用了mov eax,[eax + 0ch] ;得到PEB_LDR_DATA结构地址
mov esi,[eax + 1ch]
lodsd ; 得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址
mov edx,[eax + 8h] ;得到BaseAddress,既Kernel32.dll基址
有没有通用的办法那,要不咋的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]为啥要取这个偏移那?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的基址
因为kernel32.exe在PEB中的字串是以unicode的形式保存着,
所以kernel32.exe占内存24个字节
首地址加24个字节就是kernel32的尾部
比较模块尾部是否为0来确定是否是kernel32的基址
此方法通用于XP WIN7 32位和64位,俺亲自做了测试可以通用哦;
亲们写注入又有好办法了
说明:此方法非自己原创