首页
社区
课程
招聘
[求助]挂钩一进程的函数后 的返回问题
发表于: 2008-10-23 00:44 3475

[求助]挂钩一进程的函数后 的返回问题

2008-10-23 00:44
3475
某程序调用函数时内存如下:
挂钩前
...
03BA3F97: E8 14A5FDFF  -> OldFunc程序原来函数
...

挂钩后为
...
03BA3F97: E9 FC42CEFD  
...

我自己的Hook函数
procedure HookFunc     -> 0x01888298
{       pushad
        pushfd
        call   GetInfo   //自定义函数
     popfd
        popad        
        call   yy   
        jmp    zz
}
其中 变量值如下
yy = 0x03BA3F97 + 0x14A5FDFF - 0x01888298 - 9
zz = 0x03BA3F97 - 0x01888298 - 14

现在程序能正常执行我的HookFunc函数,
但是当执行到 call yy 时,程序挂了,
哪位高手指点一下,谢谢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
指点`..```
2008-10-23 22:39
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你call 完 yy 后 堆栈不平衡了吧?
你可以在这里加上寄存器的保护试试`````````
2008-10-23 22:42
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
你用调试器跟踪一下,我觉得你的写法,最终编译器的理解和你的愿意有区别。

你需要在调试器中看看call yy 最后生成的机器码是不是 e8 yy

如果你是用 #define yy的方式定义的yy的值的话,我想最终编译的机器码将不会是 e8 yy这样的,很有可能编译器会把yy的值当作一个地址值,然后重新生成指令,比如假设 yy = 0x456789,编译器可能是生成一条CALL向地址0x456789的指令,而不是直接将yy的值写入机器码。

在VC6的调试环境中按ALT+8可以打开反汇编窗口,你可以试试。

以上是我的想法,仅供参考,有错莫怪,欢迎指正。

比较好一些的方法是用一个函数指针来调用,比较保险
2008-10-24 03:13
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
procedure HookFunc     -> 0x01888298
{       pushad
        pushfd
        call   GetInfo   //自定义函数   
        call   yy   
        jmp    zz
     popfd
        popad   
}
你需要关注HOOK返回的问题
2008-10-24 09:54
0
雪    币: 175
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
;>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff hook.asm
; Link /subsystem:windows /Dll /Def:Sample.def Sample.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386p
.model flat, stdcall
option casemap:none

include                windows.inc
include                user32.inc
includelib                user32.lib
include                kernel32.inc
includelib         kernel32.lib

.code
;//========================dll_init===================================
DllEntry        proc        _hInstance,_dwReason,_dwReserved
                nop
                call        initapi
                mov        eax,TRUE
                ret
DllEntry        Endp
;*****************
initapi:        push        ebp
        mov        ebp,esp
        pushad
        call        @f
        db        'user32.dll',0
@@:        call        @f
        db        'GetDlgItemTextA',0
@@:        mov        eax,offset new_GetDlgItemTextA
        push        eax
        call        do_hook
;*****************
        call        @f
        db        'user32.dll',0
@@:        call        @f
        db        'GetDlgItemTextW',0
@@:        mov        eax,offset new_GetDlgItemTextA
        push        eax
        call        do_hook
;*****************
        popad
        mov        esp,ebp
        pop        ebp
        ret
;//================================================================
do_hook:
        push        ebp                ;//函数头
        mov        ebp,esp
        lea        eax,[ebp+10H]
        push        [eax]                ;'user32.dll',0       
        call        GetModuleHandleA
        lea        ebx,[ebp+0CH]
        push        [ebx]                ;'GetDlgItemTextA',0
        push        eax
        call        GetProcAddress
        mov        edi,eax            ;最后获得GetDlgItemTextA地址
push        04H
push        1000H
push        28
push        0
        call        VirtualAlloc                ;>>>>>>>>>>>>>
        test        eax,eax
        jz        do_sleep
        mov        esi,eax            ;为MBI结构分配内存

push        28
push        esi
push        edi
        call        VirtualQuery        ;内存页的信息;>>>>>>>>>>>secendApi
        test        eax,eax
        jz        free_mem

        call        GetCurrentProcess                ;>>>>>>>>>>>thirdApi
push    5
push    edi
push    eax
        call        FlushInstructionCache    ;只是为了确定一下:);>>>>forthApi

        lea        eax,[esi+014h]
        push        eax
push        40H
        lea        eax,[esi+00Ch]
        push        [eax]
        push        [esi]
        call        VirtualProtect          ;我们要修改保护属性,这样才能够写入代码;>>>>>>>>fivethApi
        test        eax,eax
        jz        free_mem        

        mov        byte ptr [edi],0E8h    ;写入跳转指令;>>>>>>instance hook(E9H>E8H)
        lea        eax,[ebp+08H]
        mov        eax,[eax]                ;[eax]=offset new_GetDlgItemTextA
        sub        eax,edi
        sub        eax,5
        inc        edi
        stosd                        ;这里是跳转地址

        ;push        offset old_protect==============================================
        push        0;<>
        push        esp;<>
        lea        eax,[esi+014h]
        push        [eax]
        lea        eax,[esi+00Ch]
        push        [eax]
        push        [esi]
        call        VirtualProtect        ;恢复页保护属性
        pop        eax;<>
free_mem:
        push        8000H
        push        0
        push        esi
        call        VirtualFree        ;释放内存
RetnDllEntry:
        mov        esp,ebp
        pop        ebp                ;//函数收尾
        ret        0CH
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
new_GetDlgItemTextA:
;========================================
        push        ebp
        mov        ebp,esp
        sub        esp,40H
;======================my call
        mov        eax,esp
        push        [ebp+18H]
        push        eax        ;buffer
        push        [ebp+10H]
        push        [ebp+0CH]
        call        @F
@@:        pop        eax
        add        eax,0EH;<set to the next run
        push        eax
        push        ebp
        mov        ebp,esp
        mov        eax,[ebp]                ;old_ebp
        jmp        dword ptr [eax+04]
        nop                        ;the next run
;========================user call
        push        [ebp+18H]
        push        [ebp+14H]        ;buffer
        push        [ebp+10H]
        push        [ebp+0CH]
        call        @F
@@:        pop        eax
        add        eax,0EH;<set to the next run
        push        eax
        push        ebp
        mov        ebp,esp
        mov        eax,[ebp]                ;old_ebp
        jmp        dword ptr [eax+04]
        nop                        ;the next run
        push        eax                ;save the back auto
;=======================Send password
push        0
push        esp
pop        eax
add        eax,08H
call        @f
db        '报告:信息截取成功!',0
@@:
push        eax
push        0
call        MessageBoxA
        pop        eax
;=================================
        mov        esp,ebp
        pop        ebp
        add        esp,04H
        ret        10H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
new_VirtualProtect:
add        esp,04H
ret        10H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
do_sleep:
        mov        esp,ebp
        pop        ebp
        ret
end        DllEntry
2008-10-24 09:55
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
先谢谢各位了!!
我的hook函数是用delphi嵌入汇编做的,不知道是否能有什么关系?
函数代码如下:
我自己的Hook函数
procedure HookFunc     -> 0x01888298
asm
      pushad
        pushfd
        call   GetInfo   //自定义函数
     popfd
        popad        
        call   yy   
        jmp    zz
end;
2008-10-24 15:09
0
游客
登录 | 注册 方可回帖
返回
//