学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题

[转载图文] InfinityHook 实践纪录

发表于 2022-11-17 10:29:06 | 查看: 1138| 回复: 0
网上资料1:
在我折腾InfinityHook的时候我发现2004下系统没啥作用,原因是在2004系统上 WMI_LOGGER_CONTEXT->GetCpuClock已经不是rdtsc()函数了而是一个叫做 EtwpGetLoggerTimeStamp的函数

那我们试探下直接拉它看

InfinityHook 实践纪录

InfinityHook 实践纪录

网上资料:EtwpGetLoggerTimeStamp函数按照WMI_LOGGER_CONTEXT->GetCpuClock的值有如下操作:
大于3抛异常
等于3用rdtsc
////等于2用off_140C00A30 这里是140C01e00
等于1用KeQueryPerformanceCounter
等于0用RtlGetSystemTimePrecise
3,1,0都好说,但是这个2的off_140C00A30 这里是140C01E00

看交叉引用

InfinityHook 实践纪录

InfinityHook 实践纪录

放大看

InfinityHook 实践纪录

InfinityHook 实践纪录

他是一个在data上,指向HalpTimerQueryHostPerformanceCounter的指针
请看下图

InfinityHook 实践纪录

InfinityHook 实践纪录

请看下图

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

追本溯源大概梳理下:
来源是这里写

InfinityHook 实践纪录

InfinityHook 实践纪录

w 写入交叉引用,指出了修改变量内容的程序位置

InfinityHook 实践纪录

InfinityHook 实践纪录

这是来源
lea rax lpTimerQueryHostPerformanceCounter
mov qword ptr cs:off_140c01e00,rax
这是出接口
((ULONG64)PtrOff140c01e00) = (ULONG64)HookHalpTimerQueryHostPerformanceCounter;

总结是缘起缘灭

思路整理下:

reinterpret_cast<uintptr_t>((uintptr_t)CkclWmiLoggerContext + OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 2;

这不就来了么
lea rax lpTimerQueryHostPerformanceCounter
mov qword ptr cs:off_140c01e00,hk函数

这是出接口
((ULONG64)hk函数) = (ULONG64)HalpTimerQueryHostPerformanceCounter;

总结移魂大法
资料二:
再次伟大!

重操旧业再换个路也能到北京,条条大路通北京。
这两个指针其实就是得到系统时间..而且是唯一在HalpTimerQueryHostPerformanceCounter用到的指针…
如果之前的off_140C00A30是被PG监控的,这两个指针会不会被监控呢?能不能利用呢?
此外不仅这个off_140C00A30函数,还有几个在ETW上必call的函数指针,这些指针有没有被监控呢?
让我们跟踪这个HalpTimerQueryHostPerformanceCounter上的两个函数:

在HalpTimerQueryHostPerformanceCounter中,往下看:

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

InfinityHook 实践纪录

微软在栈上初始化了一个数组,然后依次给这个数组赋值,根据赋值的信息,我们可以逆向推导出函数名字:
HalpTimerInitSystem 140c61f80

InfinityHook 实践纪录

InfinityHook 实践纪录

第三个箭头在48的数组上没有截图到(就是追的数据其中之一)

InfinityHook 实践纪录

InfinityHook 实践纪录

划重点:
微软在栈上初始化了一个数组,然后依次给这个数组赋值,根据赋值的信息,我们可以逆向推导出函数名字:
微软在栈上初始化了一个数组,然后依次给这个数组赋值,根据赋值的信息,我们可以逆向推导出函数名字:
微软在栈上初始化了一个数组,然后依次给这个数组赋值,根据赋值的信息,我们可以逆向推导出函数名字:
人家的有函数名字,上面的不知道怎么搞有大佬叫我具体搞得么?修复函数我直接重命名

InfinityHook 实践纪录

InfinityHook 实践纪录

不会搞 无法重塑 就来个原图 这个代码写的够烂的)

InfinityHook 实践纪录

InfinityHook 实践纪录

从而得知如下信息:

InfinityHook 实践纪录

InfinityHook 实践纪录

就从这个HvlGetQpcBias下手:

InfinityHook 实践纪录

InfinityHook 实践纪录

他会查询一个HvlpReferenceTscPage表,我们手动定位:

InfinityHook 实践纪录

InfinityHook 实践纪录

mov cs:HvlpReferenceTscPage,rdi
替换这个表地址
mov cs:HvlpReferenceTscPage,函数地址

移魂大法走起

发现都是在出接口 hook

说白了就是绝世武功的练成,天下无敌!哈哈
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-5-3 00:21 , Processed in 0.101284 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表