首页
社区
课程
招聘
[讨论]InfinityHook在19041小版本间的兼容性问题
2020-7-27 13:28 19051

[讨论]InfinityHook在19041小版本间的兼容性问题

2020-7-27 13:28
19051

本文参考:

剖析InfinityHook原理 掀起一场更激烈的攻与防恶战

Windows 10 19041版本的无限挂钩原理

Github项目InfinityHook

Github项目infhook19041


尝试过程:

为了技术储备,尝试在19041上进行稳定的InfinityHook


Windows19041 更新到最近的小版本 10.0.19041.388,下载对应的符号文件


直接编译大佬的项目Github项目infhook19041,运行,蓝屏,

调试发现 

在没有获取到函数 KeQueryPerformanceCounter 中 mov rdi, cs:HalpPerformanceCounter 地址的情况下

访问了地址+3的位置去获取变量HalpPerformanceCounter所在的偏移


IDA 加上符号文件


简单修改了查找的特征码


再次编译,没有蓝屏,但是Hook没有生效

继续调试

发现是在被替换了的 keQueryPerformanceCounter 中,在栈中查找存储系统调用的地址,之前的偏移已经无效



最终效果:


Github项目infhook19041,这份代码大佬可能只是用来测试,所以卸载的不完整,系统不重启的情况下,停止再重启驱动后,获取到的 circularKernelContextLogger 的值为1,而本应该获取到circularKernelContextLogger的地址。


简单修改代码

声明一个变量来保存 GetCpuClock 的索引值,在将WMI_LOGGER_CONTEXT的GetCpuClock成员设置为1前,保存

std::uintptr_t OriginalGetCpuClock		   {};/* 原GetCpuClock的索引值 */ 
OriginalGetCpuClock = *reinterpret_cast<std::uint64_t*>(circularKernelContextLogger + Offsets::wmiGetCpuClock);

在卸载驱动时,还原 GetCpuClock

bool UnhookSystemCall() {

	if (halpPerformanceCounter && halCounterQueryRoutine) {
		*reinterpret_cast<std::uintptr_t*>(halpPerformanceCounter + Offsets::counterQueryRoutine) = halCounterQueryRoutine;
		return true;
	}

	*reinterpret_cast<std::uint64_t*>(circularKernelContextLogger + Offsets::wmiGetCpuClock) = OriginalGetCpuClock;
	
	if (!NT_SUCCESS(modifyCKCL(EtwStopLoggerCode, EVENT_TRACE_FLAG_SYSTEMCALL))) {
		return false;
	}

	return false;
}


还发现了另外一个小问题,在事件跟踪控制中,ExAllocatePool 申请的内存,没有释放,简单改了下代码

NTSTATUS modifyCKCL(ETWTRACECONTROLCODE functionCode, std::uint32_t enableFlags) {
	PCKCL_TRACE_PROPERTIES properties = reinterpret_cast<PCKCL_TRACE_PROPERTIES>(ExAllocatePool(NonPagedPool, PAGE_SIZE));
	if (!properties)
		return STATUS_INSUFFICIENT_RESOURCES;

	memset(properties, 0, PAGE_SIZE);

	properties->Wnode.BufferSize    = PAGE_SIZE;
	properties->Wnode.Guid          = {0x54DEA73A, 0xED1F, 0x42A4, {0xAF, 0x71, 0x3E, 0x63, 0xD0, 0x56, 0xF1, 0x74}};
	properties->Wnode.ClientContext = 0x1;
	properties->Wnode.Flags         = 0x20000;
	properties->BufferSize          = sizeof(std::uint32_t);
	properties->MinimumBuffers      = 2;
	properties->MaximumBuffers      = 2;
	properties->LogFileMode         = 0x400;
	properties->EnableFlags         = enableFlags;
	properties->ProviderName        = RTL_CONSTANT_STRING(L"Circular Kernel Context Logger");

	std::uint32_t returnSize {};

	NTSTATUS Status = ZwTraceControl(functionCode, properties, PAGE_SIZE, properties, PAGE_SIZE, reinterpret_cast<PULONG>(&returnSize));
	ExFreePool(properties);
	return Status;
}


小版本之间的兼容问题

存储系统调用的栈地址,我们可以通过遍历栈,替换所有储存了系统调用函数指针的地址。


halpPerformanceCounter可以通过加载符号文件,获取符号信息;

但是符号文件以国内的网络很多时候都会下载失败,除非我们提前下载好所有版本的符号文件,但是这样一来只能向前兼容,不能向后兼容。


看雪的大佬们,有什么好的解决方法?


附件:

1.   版本 10.0.19041.388 的 ntoskrnl.exe 与其符号文件

2.   修改后Infinityhook



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2020-7-27 18:06 被随风行编辑 ,原因: 新增了发现的问题
上传的附件:
收藏
点赞5
打赏
分享
最新回复 (21)
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2020-7-27 13:52
2
0

ntos正式的一共也没几个版本,特征码挨个搜集全了不就完事了


https://github.com/wbaby/ntoskrnl

最后于 2020-7-27 13:56 被hzqst编辑 ,原因:
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-27 14:46
3
0
hzqst ntos正式的一共也没几个版本,特征码挨个搜集全了不就完事了https://github.com/wbaby/ntoskrnl
网址我收藏了
不过短短半年15个小版本,微软更新的有点疯狂啊
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
blindtiger 1 2020-7-27 14:53
4
0
逐渐玩上统计学
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-27 15:10
5
0
小艾 逐渐玩上统计学
好好的逆向做成了体力活
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2020-7-27 15:58
6
0
随风行 网址我收藏了[em_13] 不过短短半年15个小版本,微软更新的有点疯狂啊[em_85]
目前版本号大于19041的都是预览版,用预览版的用户叫他滚蛋就完事了
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-27 17:28
7
0
hzqst 目前版本号大于19041的都是预览版,用预览版的用户叫他滚蛋就完事了
用户滚蛋,领导可是上帝
我也就是先做个简单的技术积累,产品真要上新系统,那得找个稳定的hook方式了
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-27 18:08
8
0
我更新了附加代码  Infinityhook.zip 
修复了 卸载后重新加载失败的问题
修复了 没有释放的内存的问题
我不知道下午谁都下载了我的代码,只能在留言做个通知了
雪    币: 212
活跃值: (560)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
YamingW 2020-7-27 20:47
9
0
下载学习
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwCopyAll 2020-7-28 12:19
10
0
你是做什么职业的 公司让你做这个吗
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-28 13:28
11
0
ZwCopyAll 你是做什么职业的 公司让你做这个吗
看雪不都是逆向驱动开发么
你问的话很奇怪哎
雪    币: 273
活跃值: (272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niceli 2020-7-28 22:36
12
0
最新预览版 会修复这个 不过改改又能用了
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-29 09:45
13
0
niceli 最新预览版 会修复这个 不过改改又能用了
微软已经盯上InfinityHook了
雪    币: 405
活跃值: (1900)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wowocock 1 2020-7-29 11:21
14
0
其实要废掉这个很容易,就看微软想不想干了,否则也就是各种特征码搜索的体力活而已。
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2020-7-29 13:39
15
0
wowocock 其实要废掉这个很容易,就看微软想不想干了,否则也就是各种特征码搜索的体力活而已。
从最近几个版本对ETW的改动就可以看出,微软一直想补上这个洞。
但我觉得 堵不如疏,
生命会自己寻找出路,逆向会自己挖洞
雪    币: 1367
活跃值: (2121)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
危楼高百尺 1 2021-7-23 11:01
16
0

感觉halpPerformanceCounter的特征码挺稳定的啊

19041.1110

19042.928

19043.1052

在搜内存的时候这么写不就可以了

halpPerformanceCounter = Scanner::scanPattern(reinterpret_cast<std::uint8_t*>(keQueryPerformanceCounter), 0x100, "\x48\x8B\x3D", "xxx");

雪    币: 8
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_x_931870 2021-10-27 11:26
17
0

请问一下走到这一行就蓝屏事为啥?

还有这个值是怎么找到的呢?

雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2021-11-5 16:39
18
0
wx_x_931870 请问一下走到这一行就蓝屏事为啥?还有这个值是怎么找到的呢?
蓝屏报了什么错误码?
在栈中找到数个相符的地址,挨个替换尝试
雪    币: 0
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
编程与少年 2022-4-12 12:42
20
0
代码不完善,脱钩,失效。
雪    币: 1595
活跃值: (2807)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
随风行 1 2022-4-14 17:56
21
0
编程与少年 代码不完善,脱钩,失效。
隔了两年,win11都出了,不失效就见鬼了
雪    币: 1517
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小希希 2022-4-20 09:39
22
0
hzqst ntos正式的一共也没几个版本,特征码挨个搜集全了不就完事了https://github.com/wbaby/ntoskrnl
感谢分享
游客
登录 | 注册 方可回帖
返回