能力值:
( LV4,RANK:50 )
|
-
-
3 楼
其实mov edi, edi是“官方”的hook点位
先把这个两字节的指令改成short jmp,jmp到函数之前的nop字节处,在那里放入near jmp,转移到hook函数。
|
能力值:
( LV13,RANK:240 )
|
-
-
5 楼
有这么一说???
JMP 5字节 刚好是 mov edi,edi push ebp emov ebp,esp
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
不是这个意思,先修改mov edi, edi为2字节的jmp,jmp到函数之前的nop处,那里放入5字节的jmp。
君不见很多api函数前面都有5个0x90,显然是为了5字节的jmp。
mov edi, edi执行时任何作用都没有,只是为了方便hook
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
如果是hook我提到的几个位置,参数压栈是没有问题的
例如在函数头:
call过来的时候返回地址压栈,而在我代码本身有:push ebp,
所以此时堆栈的信息:
ebp + 0:保存的ebp
ebp + 4:返回地址
假如函数带一个参数:
add eax, 1 => eax为2
lea ebx, [ebp + eax * 4] => ebp + 8即是第一个参数
注意前边有说明是stdcall,两个以上参数压栈的顺序从右到左,所以eax递减
其他任意合适的位置的话,需要修改一下,理论上任何位置都可以hook,只要注意hook点指令的完整性即可
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
你这里 为什么要把参数的地址作为参数压进去,而不是参数本身,就是
lea ebx ,[ebp+eax*4]
push ebx
是不是应该改为 push [ebp+eax*4]
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
[QUOTE=skypismire;1228094]你这里 为什么要把参数的地址作为参数压进去,而不是参数本身,就是
lea ebx ,[ebp+eax*4]
push ebx
是不是应该改为 push [ebp+eax*4][/QUOTE] 故意为之,其实在注释里有解释,Messagebox的例子也是这么写的:
lea ebx, [ebp + eax * 4] /* 这里取的是参数的地址,目的是能够修改参数 */
push ebx /* 例如让MessageBox改成显示"Hook..." */
目的佷简单,我们可以把上层传过来的参数改掉,给函数传递一个错误的信息
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
来几个函数.看得懂的.拿去用吧
acallb proc a_addr:dword,b_addr:dword
local OldProtect
pushad
invoke IsBadWritePtr,a_addr,8
.if eax!=0
invoke VirtualProtect,a_addr,8,PAGE_EXECUTE_READWRITE,addr OldProtect
.endif
mov eax,a_addr
mov edx,b_addr
sub edx,eax
sub edx,5
mov byte ptr[eax],0e8h
xchg [eax+1],edx
popad
ret
acallb endp
ajmpb proc a_addr:dword,b_addr:dword
local OldProtect
pushad
invoke IsBadWritePtr,a_addr,8
.if eax!=0
invoke VirtualProtect,a_addr,8,PAGE_EXECUTE_READWRITE,addr OldProtect
.endif
mov eax,a_addr
mov edx,b_addr
sub edx,eax
sub edx,5
mov byte ptr[eax],0e9h
xchg [eax+1],edx
popad
ret
ajmpb endp
xcopy proc src:dword,des:dword,slen:dword
pushad
mov edi,src
mov esi,des
mov ecx,slen
xcopyloop:
mov al,byte ptr[edi]
mov byte ptr[esi],al
inc edi
inc esi
loop xcopyloop
popad
ret
xcopy endp
hook_addr_jump proc lpaddr,myapi,jump
LOCAL vaddr
local OldProtect
pushad
invoke VirtualAlloc,0,1000h,MEM_RESERVE+MEM_COMMIT,PAGE_READWRITE
mov vaddr,eax
invoke acallb,vaddr,myapi
mov ecx,lpaddr
mov ebx,vaddr
add ebx,5
invoke xcopy,ecx,ebx,jump
mov ebx,vaddr
add ebx,5
add ebx,jump
mov ecx,lpaddr
add ecx,jump
invoke ajmpb,ebx,ecx
invoke ajmpb,lpaddr,vaddr
invoke VirtualProtect,vaddr,1000h,PAGE_EXECUTE_READWRITE,addr OldProtect
popad
ret
hook_addr_jump endp
|