首页
社区
课程
招聘
发现一件很有趣的事情
发表于: 2006-10-10 13:52 4200

发现一件很有趣的事情

2006-10-10 13:52
4200
我在DllEntryPoint Callback中试图挂钩WideCharToMultiByte,这个挂钩的函数什么也不做,仅仅跳转到WideCharToMultiByte自身的地址上面。在Callback返回之前,以正确的、不同于本地页码的参数调用WideCharToMultiByte,如果此时将int 3指令设置在挂钩之前,WideCharToMultiByte会在某个收尾的地方出现无效内存访问,如果将int 3设置在挂钩之后,这个函数将被安全的执行。

DllEntryPoint:
int 3
HookWideCharToMultiByte
...
push 932,x,x,x,x,x,x,x      ;本地页码简体中文(中国)是936
call WideCharToMultiByte    ;这种情况会出错

DllEntryPoint:
HookWideCharToMultiByte
int 3
...
push 932,x,x,x,x,x,x,x
call WideCharToMultiByte    ;这种就不会

挂钩后确实有调用FlushInstructionCache的,而且错误发生在WideCharToMultiByte快要返回的时候,相信与cache关系不大。在错误发生时,kenrel32的SEH直接关闭了这个线程,如果在一个额外的线程中执行,调试器将会得到调试无法继续的通知(OD默认忽略kernel32中的异常)。

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
最初由 drwch 发布
挂钩后确实有调用FlushInstructionCache的,而且错误发生在WideCharToMultiByte快要返回的时候,相信与cache关系不大。在错误发生时,kenrel32的SEH直接关闭了这个线程


能不能确定这是个什么类型的异常
2006-10-10 18:26
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
就是无效内存访问啊

在WINXP SP2里面,地址是7C80A292,CMP WORD PTR[EAX+2],1
2006-10-10 18:37
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
顺便贴上挂钩函数,很简单的构造

HookDllFunc    FRAME    lpstrFuncName, lpHookAddress, hDLL

        mov        ecx,[hDLL]
        mov        eax,[lpstrFuncName]
        test        ecx,ecx
        jz        >L003
        push        eax
        push        ecx
        call        [kernel32:GetProcAddress]
       
L003:
       
        mov        esi,eax
        push        ecx
        push        esp
        push        PAGE_EXECUTE_READWRITE
        push        edi
        push        eax
        call        [kernel32:VirtualProtect]
        mov        eax,[lpHookAddress]
        mov        B[esi],0xE9
        sub        eax,esi
        pop        ecx
        sub        eax,edi
        mov        [esi + 1],eax
        push        edi
        push        esi
        push        -1
        call        [kernel32:FlushInstructionCache]
        add        esi,edi
        ret
       
ENDF

其中edi是一个常量5,esi是这个函数的返回值

如果传入的hDLL参数为空,则lpstrFuncName不是被挂勾函数的名字,而是它的地址
2006-10-10 18:45
0
游客
登录 | 注册 方可回帖
返回
//