一種調(diào)用dll未知導(dǎo)出函數(shù)的方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)網(wǎng)絡(luò)安全領(lǐng)域,特別涉及一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法及系統(tǒng)。
【背景技術(shù)】
[0002]現(xiàn)有的軟件中,絕大部分的應(yīng)用軟件都不是由一個(gè)單獨(dú)的可執(zhí)行文件組成,而是需要調(diào)用由別的軟件模塊提供的各種功能,對(duì)于Windows下的軟件主要是由DLL(即動(dòng)態(tài)鏈接庫)來完成這一功能,而DLL則主要是通過導(dǎo)出函數(shù)來提供相應(yīng)的功能。現(xiàn)在也有很多的惡意軟件將一些核心的功能封裝在DLL中,通過各種技術(shù)實(shí)現(xiàn)隱藏自身的目的。我們?cè)趧?dòng)態(tài)檢測(cè)惡意軟件的時(shí)候,通常是在一個(gè)虛擬機(jī)環(huán)境中將它運(yùn)行起來,然后對(duì)整個(gè)系統(tǒng)及網(wǎng)絡(luò)進(jìn)行監(jiān)控,而DLL是不能獨(dú)立運(yùn)行的。一般使用DLL的導(dǎo)出函數(shù)時(shí)需要知道其函數(shù)聲明,例如動(dòng)態(tài)調(diào)用DLL導(dǎo)出函數(shù)的方法一般為:首先用typedef為目標(biāo)函數(shù)定義函數(shù)指針類型,然后用GetProcAddress來獲取函數(shù)指針,最后用函數(shù)指針進(jìn)行調(diào)用。那么在不知道導(dǎo)出函數(shù)的函數(shù)聲明時(shí),像Visual Stud1中自帶的Dependency Walker等工具都可以查看DLL中的導(dǎo)出函數(shù),但是仍然無法知道函數(shù)的參數(shù),要進(jìn)一步了解各函數(shù)的參數(shù),需要用到調(diào)試器以及一定的匯編知識(shí)才可能一步步的了弄清楚導(dǎo)出函數(shù)的參數(shù),這對(duì)于人工來說尚屬于比較復(fù)雜的過程,要想實(shí)現(xiàn)自動(dòng)化就更加困難。
【發(fā)明內(nèi)容】
[0003]基于上述問題,本發(fā)明提出了一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法,該方法能夠通用使用,解決了未知函數(shù)參數(shù)未知,無法進(jìn)行調(diào)用的問題。
[0004]—種調(diào)用DLL未知導(dǎo)出函數(shù)的方法,包括:
加載DLL文件到內(nèi)存;
解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;
加載預(yù)設(shè)的函數(shù)參數(shù)集合;
采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。
[0005]所述的方法中,采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)具體為: 分配地址空間;
保存寄存器,并壓入10個(gè)堆;
調(diào)用導(dǎo)出函數(shù);
還原寄存器。
[0006]—種調(diào)用DLL未知導(dǎo)出函數(shù)的系統(tǒng),包括:
文件加載模塊,用于加載DLL文件到內(nèi)存;
解析模塊,用于解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;
參數(shù)加載模塊,用于加載預(yù)設(shè)的函數(shù)參數(shù)集合;
函數(shù)調(diào)用模塊,用于采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。
[0007]所述的系統(tǒng)中,采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)具體為: 分配地址空間;
保存寄存器,并壓入10個(gè)堆;
調(diào)用導(dǎo)出函數(shù);
還原寄存器。
[0008]本發(fā)明主要是基于在惡意代碼的動(dòng)態(tài)檢測(cè)方面,并不需要非常精確的去使用這些DLL的導(dǎo)出函數(shù),而只是想知道這些函數(shù)的功能,及其作用,因此只是需要一種通用的調(diào)用方式,將這些導(dǎo)出函數(shù)正常調(diào)用,激發(fā)出其功能就可以。本發(fā)明的原理是動(dòng)態(tài)構(gòu)造堆棧,比較通用,而且易于程序?qū)崿F(xiàn)。
[0009]本發(fā)明的優(yōu)勢(shì)在于結(jié)合惡意代碼動(dòng)態(tài)檢測(cè)系統(tǒng),能夠更多的調(diào)用DLL的導(dǎo)出函數(shù),從而激發(fā)出更多的行為,最終達(dá)到更加全面準(zhǔn)確的檢測(cè)。在未使用此方法時(shí),只能正常調(diào)用DLL的服務(wù)函數(shù)ServiceMain,而其他導(dǎo)出函數(shù)基本無法正常調(diào)用,所以大部分的DLL行為無法激發(fā)出來,導(dǎo)致DLL檢測(cè)效果不理想,使用本發(fā)明中的方法,將能夠大大提高對(duì)DLL的檢測(cè)效果。
[0010]本發(fā)明提供了一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法及系統(tǒng),包括:加載DLL文件到內(nèi)存;解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;加載預(yù)設(shè)的函數(shù)參數(shù)集合;采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。本發(fā)明利用動(dòng)態(tài)構(gòu)造堆棧的方式,給出充足的參數(shù)供導(dǎo)出函數(shù)使用,從而調(diào)用所有的導(dǎo)出函數(shù)。
【附圖說明】
[0011]為了更清楚地說明本發(fā)明或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0012]圖1為本發(fā)明一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法實(shí)施例流程圖;
圖2為本發(fā)明一種調(diào)用DLL未知導(dǎo)出函數(shù)的系統(tǒng)實(shí)施例結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0013]為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明實(shí)施例中的技術(shù)方案,并使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖對(duì)本發(fā)明中技術(shù)方案作進(jìn)一步詳細(xì)的說明。
[0014]本發(fā)明提出了一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法,該方法能夠通用使用,解決了未知函數(shù)參數(shù)未知,無法進(jìn)行調(diào)用的問題。
[0015]—種調(diào)用DLL未知導(dǎo)出函數(shù)的方法,如圖1所示,包括:
5101:加載DLL文件到內(nèi)存;
5102:解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;如導(dǎo)出函數(shù)的個(gè)數(shù)及各函數(shù)的地址等;
5103:加載預(yù)設(shè)的函數(shù)參數(shù)集合;
5104:采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。
[0016]所述的方法中,采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)具體為: 分配地址空間;
保存寄存器,并壓入10個(gè)堆;
調(diào)用導(dǎo)出函數(shù);
還原寄存器。
[0017]采用動(dòng)態(tài)構(gòu)造堆棧的方式給出足夠的通用的函數(shù)棧,準(zhǔn)備充足的參數(shù)來供導(dǎo)出函數(shù)使用,從而逐個(gè)調(diào)用各個(gè)導(dǎo)出函數(shù),激發(fā)出更多的行為,達(dá)到更全面準(zhǔn)確的檢測(cè)。
[0018]—種調(diào)用DLL未知導(dǎo)出函數(shù)的系統(tǒng),如圖2所示,包括:
文件加載模塊201,用于加載DLL文件到內(nèi)存;
解析模塊202,用于解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;
參數(shù)加載模塊203,用于加載預(yù)設(shè)的函數(shù)參數(shù)集合;
函數(shù)調(diào)用模塊204,用于采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。
[0019]所述的系統(tǒng)中,采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)具體為: 分配地址空間;
保存寄存器,并壓入10個(gè)堆;
調(diào)用導(dǎo)出函數(shù);
還原寄存器。
[0020]本發(fā)明主要是基于在惡意代碼的動(dòng)態(tài)檢測(cè)方面,并不需要非常精確的去使用這些DLL的導(dǎo)出函數(shù),而只是想知道這些函數(shù)的功能,及其作用,因此只是需要一種通用的調(diào)用方式,將這些導(dǎo)出函數(shù)正常調(diào)用,激發(fā)出其功能就可以。本發(fā)明的原理是動(dòng)態(tài)構(gòu)造堆棧,比較通用,而且易于程序?qū)崿F(xiàn)。
[0021]本發(fā)明的優(yōu)勢(shì)在于結(jié)合惡意代碼動(dòng)態(tài)檢測(cè)系統(tǒng),能夠更多的調(diào)用DLL的導(dǎo)出函數(shù),從而激發(fā)出更多的行為,最終達(dá)到更加全面準(zhǔn)確的檢測(cè)。在未使用此方法時(shí),只能正常調(diào)用DLL的服務(wù)函數(shù)ServiceMain,而其他導(dǎo)出函數(shù)基本無法正常調(diào)用,所以大部分的DLL行為無法激發(fā)出來,導(dǎo)致DLL檢測(cè)效果不理想,使用本發(fā)明中的方法,將能夠大大提高對(duì)DLL的檢測(cè)效果。
[0022]本發(fā)明提供了一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法及系統(tǒng),包括:加載DLL文件到內(nèi)存;解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;加載預(yù)設(shè)的函數(shù)參數(shù)集合;采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。本發(fā)明利用動(dòng)態(tài)構(gòu)造堆棧的方式,給出充足的參數(shù)供導(dǎo)出函數(shù)使用,從而調(diào)用所有的導(dǎo)出函數(shù)。
[0023]通過以上的實(shí)施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件平臺(tái)的方式來實(shí)現(xiàn)?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在存儲(chǔ)介質(zhì)中,如R0M/RAM、磁碟、光盤等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。
[0024]本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見即可,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
[0025]本發(fā)明可用于眾多通用或?qū)S玫挠?jì)算系統(tǒng)環(huán)境或配置中。例如:個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。
[0026]本發(fā)明可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本發(fā)明,在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。
[0027]雖然通過實(shí)施例描繪了本發(fā)明,本領(lǐng)域普通技術(shù)人員知道,本發(fā)明有許多變形和變化而不脫離本發(fā)明的精神,希望所附的權(quán)利要求包括這些變形和變化而不脫離本發(fā)明的精神。
【主權(quán)項(xiàng)】
1.一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法,其特征在于,包括: 加載DLL文件到內(nèi)存; 解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息; 加載預(yù)設(shè)的函數(shù)參數(shù)集合; 采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。2.如權(quán)利要求1所述的方法,其特征在于,采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)具體為: 分配地址空間; 保存寄存器,并壓入10個(gè)堆; 調(diào)用導(dǎo)出函數(shù); 還原寄存器。3.一種調(diào)用DLL未知導(dǎo)出函數(shù)的系統(tǒng),其特征在于,包括: 文件加載模塊,用于加載DLL文件到內(nèi)存; 解析模塊,用于解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息; 參數(shù)加載模塊,用于加載預(yù)設(shè)的函數(shù)參數(shù)集合; 函數(shù)調(diào)用模塊,用于采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。4.如權(quán)利要求3所述的系統(tǒng),其特征在于,采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)具體為: 分配地址空間; 保存寄存器,并壓入10個(gè)堆; 調(diào)用導(dǎo)出函數(shù); 還原寄存器。
【專利摘要】本發(fā)明提供了一種調(diào)用DLL未知導(dǎo)出函數(shù)的方法及系統(tǒng),包括:加載DLL文件到內(nèi)存;解析PE文件結(jié)構(gòu),獲得DLL文件的導(dǎo)出函數(shù)信息;加載預(yù)設(shè)的函數(shù)參數(shù)集合;采用動(dòng)態(tài)構(gòu)造堆棧的方式,逐一調(diào)用DLL的導(dǎo)出函數(shù)。本發(fā)明利用動(dòng)態(tài)構(gòu)造堆棧的方式,給出充足的參數(shù)供導(dǎo)出函數(shù)使用,從而調(diào)用所有的導(dǎo)出函數(shù)。
【IPC分類】G06F9/44
【公開號(hào)】CN105487849
【申請(qǐng)?zhí)枴緾N201410801308
【發(fā)明人】周龍, 康學(xué)斌, 肖新光
【申請(qǐng)人】哈爾濱安天科技股份有限公司
【公開日】2016年4月13日
【申請(qǐng)日】2014年12月22日