首页
社区
课程
招聘
[旧帖] [原创]WinXP下搜索SEH链表获取Kernel32.dll基址 0.00雪花
发表于: 2012-5-2 00:29 3084

[旧帖] [原创]WinXP下搜索SEH链表获取Kernel32.dll基址 0.00雪花

2012-5-2 00:29
3084

在内存中搜索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;
        }
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (4)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
支持共享。。
2012-5-2 10:48
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我这里有个异常,一直没分析出来,请仁兄帮忙看看

Application Error

错误应用程序 ,版本 0.0.0.0,错误模块 unknown,版本 0.0.0.0,错误地址 0x00000000。

0000: 41 70 70 6c 69 63 61 74   Applicat
0008: 69 6f 6e 20 46 61 69 6c   ion Fail
0010: 75 72 65 20 20 20 30 2e   ure   0.
0018: 30 2e 30 2e 30 20 69 6e   0.0.0 in
0020: 20 75 6e 6b 6e 6f 77 6e    unknown
0028: 20 30 2e 30 2e 30 2e 30    0.0.0.0
0030: 20 61 74 20 6f 66 66 73    at offs
0038: 65 74 20 30 30 30 30 30   et 00000
0040: 30 30 30                  000
2012-5-3 06:53
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
顶楼主一个!!学习了!
2012-5-3 09:28
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
5
mark,支持一个
2012-5-3 09:36
0
游客
登录 | 注册 方可回帖
返回
//