InfinityHook 實踐紀錄武俠版

在我折騰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。