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