首页
社区
课程
招聘
[求助]特殊的HOOK问题
发表于: 2011-5-22 16:12 6817

[求助]特殊的HOOK问题

2011-5-22 16:12
6817
这样的,我的hook希望非常早的hook一些api函数,主要是想抢在一些crt初始化之前,比如crt里有些全局类实例的前面,比如我要hook NtOpenFile,我们一般就是写代码在main函数里开始hook的安装,但这个时机已经太晚了,当然写一个全局类 然后在这个类的构造函数里做hook安装也不可以,因为C++编译器不保证全局变量的构造函数的调用顺序。
所以就是想用 两个进程的方式完成hook,一个是launcher进程,另一个是被hook进程,launcher 使用 CreateProcess 带上 CREATE_SUSPENDED 这个flag参数用挂起方式启动需要hook的进程,然后通过writeprocessmemroy这个api来完成hook,也就是说要hook的进程只要把hook函数写好,让launcher来完成这个hook,然后再用ResumeThread来恢复已经hook好的进程。注意两个进程都是自己写的,代码都受自己控制。
但是现在问题来了,我要在需要hook的进程里写hook函数(也就是用来替换目标函数的函数)比如
我写个
NTSTATUS NewNtOpenFile(PHANDLE FileHandle,
    ACCESS_MASK DesiredAccess,
     POBJECT_ATTRIBUTES ObjectAttributes,
   PIO_STATUS_BLOCK IoStatusBlock,
    ULONG ShareAccess,
     ULONG OpenOptions)
{
   1  做一些自己事情

   2  调用原始的函数并返回
}
不管是inline hook 还是 导入表方式hook 这些倒不是问题,
问题就是我怎么在launcher进程里知道 NewNtOpenFile 这个函数的位置呢,请大牛指点,
另外这个hook只是自己的一个想法,如果有更简单的方法请告知谢谢各位

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
TLS回调够早吧
2011-5-22 19:39
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
你可以把NewNtOpenFile导出~exe也可以导出函数啊
2011-5-22 21:31
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
tls回调确实是一个比较早的机会,但是仍然不能满足我,我刚才调试了一下,发现在调用这个tls callback的时候已经加载了很多dll了,而使用挂起创建方式,在安装hook的时候,那个进程大概只加载了一两个dll

C++代码如下,也可能是这个写法还需要改进,总之谢谢你

VOID NTAPI MyCallback(PVOID handle, DWORD reason, PVOID resv)
{
       
        // 安装hook
       
}

#ifdef _MSC_VER
#pragma comment(linker, "/INCLUDE:__tls_used")
#pragma comment(linker, "/INCLUDE:_tls_entry")
#pragma data_seg(".CRT$XLB" )

extern "C" PIMAGE_TLS_CALLBACK tls_entry = MyCallback;
#endif
2011-5-22 21:56
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
额,这个方法我倒是没有想到哈哈,多谢了
2011-5-22 21:57
0
雪    币: 538
活跃值: (269)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
呃 还有一种笨办法就是直接用OD找这个函数的地址(在编译的时候生成map文件就能看到函数名了) 如果你这个函数是在EXE中的 代码一般不会重定位的 直接在你的launcher里面硬编码这个地址就行了
2011-5-23 11:24
0
雪    币: 111
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
你的方法在Detour中可以看到明确的代码
2011-5-23 11:35
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
同意7楼

Detour中采用了修改Import Table (注意不是IAT),这样就可以将你的DLL作为第一个加载的DLL load起来(当然,你的DLL所依赖的DLL会被更早的加载)。
如果你的DLL只依赖于kernel32和ntdll,基本上就是第一个了(考虑到ntdll和kernel32实际上已经存在了)。

所以还是看看Detour,调一下会更有感觉。
2011-5-23 14:09
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢7楼和8楼两位朋友,我去看看detour的代码,以前还用过detour这个库,可是之前都是只求能用没有看过detour里的实现代码,惭愧。。。
2011-5-23 17:34
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
launcher 不需要知道newxxx的地址,launcher 加载hook dll, hook dll 自己管理即可
2011-5-23 20:54
0
游客
登录 | 注册 方可回帖
返回
//