InfinityHook 实践纪录武侠版

VSole2022-12-12 10:40:52

在我折腾InfinityHook的时候我发现2004下系统没啥作用,原因是在2004系统上 WMI_LOGGER_CONTEXT->GetCpuClock已经不是rdtsc()函数了,而是一个叫做 EtwpGetLoggerTimeStamp的函数。

那我们试探下直接拉它看。

网上资料:EtwpGetLoggerTimeStamp函数按照WMI_LOGGER_CONTEXT->GetCpuClock的值有如下操作:

大于3抛异常

等于3用rdtsc

////等于2用off_140C00A30 这里是140C01e00

等于1用KeQueryPerformanceCounter

等于0用RtlGetSystemTimePrecise

3,1,0都好说,但是这个2的off_140C00A30 这里是140C01E00。

看交叉引用。

放大看:

他是一个在data上,指向HalpTimerQueryHostPerformanceCounter的指针。

请看下图:

请看下图:

追本溯源大概梳理下:

来源是这里写

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

这是来源

lea rax lpTimerQueryHostPerformanceCounter

mov qword ptr cs:off_140c01e00,rax

这是出接口

((ULONG64)PtrOff140c01e00) = (ULONG64)HookHalpTimerQueryHostPerformanceCounter;

总结是缘起缘灭。

思路整理下:

reinterpret_cast((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中,往下看:

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

HalpTimerInitSystem 140c61f80

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

划重点:

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

人家的有函数名字,上面的不知道怎么搞,希望有大佬能具体教一下。修复函数我直接重命名。

不会搞,无法重塑,就来个原图。

从而得知如下信息:

就从这个HvlGetQpcBias下手:

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

mov cs:HvlpReferenceTscPage,rdi

替换这个表地址

mov cs:HvlpReferenceTscPage,函数地址

移魂大法走起。

发现都是在出接口 hook。

指针赋值
本作品采用《CC 协议》,转载必须注明作者和本文链接
判断父进程是否存在,不存在则退出,否则,调用PspCreateProcess。判断创建标志是否包含除DEBUG_PROCESSDEBUG_ONLY_THIS_PROCESS,CREATE_SUSPENDED之外其它标志, 如果包含其他的标志,则报错退出。该函数会调用SeSubProcessToken函数来设置新进程对象的令牌对象。
网上关于ShellCode编写的文章很多,但介绍如何在ShellCode里面使用异常处理的却很少。Windows程序的异常处理,其实是三者结合的:操作系统、编译器和程序代码。因为x86下异常处理的文章太多,所以本文只介绍Win64下的。而Win64的异常处理,是基于表的。也就是说,编译器在编译代码的时候,会同时对每个函数生成一个异常表,最后链接到PE的异常表里。相对来说,这个比X86更加安全和高效。
因此参考了《黑客免杀攻防》中的代码对DLL型壳编写的结构进行了一次归纳整理,并附上相应代码解析。
文中使用的示例代码可以从 这里 获取。的功能是在终端打印出hello这6个字符(包括结尾的?编译它们分别生成libtest.so和?存在严重的内存泄露问题,每调用一次say_hello函数,就会泄露1024字节的内存。
安装app后打开,点击验证提示我们flag格式错误,请重试。红色图部分为源码目录,也就是dex文件反编译后的源码。R文件存储了资源相关的id,比如图片资源,按钮,文字等信息都存储在这个R文件里。在需要使用时就用R.xxx.xxx调用即可。
假如想在x86平台运行arm程序,称arm为source ISA, 而x86为target ISA, 在虚拟化的角度来说arm就是Guest, x86为Host。这种问题被称为Code-Discovery Problem。每个体系结构对应的helper函数在target/xxx/helper.h头文件中定义。
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的shell反弹到我们的机器上,下面来介绍分析几种常用的方法。
控制流劫持攻击是当前较为主流的攻击方式之一,包括ROP、JOP等等。
VSole
网络安全专家