Inline Hook NtQuery
DirectoryFile
首先声明这个是菜鸟—我的学习日记
,
不是什么高深文章
,
高手们慎看
.
都总是发一些已经过时的文章真不好意思
,
几个月以来沉迷于游戏也是时候反省了
,
我真的几个月没写博客了
,
怎么办
~
怎么办
~
我要补充自己的博客
,
但真想不到写什么了
,
唯有将自己以前写的一些
Demo
写上来
.
当初我其实是不会这样做的
,
看了一篇关于
”
怎么
inline hook NtDeviceIoControlFile
隐藏端口
”
的文章后有启发
,
于是自己试着用在隐藏文件这个函数上
,
忘记了这篇文章的出处
,
对作者深感抱歉
.
l
原理分析
inline hook
的原理相信已经为大家所知了
,
方法就有几种
.
1.
原函数入口
call
之前改无条件跳到自己函数
,
处理数据
,
然后原函数改回正常
,
调用原函数
,
再改回原函数入口
call
之前改无条件跳到自己函数
.(
这样做操作繁复
,
调用频繁可能出错
)
2.
就是我以下做的方法了
.
只要实现一次修改就可以了
.
3. ……..
还有更多的
.
nt!NtQueryDirectoryFile:
//
这个函数入口的原来样子
80574515 8bff
mov
edi,edi
80574517 55
push
ebp
80574518 8bec
mov
ebp,esp
8057451a
8d 452c
lea
eax,[ebp+2Ch]
8057451d 50
push
eax
8057451e 8d4528
lea
eax,[ebp+28h]
80574521 50
push
eax
80574522 8d4524
lea
eax,[ebp+24h]
80574525 50
push
eax
80574526 8d4520
lea
eax,[ebp+20h]
80574529 50
push
eax
8057452a
8d4530
lea
eax,[ebp+30h]
8057452d 50
push
eax
8057452e 6a 01
push
1
80574530 ff7530
push
dword ptr [ebp+30h]
80574533 ff 752c
push
dword ptr [ebp+2Ch]
80574536 ff7528
push
dword ptr [ebp+28h]
80574539 ff7524
push
dword ptr [ebp+24h]
8057453c
ff7520
push
dword ptr [ebp+20h]
8057453f
ff 751c
push
dword ptr [ebp+1Ch]
80574542 ff7518
push
dword ptr [ebp+18h]
80574545 ff7514
push
dword ptr [ebp+14h]
80574548 ff7510
push
dword ptr [ebp+10h]
8057454b ff 750c
push
dword ptr [ebp+0Ch]
8057454e ff7508
push
dword ptr [ebp+8]
80574551 e82bfdffff
call
nt!PsLookupProcessByProcessId+0x 3f 4 (80574281)
——————————————————————————————–
nt!NtQueryDirectoryFile:
//
这个函数入口修改后的样子
……
80574542 ff7518
push
dword ptr [ebp+18h]
80574545 ff7514
push
dword ptr [ebp+14h]
80574548 ea 1c 3224f 50800
jmp
0008:F 524321C
//
无条件跳自己的函数
,
其实这段可以写在
8057454b 90
nop
// call
前的任何地方
,
自己构建的函数要有
8057454e 90
nop
//
相应的改动而已
.
80574551 e82bfdffff
call
nt!PsLookupProcessByProcessId+0x 3f 4 (80574281)
——————————————————————————————–
__declspec
(
naked
) NTAPI
Detour_NtQueryDirectoryFile(
IN HANDLE
FileHandle,
IN HANDLE
Event
OPTIONAL,
IN PIO_APC_ROUTINE
ApcRoutine
OPTIONAL,
IN PVOID
ApcContext
OPTIONAL,
OUT PIO_STATUS_BLOCK
IoStatusBlock,
OUT PVOID
FileInformation,
IN ULONG
FileInformationLength,
IN FILE_INFORMATION_CLASS
FileInformationClass,
IN ULONG
ReturnSingleEntry,
IN PUNICODE_STRING
FileName
OPTIONAL,
IN ULONG
RestartScan)
{
__asm
//
恢复好堆栈先
{
add esp,40
mov esp,ebp
pop ebp
push ebp
mov ebp,esp
pushad