欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

WinXP下搜索SEH链表获取Kernel32.dll基址

WinXP下搜索SEH链表获取Kernel32.dll基址

在内存中搜索kernel32.dll映像基址的方法,小弟只知道三种①暴力搜索堆栈②搜索PEB③搜索SEH链表,前两种,我觉着过于招摇了,尤其是第二种几乎刚刚写出来,就被杀了T_T。。。
第一种方法我很熟悉了,今天突然想用第三种方法实现以下,于是乎说做就做,实践中发现了一个小小的问题,在WIN7下搜索SEH链表,得到的是Ntdll.dll的基址,并不是Xp下的Kernel32.dll。为了让程序更健壮些,我加入了SEH异常处理函数,能够修正EIP使程序能够达到预期结果。。。
这里只列出了关键代码,具体的测试代码我放在附件里面了。求精华贴,求邀请码。。。
编译环境:VC6.0
关键代码如下:
DWORD dwHandlerAddress = (DWORD)ExceptionHandler;
LPVOID APIENTRY GetKernelBase()
{
  LPVOID lpModule = NULL; 
  {
    _asm push ebp          //注册SEH,附加数据,原始EBP
    _asm push offset next              //附加数据,安全代码区域
    _asm push dwHandlerAddress                
    _asm push fs:[0]                                      
    _asm mov fs:[0],esp
    _asm cld
    _asm xor esi,esi
    _asm mov esi,dword ptr fs:[0] //获取SEH链表地址
    _asm lookup:
    _asm lodsd                             
    _asm inc eax
    _asm je find
    _asm dec eax
    _asm xchg esi,eax
    _asm jmp short lookup
    _asm find:  
         _asm mov edi,dword ptr [esi]  
         _asm and edi,0xffff0000
               _asm start:
    _asm cmp word ptr [edi],0x5a4d  //判断内存模块是否为PE文件
    _asm jnz next
    _asm mov esi,edi
         _asm add esi,dword ptr ds:[esi+0x3c]
       _asm cmp word ptr [esi],0x4550
    _asm jnz next
    _asm mov lpModule,edi
    _asm jmp short end  
    _asm next:
    _asm sub edi,0x10000
    _asm cmp edi,0x70000000
    _asm je end
    _asm jmp short start
    _asm end:
    _asm pop fs:[0]
                _asm add esp,0x0c
  }
  return lpModule;
}  
EXCEPTION_DISPOSITION _cdecl ExceptionHandler(EXCEPTION_RECORD * ExceptionRecord,
                        LPVOID EstablisherFrame,
                        CONTEXT * ContextRecord,
                        LPVOID DispatcherContext)
{
  if(ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION)
  {
    //内存访问异常,调整EIP到正常的内存地址
    DWORD dwEbp=0,dwEip=0,dwEsp=0;
    _asm
    {
      mov eax,EstablisherFrame
      push dword ptr [eax+0x08]
      pop dwEip
      push dword ptr [eax+0x0c]
      pop  dwEbp
      mov dwEsp,eax
    }
    ContextRecord->Eip=dwEip;
    ContextRecord->Ebp=dwEbp;
    ContextRecord->Esp=dwEsp;
    return ExceptionContinueExecution;
  }
  else if(ExceptionRecord->ExceptionCode == 0x0C0000027
      || ExceptionRecord->ExceptionFlags == 2  
      || ExceptionRecord->ExceptionFlags == 6)
  {
    //进行展开操作
    return ExceptionContinueSearch;
  }
  else
  {
    //其他异常
    return ExceptionContinueSearch;
  }
}

上传的附件 GetKernelBase.7z

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功