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

;************************************************
;程序作者:晓斌
;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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值