自己写的一个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
;程序作者:晓斌
;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
相关文章推荐
- tar tree命令解释
- Hibernate中的Entity类之间的继承关系之三JOINED
- 2016-6-7
- 常用dos命令
- 收集点关于FS寄存器的资料
- 《梦断代码》阅读笔记02
- Webbench源码分析
- APP开发实战46-设计模式介绍4
- Crosswalk 开发浅析,忘掉那些Webview的坑
- POST和GET区别
- 字符串变形
- oracle层级查询(Hierarchical Queries)
- VC的编译开关参数大全
- 【FFMpeg视频开发与应用基础】三、调用FFmpeg SDK对H.264格式的视频压缩码流进行解码
- 大猫品Android[三][Reference深入浅出]
- 单列模式
- APP开发实战45-设计模式介绍3
- 深入理解java虚拟机读书笔记-3.6内存分配与回收策略
- ABAP SUBMIT
- java国际化步骤