首页
社区
课程
招聘
求助,hook一函数搞不定了
发表于: 2010-6-30 14:29 3863

求助,hook一函数搞不定了

2010-6-30 14:29
3863
目标程序中有一未导出函数,我想hook掉,好取其参数信息.
目标函数形式如下:
10005F40  /.  55            push    ebp                              ;  数据,长度
10005F41  |.  8BEC          mov     ebp, esp
10005F43  |.  83EC 08       sub     esp, 8
10005F46  |.  56            push    esi
10005F47  |.  C745 F8 CCCCC>mov     dword ptr [ebp-8], CCCCCCCC
10005F4E  |.  C745 FC CCCCC>mov     dword ptr [ebp-4], CCCCCCCC
10005F55  |.  894D FC       mov     dword ptr [ebp-4], ecx
...
10005FEB  |.  83C4 08       add     esp, 8
10005FEE  |.  3BEC          cmp     ebp, esp
10005FF0  |.  E8 EBE30000   call    100143E0
10005FF5  |.  8BE5          mov     esp, ebp
10005FF7  |.  5D            pop     ebp
10005FF8  \.  C2 0C00       retn    0C

调用部分:
0039897E  |.  8B8D 60FFFFFF |mov     ecx, dword ptr [ebp-A0]
00398984  |.  51            |push    ecx
00398985  |.  8B55 84       |mov     edx, dword ptr [ebp-7C]
00398988  |.  52            |push    edx
00398989  |.  8B85 54FFFFFF |mov     eax, dword ptr [ebp-AC]
0039898F  |.  50            |push    eax
00398990  |.  8B4D EC       |mov     ecx, dword ptr [ebp-14]
00398993  |.  8B11          |mov     edx, dword ptr [ecx]
00398995  |.  8B42 50       |mov     eax, dword ptr [edx+50]
00398998  |.  8B4D EC       |mov     ecx, dword ptr [ebp-14]
0039899B  |.  8B11          |mov     edx, dword ptr [ecx]
0039899D  |.  8B4A 50       |mov     ecx, dword ptr [edx+50]
003989A0  |.  8B00          |mov     eax, dword ptr [eax]
003989A2  |.  FF50 04       |call    dword ptr [eax+4]                          //call 10005F40  

现在想hook 10005F40  ,我已经作了dll注入,在注入的同时去更改10005F40的前5个字节,将其jmp到我的代码段,这个过程都成功了,因为我加的outputdebugstring可以看到信息.
然后将5个字节还原,再去call真正的10005F40,但是就出现错误了,后来我发现可能是ecx的值不对,输出看一下,果然在我的函数一开始ecx的值为0,我不明白这个ecx怎么会变成0的??
高手帮小弟分析下吧。
谢谢啦

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
在你的hook函数内部先pushad pushfd一下
再将要跳向原函数时再popfd popad一下
2010-6-30 14:52
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好的,现在改成这样了
void WINAPI MyFunc(DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{
        __asm pushad
        __asm pushfd
        DWORD dwEcx = 0;
        __asm mov dwEcx, ecx
        TCHAR strBuffer[260] = {0};
        _stprintf(strBuffer, _T("ecx: %x, dwParam1: %x,dwParam2: %x, dwParam3:%x"),
                dwEcx, dwParam1, dwParam2, dwParam3);
        OutputDebugString(strBuffer);
        hj.Lock();
        hj.SetHookOff();
       
        MessageBeep(MB_ABORTRETRYIGNORE);
        OutputDebugString(_T("hhhhook~~1"));

        __asm{
                popfd
                popad
                call FuncToDetour;
        }
        hj.SetHookOn();
        OutputDebugString(_T("hhhhook~~2"));
        hj.Unlock();
};

运行后ecx输出是0,但这次"hhhhook~~2"这个信息输出来了,之前一直没输出这个。
运行后还是弹了个错误的窗口出来,提示
run time check failure #0 - the value of esp was not properly saved across a function call.this is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

看错误好像在说我调用的函数原型和真正的函数不一样是么
2010-6-30 15:08
0
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
堆栈被破坏了

改成naked函数
函数名称前+__declspec( naked ) 修饰
2010-6-30 15:29
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢风随雨行。
这样改完后,那个对话框是不出现了,但目标程序也挂掉了,还有可能是哪里的问题呢
2010-6-30 15:41
0
雪    币: 2523
活跃值: (520)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
那我就不清楚了,剩下的就是你自己调试去吧
从上面的代码也不好看出什么东西出来
2010-6-30 16:16
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还是谢谢您。希望还有高手能来帮帮忙
现在我的函数让我改成下面这样,当然问题还存在,运行完后目标程序就挂了.
void __declspec( naked ) MyFunc(DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{
        __asm pushad
        __asm pushfd
        hj.Lock();            
        hj.SetHookOff();   //还原5个字节
        //OnMyPro(dwParam1, dwParam2, dwParam3);
        OutputDebugString(_T("hhhhook~~1"));
        __asm{
                popfd
                popad
                call FuncToDetour;
        }
        hj.SetHookOn();  //重新修改5个字节
        OutputDebugString(_T("hhhhook~~2"));
        hj.Unlock();
        __asm retn 0x0c
};
2010-6-30 16:35
0
雪    币: 160
活跃值: (29)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
出了什么问题?究竟怎么解决的?楼主请谈谈最终问题的原因和解决方案啊。
2010-7-15 17:02
0
雪    币: 167
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
在调用 target detour function, 恢复ecx, 因为ecx可以在前面的过程中改变.
2010-7-15 17:29
0
游客
登录 | 注册 方可回帖
返回
//