必备绝技Hook大法 上Word格式文档下载.docx
《必备绝技Hook大法 上Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《必备绝技Hook大法 上Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
![必备绝技Hook大法 上Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/69b95e9d-5820-49bc-9efb-1f3b91fcb70b/69b95e9d-5820-49bc-9efb-1f3b91fcb70b1.gif)
用途:
现在这种方法普遍运用于各类程序中,如加壳,杀软,病毒,Rootkits等等。
本文从难以程度上主要分三块详细介绍:
一.用户模式Hook:
IAT-hook,Dll-inject二.内核模式Hook:
ssdt-hook,idt-hook,int
2e/sysenter-hook三.Inline
Hook;
这次先来看第一部分
Ⅰ.用户模式Hook
一.IAT-hooking
(一)一般原理:
IAT是Import
Address
Table(输入地址表)的简写,这需要你知道关于win
PE格式的了解。
现在应用程序中的大多数函数都是windows
api,而这些函数一般都由几个系统dll导出,如user32.dll,kernel32.dll,advapi32.dll等。
如果程序要运用这些函数,就的从这些dll文件中导入,程序会把导入的函数放到一个叫IAT的数据结构中。
我们可以先找到自己需要hook的函数,然后把目标函数的地址改成我们自己的hook函数,最后在恢复到目标函数的地址。
这样一来,目标函数被调用时,我们的hook函数也就别调用了。
如果这个hook函数是病毒,是后门,是。
。
由于是在目标函数进程的空间内,所以这个hook函数也就不会被发现。
关于WIN
PE格式的详细知识可参见:
(二)大体框架:
这里用伪码给个一般框架,以便有个大体印象。
文件1:
myhookfun()
{
可以创建一个新的线程,去执行木马或后门等功能
}
文件2:
include
<
文件1>
寻找目标模块(GetModuleHandle)
if(目标模块找到)
根据pe结构,在目标模块中定位目标函数的IAT地址(这个地址在加载时就确定了)
if
(目标函数在IAT中的地址找到)
用我们的myhookfun()地址取代
esle
退出
当然也可以合成一个文件,但这样分开的好处是可以实现模块化,可以分别关心各自的功能,也便于以后重用。
(三)代码实例:
.486
.model
flat,
stdcall
option
casemap:
none
windows.inc
kernel32.inc
includelib
kernel32.lib
user32.inc
user32.lib
.data
szMsgTitle
db
"
IAT
Hook"
0
szModule
user32.dll"
szTargetFunc
GetForegroundWindow"
szHooked
This
is
in
the
hooked
function
-
Seems
to
have
worked."
szFail
Failed."
.data?
IATHook
PROTO
STDCALL
:
DWORD,
DWORD
HookProc
LPVOID
.code
proc
Arg1:
invoke
MessageBox,
NULL,
addr
szHooked,
szMsgTitle,
MB_OK
ret
endp
pDLLName:
LPVOID,
pOldAddr:
pNewAddr:
LOCAL
hModule:
HANDLE
dwVirtualAddr:
dwOrigProtect:
dwDllFound:
dwFunctionFound:
;
Local
variables
.if
pDLLName
==
NULL
Check
for
pointer
xor
eax,
eax
.endif
pOldAddr
mov
dwDllFound,
dwFunctionFound,
Initialize
GetModuleHandle,
Get
main
module'
s
base
address
hModule,
Copy
it
into
hModule
edi,
assume
edi:
ptr
IMAGE_DOS_HEADER
Make
edi
act
as
struct
Return
[edi].e_magic
!
=
IMAGE_DOS_SIGNATURE
0x4D
0x5A
(MZ)
add
[edi].e_lfanew
pNtHeader
(IMAGE_NT_HEADERS*)((DWORD)pDosHeader
+
(DWORD)pDosHeader->
e_lfanew);
IMAGE_NT_HEADERS
[edi].Signature
IMAGE_NT_SIGNATURE
If
it'
an
invalid
NT
header
0x50
0x45
0x00
(PE\0\0)
edx,
[edi].OptionalHeader.DataDirectory[sizeof
IMAGE_DATA_DIRECTORY].VirtualAddress
dwVirtualAddr,
edx
VirtualAddress
dwVirtualAddr
Invalid
virtual
pImportHeader
(IMAGE_IMPORT_DESCRIPTOR*)((DWORD)pDosHeader
dwVirtualAddr);
IMAGE_IMPORT_DESCRIPTOR
IMAGE_IMPORT_DESCRIPT