您的位置:首页 > 其它

自己写的一个HOOKAPI的汇编例子

2016-06-07 22:46 363 查看
;************************************************

;程序作者:晓斌

;QQ:6750333        xbin1981

;************************************************

.586

.model flat, stdcall

option casemap :none

include windows.inc

include user32.inc

includelib user32.lib

include kernel32.inc

includelib kernel32.lib

HOOKAPI STRUCT

apiaddr DWORD ?    ;目标进程里的API地址

paddr1 DWORD ?    ;插入目标进程的代码地址

apiconst BYTE 6 dup (?) ;API前6个字节

apipush BYTE ?    ;PUSH机器码

paddr DWORD ?   ;插入目标进程的代码地址

sret BYTE ?    ;RET机器码

HOOKAPI ENDS

.DATA

hack HOOKAPI <?>

szdll db "user32.dll",0

zzapi db "MessageBoxA",0

.code

;********************************************************************

; 插入代码的第一部分开始

;********************************************************************

REMOTE_CODE_START equ this byte

szapiaddr dd ?   ;存放API地址,由_HOOKAPI远程写入

szhookapi dd ?   ;本HOOK程序的开始地址

szConst   db 6 dup (?)   ;存放API前6个字节,由_HOOKAPI远程写入

call @F

@@:

pop ebx

sub ebx,offset @B

lea esi,[ebx + offset szConst]

mov edi,[ebx + offset szapiaddr]

xor eax,eax

@@:

mov cl,[esi+eax]

mov [edi+eax],cl

inc eax

.if eax<6

jmp @B

.endif

mov eax,edi

REMOTE_CODE_END equ this byte

REMOTE_CODE_LENGTH equ offset REMOTE_CODE_END - offset REMOTE_CODE_START

;********************************************************************

; 插入代码的第一部分结束

;********************************************************************

;********************************************************************

;hPid:进程PID

;HOOKDLL:API所在的DLL名称地址

;APIName:API名字地址

;HOOKConst:要插入代码的地址

;HOOKConstL:要插入代码的长度

;Switch:等于0为在API开始执行之前HOOK,大于0为在API执行后在HOOK,暂时没实现此功能

;********************************************************************

_HOOKAPI proc uses ebx edi esi hPid,HOOKDLL,APIName,HOOKConst,HOOKConstL,Switch

local @lpRemoteCode

local @APIaddr

local @szSise

local @hProcess

LOCAL mbi:MEMORY_BASIC_INFORMATION

;********************************************************************

; 获得API地址

;********************************************************************

invoke GetModuleHandle,HOOKDLL

mov ebx,eax

invoke GetProcAddress,ebx,APIName

mov @APIaddr,eax

mov hack.apiaddr,eax

invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,hPid

.if eax

   mov @hProcess,eax

;********************************************************************

; 在进程中分配空间并将执行代码拷贝过去,然后创建一个远程线程

;********************************************************************

;返回页面虚拟信息

invoke VirtualQueryEx,@hProcess, @APIaddr,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION

;修改为可读写模式

invoke VirtualProtectEx,@hProcess, mbi.BaseAddress,6h,PAGE_EXECUTE_READWRITE,addr mbi.Protect

   xor eax,eax

   add eax,offset REMOTE_CODE_END - offset REMOTE_CODE_START

   add eax,HOOKConstL

;在目标进程里申请空间

   invoke VirtualAllocEx,@hProcess,NULL,eax,MEM_COMMIT,PAGE_EXECUTE_READWRITE

   .if eax

    mov @lpRemoteCode,eax

    add eax,14

    mov hack.paddr,eax

    mov hack.paddr1,eax

    xor eax,eax

    add eax,offset REMOTE_CODE_END - offset REMOTE_CODE_START

;写插入代码的第一部分

    invoke WriteProcessMemory,@hProcess,@lpRemoteCode,offset REMOTE_CODE_START,eax,NULL

    xor eax,eax

    add eax,offset REMOTE_CODE_END - offset REMOTE_CODE_START

    mov ebx,@lpRemoteCode

    add ebx,eax

;写插入代码的第二部分,也就是下面的MyMessageBox函数

    invoke WriteProcessMemory,@hProcess,ebx,HOOKConst,HOOKConstL,NULL

;读目标进程API前6字节并保存

    invoke ReadProcessMemory,@hProcess,@APIaddr,offset hack.apiconst,6,NULL

;写目标进程API前6字节,实现跳转到插入的代码里

    invoke WriteProcessMemory,@hProcess,@APIaddr,offset hack.apipush,6,NULL

;把保存目标进程的API前6个字节和API地址写到已经插入到目标进程的代码里,在代码运行的时候便于恢复API功能

    invoke WriteProcessMemory,@hProcess,@lpRemoteCode,offset hack.apiaddr,14,NULL

   .endif

   invoke CloseHandle,@hProcess

.else

   xor eax,eax

.endif

ret

_HOOKAPI endp

;********************************************************************

; 插入代码的第二部分开始,也就是替换的函数

;********************************************************************

CODE_START equ this byte

MyMessageBox proc aa11,bbb1,ccc1,ddd1

push ebx

push 0h

mov esi,"1111"

push esi

mov esi,esp

push ddd1

push ccc1

push esi

push aa11

db 0cch

call eax

add esp,8

pop ebx

mov edi,[ebx + offset szapiaddr]

mov cl,68h

mov [edi],cl

inc edi

mov ecx,[ebx + offset szhookapi]

mov [edi],ecx

add edi,4

mov ecx,0c3h

mov [edi],ecx

ret

MyMessageBox endp

CODE_END equ this byte

CODE_LENGTH equ offset CODE_END - offset CODE_START

;********************************************************************

; 插入代码的第二部分结束

;********************************************************************

start:

mov hack.sret,0C3h

mov hack.apipush,68h

invoke MessageBox,NULL,addr zzapi,NULL,MB_OK or MB_ICONWARNING

assume FS:nothing

;得到本进程的PID

mov ebx,FS:[20h]

invoke _HOOKAPI,ebx,addr szdll,addr zzapi,offset MyMessageBox,CODE_LENGTH,NULL

invoke MessageBox,NULL,addr zzapi,NULL,MB_OK or MB_ICONWARNING

invoke ExitProcess,NULL

end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: