注入Winlogon進程示例代碼 - [編程學習]

      “Winlogon通知包(Winlogon Notification Package)”就是處理winlogon在切換狀態時發出的事件的DLL。你可以通過“Winlogon Notification Package”來監視winlogon事件的響應。你可以註冊這些DLL,那麼winlogon.exe會在啓動時加載它們,並且會在系統狀態切換時來調用註冊DLL的事件處理函數。當然這一點用來加載後門是在好不過了,因爲加載的後門存在於winlogon.exe的進程中,而winlogon.exe是系統進程,一般情況下是無法終止它的,況且殺死它會導致系統崩潰或重啓,沒人會這麼做。用“Winlogon Notification Package”來加載後門的又一個好處是——你的後門將運行在system權限下而不用註冊爲系統服務。

爲了註冊你的“Winlogon Notification Package”,必須在“HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Winlogon/Notify”下創建你的“notification package”子鍵。在我的系統中,存在6個子鍵,分別是:crypt32chain,cryptnet,cscdll,sclgntfy,SensLogn,termsrv。在“Notify”項下,可以根據需要創建如下鍵值:

Asynchronous[REG_DWORD]:表明是否異步處理winlogon事件,如設爲 1,winlogon將啓動一個新線程來處理。
DllName[REG_EXPAND_SZ]:指定要加載的DLL名。
Impersonate[REG_DWORD]:表明是否以登陸用戶的權限來處理事件。
Lock[REG_SZ]:鎖定桌面事件。
Logoff[REG_SZ]:註銷事件。
Logon[REG_SZ]:登陸事件。
Shutdown[REG_SZ]:關機事件。
StartScreenSaver[REG_SZ]:啓動屏保事件。
StartShell[REG_SZ]:啓動shell(一般指explorer.exe)事件。
Startup[REG_SZ]:系統開機事件。
StopScreenSaver[REG_SZ]:停止屏保事件。
Unlock[REG_SZ]:解除桌面鎖定事件。

其中每個事件對應DLL中的一個導出函數,即每當有事件發生時,winlogon.exe便調用相應的函數。譬如:DllName的值爲“test.dll”,Logoff的值爲“testlogoff”,那麼系統註銷時winlogon.exe將調用test.dll中導出的“testlogon”函數。

關於DLL的實現非常地簡單:只要導出處理事件是要調用的函數就行,其他和別的DLL無異。以下是代碼的簡單實現:

//----------------------------------Start of WNP.C-------------------------------------------
/*Create file exports.def with content:
EXPORTS
testlogoff
testlogon
*/
#include <windows.h>
#pragma comment(linker,"/export:test=_testlogoff@0")
#pragma comment(linker,"/export:test=_testlogon@0")
#pragma comment(linker,"/entry:DllEntry")
#pragma comment(linker,"/subsystem:windows")
#pragma comment(linker,"/align:4096")
#pragma comment(linker,"/dll")
#pragma comment(linker,"/base:1976369152")

__declspec(dllexport) void __stdcall testlogoff(DWORD unknow)
{
MessageBox(NULL,"系統正在註銷!","Winlogon Notification Package",MB_OK);
}

__declspec(dllexport) void __stdcall testlogon(DWORD unknow)
{
MessageBox(NULL,"系統正在登陸!","Winlogon Notification Package",MB_OK);
}

BOOL __stdcall DllEntry(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH:break;
}return TRUE;
}
//----------------------------------End of WNP.C---------------------------------------------

將編譯好的test.dll複製到系統文件夾,修改註冊表並重啓後,發現C:/WINNT/system32/test.dll已經成功加載到winlogon.exe進程中



原文地址:http://drag0n.blogbus.com/logs/40519401.html

發佈了44 篇原創文章 · 獲贊 4 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章