注册 登录
编程论坛 汇编论坛

XP WIN7 下获取Kernel32.exe基址的程序片段(通杀 xp win7 (32位 64位)

水哥 发布于 2012-09-05 13:35, 2887 次点击
这俩天写一个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位,俺亲自做了测试可以通用哦;
亲们写注入又有好办法了
说明:此方法非自己原创
9 回复
#2
zklhp2012-09-05 13:38
下面那个方法XP时代也有 只不过在XP时代和上面的可能是等效的
#3
水哥2012-09-05 13:41
俺孤陋寡闻了,一直用以前的方法,这是这俩天需要获取基址了,百度研究了下,觉得好用才共享下
#4
zklhp2012-09-05 13:48
加个高亮罢 花花绿绿的才好看
#5
有容就大2012-09-05 14:00
嘿嘿 帮顶!
#6
pangding2012-09-05 23:49
全是红名呀。帮顶。
#7
glacierword2012-09-12 15:46
虽然很高深看不明白,但高深的东西要顶到大牛来回答
#8
Alar302012-09-13 15:19
围观学习了。。
#9
zklhp2012-09-13 15:29
其实看雪论坛有很多这样的东西 那里搞这个的水平很高 有兴趣可以多去那里看 这里大部分还是基础的东西
#10
zhu2240392012-10-01 22:43
我也顶
1