asm的本地Apihook(IAT)

改IAT的apihook, 

第一次用汇编..感觉就像写着批处理另外还要想象内存中代码指令的样子..好纠结啊

		.386
		.model flat, stdcall
		option casemap: none
include 	windows.inc
include 	user32.inc
includelib 	user32.lib
include 	kernel32.inc
includelib 	kernel32.lib
IAT_OPCODE_LEN	equ 6
;JMPOPCODE		struct

;JMPOPCODE		ends
		.data
szCaption	db	'Hello',0
szText		db	'Hello World!',0
szNewText	db	'Bye world!',0

		.code
_HookFunc		proc
;_HookFunc::
		mov [esp+8],offset szNewText

_OrgJmp::
		db 90h,90h,90h,90h,90h,90h
_HookFunc		endp

_WriteMem		proc	_lpAddr,_dwSize,_lpbData ;lpAddr 叫 pvoidAddr比较好
		local @flOrgProtect
		local @flMyProtect
		invoke	VirtualProtect,_lpAddr,_dwSize,PAGE_EXECUTE_READWRITE,addr @flOrgProtect
		invoke	RtlMoveMemory,_lpAddr,_lpbData,_dwSize
		;mov ecx,_dwSize		;counter
		;mov esi,_lpbData	;pBuffer
		;mov edi,_lpAddr		;pWriter
		;rep movs byte ptr es:[edi],byte ptr ds:[esi]
		invoke	VirtualProtect,_lpAddr,_dwSize,@flOrgProtect,addr @flMyProtect
		ret
_WriteMem		endp

start			proc
		local	@lpdwJmpAddr
		local	@byOrgJmpAddr[6]:byte
		local	@byNewJmpAddr[6]:byte
		invoke	MessageBox,NULL,offset szText,offset szCaption,MB_OK

;********************************************************************
; 备份原重定位地址,加载新地址
;********************************************************************
		mov @lpdwJmpAddr, offset MessageBox

		invoke	RtlMoveMemory,addr @byOrgJmpAddr,offset MessageBox,IAT_OPCODE_LEN

		;mov esi,@lpdwJmpAddr
		;add esi,2
		;mov eax,[esi];eax is orginal jmp addr

		;mov bx,0ff25h
		;mov word ptr[@byOrgJmpAddr],bx

		;mov dword ptr[@byOrgJmpAddr+2],eax

		mov eax,offset _HookFunc
		mov ebx,offset MessageBox
		sub eax,ebx
		sub eax,5;eax is offset to hookfunc E9xxxxxxxx90
		mov byte ptr[@byNewJmpAddr],0e9h
		mov dword ptr[@byNewJmpAddr+1],eax
		mov byte ptr[@byNewJmpAddr+sizeof dword+1],90h
;********************************************************************
; 写新地址,测试
;********************************************************************
		invoke	_WriteMem,offset _OrgJmp,IAT_OPCODE_LEN,addr @byOrgJmpAddr
		mov edi,@lpdwJmpAddr
		invoke	_WriteMem,edi,sizeof @byNewJmpAddr,addr @byNewJmpAddr			;addr @lpdwJmpAddr传的是堆栈地址
		invoke	MessageBox,NULL,offset szText,offset szCaption,MB_OK

;********************************************************************
; 恢复源地址,测试
;********************************************************************
		mov edi,@lpdwJmpAddr
		invoke	_WriteMem,edi,sizeof @byOrgJmpAddr,addr @byOrgJmpAddr
		invoke	MessageBox,NULL,offset szText,offset szCaption,MB_OK
		invoke	ExitProcess,NULL
		ret
start 			endp
		end	start


win32汇编很不错的推荐看下..



你可能感兴趣的:(汇编)