Win 7下定位kernel32.dll基址及shellcode编写

链 接: http://bbs.pediy.com/showthread.php?t=122260

 
Win 7下定位kernel32.dll基址及shellcode编写
Author:Cryin
Data:2010.10.14
Blog:http://hi.baidu.com/justear
      为了使shellcode在多种操作系统平台下都可以正常运行,就不得不动态的定位kernel32.dll的基地址。而被广泛使用的一种方法是通过TEB/PEB结构获取kernel32.dll基地址,我个人第一次接触是通过绿盟月刊的一篇文章“通过TEB/PEB枚举当前进程空间中用户模块列表”方才知道这种被众多编程人员使用的方法。至于这个方法的最原始出处该文作者也未提及。只得知29A杂志也有大量使用该技术。这种方法适用于除 Win7以外的所有windows操作系统包括95/98/ME/NT/2K/XP,大小只有34 bytes,下面是其原理及实现代码;
      更详细的知识大家可以参考snowdbg大牛的文章Windows下的shellcode剖析浅谈http://bbs.pediy.com/showthread.php?t=99007
      利用PEB结构来查找kernel32.dll的原理:FS段寄存器作为选择子指向当前的TEB结构,在TEB偏移0x30处是PEB指针。而在PEB偏移的0x0c处是指向PEB_LDR_DATA结构的指针,位于PEB_LDR_DATA结构偏移0x1c处,是一个叫 InInitialzationOrderModuleList的成员,他是指向LDR_MODULE链表结构中,相应的双向链表头部的指针,该链表加载的DLL的顺序是ntdll.dll,kernel32.dl,因此该成员所指的链表偏移0x08处为kernel32.dll地址。
更详细的知识大家可以参考snowdbg大牛的文章Windows下的shellcode剖析浅谈http://bbs.pediy.com/showthread.php?t=99007
获取KERNEL32.DLL基址汇编实现代码:
 
;find kernel32.dll
find_kernel32:
    push esi
    xor eax, eax
    mov eax, [fs:eax+0x30]
    test eax, eax
    js find_kernel32_9x        ;win9x or nt
find_kernel32_nt:
    mov eax, [eax + 0x0c]
    mov esi, [eax + 0x1c]
    lodsd
    mov eax, [eax + 0x8]
    jmp find_kernel32_finished
find_kernel32_9x:
    mov eax, [eax + 0x34]
    lea eax, [eax + 0x7c]
    mov eax, [eax + 0x3c]
find_kernel32_finished:
    pop esi
    ret
 
但非常可惜的是这种方法在Win7下是不适用的,所以很高兴现在给大家分享国外网站上看到的一种新的方法来定位kernel32.dl的基地址,该方法可以在所有windows版本上适用!这种方法通过在InInitializationOrderModuleList中查找kernel32.dll模块名称的长度来定位它的基地址,因为"kernel32.dll"的最后一个字符为"\0"结束符。所以倘若模块最后一个字节为"\0"即可定位 kernel32.dll的地址;
 
具体代码实现方法:
;find kernel32.dll
find_kernel32:
    push esi
    xor ecx, ecx
    mov esi, [fs:ecx+0x30]
    mov esi, [esi + 0x0c]
    mov esi, [esi + 0x1c]
next_module:
    mov eax, [esi + 0x8]
    mov edi,[esi+0x20]
    mov esi ,[esi]
    cmp [edi+12*2],cx
    jne next_module
    pop esi
    Ret
      通过我的测试,这种利用该方法编写的shellcode可以在32位平台Windows 5.0-7.0的所有版本上适用,下面是经我测试在 win 7下实现执行calc.exe的shellcode,shellcode本身写的很粗糙只为验证该方法的可用性!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值