今天終于完成了往 vista 內所有 ring 3 進程的注入. 包括 csrss.exe 進程.
主要的中心思想就是,
1. 提升本進程訪問令牌, 使其有調試權限.
2. 獲得本進程的當前線程的內核對象的安全描述符, 將其復制出來備用.
3. 準備遠程線程的執行代碼以及執行參數. 其中包括 loadlibrarya 和 RtlExitUserThread 調用, 例子嘛, 本來前一篇文章里有, 再次貼在這里方便各位看官.
#define LoadLibraryA_ADDR 0xDDDDDDDD
#define RtlExitUserThread_ADDR 0xEEEEEEEE
static __declspec(naked) DWORD WINAPI ThreadDummy(LPVOID lpParam)
{
__asm {
push dword ptr [esp+4] ; // 將傳進來的線程函數的參數壓棧
mov eax, LoadLibraryA_ADDR ; // LoadLibraryA 或 FreeLibrary 函數的地址
call eax ; // 調用 LoadLibraryA 函數
push eax ; // 將 RtlExitUserThread 函數的參數壓棧
mov eax, RtlExitUserThread_ADDR ; // RtlExitUserThread 函數的地址
call eax ; // 調用 RtlExitUserThread 函數
ret 4 ; // 返回
}
}
4. 以第 2 步獲取的安全描述符以及第 3 步準備的代碼和數據作為參數調用 RtlCreateUserThread 函數, 在目標進程創建遠線程. 等待執行完畢.
5. 清理第 2 步和第 3 步分配的內存. 整個過程完畢.
總結: 整個 dll injection 的探索開發歷時月余, 開始看似順利, 后期艱難困苦. 特別是那個超級變態要求: 必須注入到
csrss.exe 進程里去. 從普通的 SetWindowHookEx 和 known dll, 到 CreateRemoteThread,
最后到 NtCreateThread 以及 NtCreateThreadEx, 最后回歸到 RtlCreateUserThread 函數.
中間夾雜了 DPC, APC, 以及在內核修改 knowndlls\\kernel32.dll 可執行映像 inline hook
CreateThread 函數等等等等. 從應用層到內核, 再回歸應用層, 搞了個遍.
現在我可以牛逼哄哄的說一句了, Injection DLL? Just so so!!!
順便 BS 一下 Rising, 這個寶貝殺軟竟然直接 kill 掉了所有遠程線程函數, 不對用戶做任何通知和給用戶選擇的機會. 但我在內核修改任何可執行映像時, 這個寶貝卻愉快的告訴我, 我的系統很安全. 再次 BS 一下.
一個小小的測試程序, 在
這里下載
posted on 2008-06-20 11:24
free2000fly 閱讀(3262)
評論(11) 編輯 收藏 引用