能力值:
( LV2,RANK:10 )
|
-
-
2 楼
指点`..```
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
你call 完 yy 后 堆栈不平衡了吧?
你可以在这里加上寄存器的保护试试`````````
|
能力值:
(RANK:260 )
|
-
-
4 楼
你用调试器跟踪一下,我觉得你的写法,最终编译器的理解和你的愿意有区别。
你需要在调试器中看看call yy 最后生成的机器码是不是 e8 yy
如果你是用 #define yy的方式定义的yy的值的话,我想最终编译的机器码将不会是 e8 yy这样的,很有可能编译器会把yy的值当作一个地址值,然后重新生成指令,比如假设 yy = 0x456789,编译器可能是生成一条CALL向地址0x456789的指令,而不是直接将yy的值写入机器码。
在VC6的调试环境中按ALT+8可以打开反汇编窗口,你可以试试。
以上是我的想法,仅供参考,有错莫怪,欢迎指正。
比较好一些的方法是用一个函数指针来调用,比较保险
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
procedure HookFunc -> 0x01888298
{ pushad
pushfd
call GetInfo //自定义函数
call yy
jmp zz
popfd
popad
}
你需要关注HOOK返回的问题
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
先谢谢各位了!!
我的hook函数是用delphi嵌入汇编做的,不知道是否能有什么关系?
函数代码如下:
我自己的Hook函数
procedure HookFunc -> 0x01888298
asm
pushad
pushfd
call GetInfo //自定义函数
popfd
popad
call yy
jmp zz
end;
|