(27)TLB番外篇——ShadowWalker
生活随笔
收集整理的這篇文章主要介紹了
(27)TLB番外篇——ShadowWalker
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、全代碼校驗、CRC檢測
很多程序會對自己的代碼做CRC檢測,當有人修改了代碼,就會被CRC檢測線程發現。下面我編寫一個小程序演示這個操作:
我的代碼沒有真的用CRC,我只是將函數代碼所在的頁拷貝了一份,然后用一個線程不停地 memcmp,效果和CRC是類似的。
// GameWithCRC.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Windows.h> #include <time.h>void attack() {srand(time(0));while (1){int damage = rand() % 1000;printf("attack(%p): 造成了 %4d 點傷害.\n", attack, damage);Sleep(1000);} }// 代碼拷貝 BYTE record[0x1000];// 檢測代碼是否被修改 DWORD WINAPI CheckModify() {while (1){if (memcmp(record, attack, 0x1000) != 0){printf("有壞人HOOK了attack函數!!!\n");}Sleep(1000);}return 0; }int _tmain(int argc, _TCHAR* argv[]) {memcpy(record, (LPVOID)attack, 0x1000);CreateThread(0,0,(LPTHREAD_START_ROUTINE)CheckModify,0,0,0);attack();return 0; }當我試圖在函數內下斷點的時候,就會被校驗線程發現:
二、ShadowWalker 簡介
這篇博客是中級課程的番外,學習TLB時,老師提到了一種利用TLB機制實現內存隱藏的方式——ShadowWalker。這種技術利用了TLB會緩存線性地址到物理地址映射的特性,當CRC線程檢查某段代碼時,它使用的線性地址會緩存到TLB的數據頁表緩存(Data-TLB)中。而當EIP運行到這段代碼時,又會把代碼的線性地址緩存到TLB的指令頁表緩存(Instruction-TLB)中。這樣CPU中就緩存了同一個地址的兩份記錄,CRC線程從數據頁表緩存中讀取物理地址,EIP執行流從指令頁表緩存中讀取物理地址,這兩個物理地址是相同的。
ShadowWalker技術的核心就在于修改指令頁表緩存中的物理地址,讓CRC線程讀取原來的代碼,而程序真正執行的時候則跳轉到其他代碼。
這種方式在3環是不穩定的,原因是TLB經常刷新。
總結
以上是生活随笔為你收集整理的(27)TLB番外篇——ShadowWalker的全部內容,希望文章能夠幫你解決所遇到的問題。