未導(dǎo)出的Native API函數(shù)獲取方法及裝置制造方法
【專(zhuān)利摘要】本發(fā)明公開(kāi)了一種未導(dǎo)出的Native?API函數(shù)獲取方法,屬于計(jì)算機(jī)【技術(shù)領(lǐng)域】。所述方法包括:獲取目標(biāo)Native?API函數(shù)所在的模塊代碼段的范圍;獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧;根據(jù)當(dāng)前棧獲取地址位于模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);在根據(jù)指針數(shù)據(jù)的地址檢測(cè)存在調(diào)用目標(biāo)Native?API函數(shù)的語(yǔ)句時(shí),獲取目標(biāo)Native?API函數(shù)。本發(fā)明通過(guò)目標(biāo)Native?API函數(shù)所在的模塊代碼段的范圍以及在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,獲取符合預(yù)定條件的指針數(shù)據(jù),根據(jù)指針數(shù)據(jù)獲取目標(biāo)Native?API函數(shù);達(dá)到了可以很大程度上提高搜索效率和搜索命中率的效果。
【專(zhuān)利說(shuō)明】未導(dǎo)出的Native API函數(shù)獲取方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)【技術(shù)領(lǐng)域】,特別涉及一種未導(dǎo)出的Native API函數(shù)獲取方法及裝置。
【背景技術(shù)】
[0002]隨著WINDOWS API (WINDOWS Application Programming Interface, WINDOWS 應(yīng)用程序編程接口)編程的廣泛普及和應(yīng)用,越來(lái)越多的應(yīng)用程序可以通過(guò)調(diào)用WINDOWS API函數(shù)來(lái)完成相應(yīng)的功能。
[0003]目前,應(yīng)用程序在實(shí)現(xiàn)具體功能時(shí),首先需要加載與功能相關(guān)的DLL(DynamicLink Library,動(dòng)態(tài)鏈接庫(kù)),然后根據(jù)GetProcAddress函數(shù)獲取DLL中WINDOWS API函數(shù)的起始地址,根據(jù)這些起始地址調(diào)用對(duì)應(yīng)的WINDOWS API函數(shù),這些WINDOWS API函數(shù)通常會(huì)最終調(diào)用較低級(jí)的Native API函數(shù),這些Native API函數(shù)最終完成對(duì)驅(qū)動(dòng)層的訪問(wèn)。而惡意程序(比如利用鉤子Hook技術(shù)的程序)可以預(yù)先Hook到GetProcAddress函數(shù),以得到相關(guān)的API函數(shù)(通??梢园╓INDOWS API函數(shù)或者Native API函數(shù))的起始地址,并獲取API函數(shù)的內(nèi)容或?qū)PI函數(shù)的內(nèi)容進(jìn)行修改。
[0004]由于惡意程序無(wú)法Hook到未導(dǎo)出的Native API函數(shù)的起始地址,因此可以獲取這些未導(dǎo)出的Native API函數(shù),然后直接調(diào)用這些未導(dǎo)出的Native API函數(shù)以完成相應(yīng)的功能。目前,存在一種獲取未導(dǎo)出的Native API函數(shù)的方法,可以包括:首先手工提取指定版本系統(tǒng)文件中某一部分代碼作為特征碼,該部分代碼需要通過(guò)人工分析出可能是和所要查找的未導(dǎo)出的Native API函數(shù)是相關(guān)的;然后根據(jù)該特征碼在內(nèi)存的相應(yīng)模塊做暴力搜索,即在內(nèi)存的相應(yīng)模塊查找是否存在該特征碼,如果查找到該特征碼,分析這段特征碼以獲取未導(dǎo)出Native API函數(shù)。
[0005]在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問(wèn)題:每次根據(jù)特征碼在內(nèi)存的相應(yīng)模塊做暴力搜索時(shí),必須先人工分析系統(tǒng)版本中一個(gè)文件以提取一個(gè)特征碼,而系統(tǒng)版本非常多,對(duì)所有的系統(tǒng)版本均進(jìn)行人工分析出所有的特征碼,效率很低,且人工分析出的特征碼不一定能夠找到想要的未導(dǎo)出Native API函數(shù),因此通過(guò)人工分析出的特征碼搜索到想要的未導(dǎo)出NativeAPI函數(shù)的命中率非常低。且由于特征碼是人工分析并提取的一段較長(zhǎng)的代碼,因此在利用特征碼進(jìn)行暴力搜索時(shí),搜索效率非常低。
【發(fā)明內(nèi)容】
[0006]為了解決現(xiàn)有技術(shù)中利用特征碼進(jìn)行暴力搜索時(shí),搜索效率和搜索命中率非常低的問(wèn)題,本發(fā)明實(shí)施例提供了一種未導(dǎo)出的Native API函數(shù)獲取方法及裝置。所述技術(shù)方案如下:
[0007]第一方面,提供了一種未導(dǎo)出的Native API函數(shù)獲取方法,所述方法,包括:
[0008]獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,所述目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù);[0009]獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,所述指定函數(shù)為在被調(diào)用時(shí)調(diào)用所述目標(biāo)Native API 函數(shù)的 Windows API 函數(shù);
[0010]根據(jù)所述當(dāng)前棧,獲取地址位于所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);
[0011]根據(jù)所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;
[0012]若檢測(cè)結(jié)果為存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù)。
[0013]在第一方面的第一種可能的實(shí)施方式中,所述獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,包括:
[0014]執(zhí)行調(diào)用所述指定函數(shù)的功能;
[0015]獲取在執(zhí)行調(diào)用所述指定函數(shù)的功能時(shí)生成的當(dāng)前棧。
[0016]結(jié)合第一方面或者第一方面的第一種可能的實(shí)施方式,在第二種可能的實(shí)施方式中,所述根據(jù)所述當(dāng)前棧獲取地址位于所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù),包括:
[0017]利用匯編語(yǔ)言將所述當(dāng)前棧的地址由第一地址修改為第二地址;
[0018]利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中;
[0019]遍歷所述棧內(nèi)存,獲取地址在所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
[0020]結(jié)合第一方面、第一方面的第一種可能的實(shí)施方式或者第一方面的第二種可能的實(shí)施方式,在第三種可能的實(shí)施方式中,在所述利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中之后,還包括:
[0021]利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧的地址由所述第二地址修改回所述第一地址。
[0022]結(jié)合第一方面、第一方面的第一種可能的實(shí)施方式、第一方面的第二種可能的實(shí)施方式或者第一方面的第三種可能的實(shí)施方式,在第四種可能的實(shí)施方式中,所述根據(jù)所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,包括:
[0023]根據(jù)所述指針數(shù)據(jù)的地址減去預(yù)定字節(jié)的長(zhǎng)度,得到第一起始地址;
[0024]檢測(cè)以所述第一起始地址為起始地址的語(yǔ)句是否為指定語(yǔ)句,所述指定語(yǔ)句為調(diào)用函數(shù)的語(yǔ)句;
[0025]若檢測(cè)結(jié)果為以所述第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句,則檢測(cè)所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含Native API函數(shù)的特征;
[0026]若檢測(cè)結(jié)果為所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征,則檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)Native API函數(shù);
[0027]若檢測(cè)結(jié)果為所述Native API函數(shù)為所述目標(biāo)Native API函數(shù),則判定所述指定語(yǔ)句為存在的用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句。
[0028]結(jié)合第一方面、第一方面的第一種可能的實(shí)施方式、第一方面的第二種可能的實(shí)施方式、第一方面的第三種可能的實(shí)施方式或者第一方面的第四種可能的實(shí)施方式,在第五種可能的實(shí)施方式中,所述根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù),包括:[0029]根據(jù)所述指定語(yǔ)句中的所述指針?biāo)傅膬?nèi)容獲取所述目標(biāo)Native API函數(shù)。
[0030]結(jié)合第一方面、第一方面的第一種可能的實(shí)施方式、第一方面的第二種可能的實(shí)施方式、第一方面的第三種可能的實(shí)施方式、第一方面的第四種可能的實(shí)施方式或者第一方面的第五種可能的實(shí)施方式,在第六種可能的實(shí)施方式中,在所述檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)Native API函數(shù)之前,還包括:
[0031]將用于記錄檢測(cè)到Native API函數(shù)的次數(shù)的記錄值加I ;
[0032]所述檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)Native API函數(shù),包括:
[0033]檢測(cè)所述記錄值是否為預(yù)定記錄閾值;
[0034]若檢測(cè)結(jié)果為所述記錄值為預(yù)定記錄閾值,則判定檢測(cè)結(jié)果為所述NativeAPI函數(shù)為所述目標(biāo)Native API函數(shù)。
[0035]第二方面,提供了一種未導(dǎo)出的Native API函數(shù)獲取裝置,所述裝置,包括:
[0036]范圍獲取模塊,用于獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,所述目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù);
[0037]當(dāng)前棧獲取模塊,用于獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,所述指定函數(shù)為在被調(diào)用時(shí)調(diào)用所述目標(biāo)Native API函數(shù)的Windows API函數(shù);
[0038]指針數(shù)據(jù)獲取模塊,用于根據(jù)所述當(dāng)前棧獲取模塊獲取到的所述當(dāng)前棧,獲取地址位于所述范圍獲取模塊獲取到的所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);
[0039]檢測(cè)模塊,用于根據(jù)所述指針數(shù)據(jù)獲取模塊獲取到的所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;
[0040]目標(biāo)函數(shù)獲取模塊,用于在所述檢測(cè)模塊的檢測(cè)結(jié)果為存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句時(shí),根據(jù)所述用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo) Native API 函數(shù)。
[0041]在第二方面的第一種可能的實(shí)施方式中,所述當(dāng)前棧獲取模塊,包括:
[0042]執(zhí)行單元,用于執(zhí)行調(diào)用所述指定函數(shù)的功能;
[0043]當(dāng)前棧獲取單元,用于獲取在執(zhí)行調(diào)用所述指定函數(shù)的功能時(shí)生成的當(dāng)前棧。
[0044]結(jié)合第二方面或者第二方面的第一種可能的實(shí)施方式,在第二種可能的實(shí)施方式中,所述指針數(shù)據(jù)獲取模塊,包括:
[0045]第一修改單元,用于利用匯編語(yǔ)言將所述當(dāng)前棧的地址由第一地址修改為第二地址;
[0046]復(fù)制單元,用于利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中;
[0047]指針數(shù)據(jù)獲取單元,用于遍歷所述棧內(nèi)存,獲取地址在所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
[0048]結(jié)合第二方面、第二方面的第一種可能的實(shí)施方式或者第二方面的第二種可能的實(shí)施方式,在第三種可能的實(shí)施方式中,所述指針數(shù)據(jù)獲取模塊,還包括:
[0049]第二修改單元,用于利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧的地址由所述第二地址修改回所述第一地址。
[0050]結(jié)合第二方面、第二方面的第一種可能的實(shí)施方式、第二方面的第二種可能的實(shí)施方式或者第二方面的第三種可能的實(shí)施方式,在第四種可能的實(shí)施方式中,所述檢測(cè)模塊,包括:
[0051]減去單元,用于根據(jù)所述指針數(shù)據(jù)的地址減去預(yù)定字節(jié)的長(zhǎng)度,得到第一起始地址;
[0052]第一檢測(cè)單元,用于檢測(cè)以所述第一起始地址為起始地址的語(yǔ)句是否為指定語(yǔ)句,所述指定語(yǔ)句為調(diào)用函數(shù)的語(yǔ)句;
[0053]第二檢測(cè)單元,用于在所述第一檢測(cè)單元的檢測(cè)結(jié)果為以所述第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句時(shí),檢測(cè)所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含Native API函數(shù)的特征;
[0054]第三檢測(cè)單元,用于在所述第二檢測(cè)單元的檢測(cè)結(jié)果為所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征時(shí),檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)Native API 函數(shù);
[0055]判定單元,用于在所述第三檢測(cè)單元的檢測(cè)結(jié)果為所述Native API函數(shù)為所述目標(biāo)Native API函數(shù)時(shí),判定所述指定語(yǔ)句為存在的用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句。
[0056]結(jié)合第二方面、第二方面的第一種可能的實(shí)施方式、第二方面的第二種可能的實(shí)施方式、第二方面的第三種可能的實(shí)施方式或者第二方面的第四種可能的實(shí)施方式,在第五種可能的實(shí)施方式中,所述目標(biāo)函數(shù)獲取模塊,還用于:
[0057]根據(jù)所述指定語(yǔ)句中的所述指針?biāo)傅膬?nèi)容獲取所述目標(biāo)Native API函數(shù)。
[0058]結(jié)合第二方面、第二方面的第一種可能的實(shí)施方式、第二方面的第二種可能的實(shí)施方式、第二方面的第三種可能的實(shí)施方式、第二方面的第四種可能的實(shí)施方式或者第二方面的第五種可能的實(shí)施方式,在第六種可能的實(shí)施方式中,所述檢測(cè)模塊,還包括:
[0059]增加單元,用于將用于記錄檢測(cè)到Native API函數(shù)的次數(shù)的記錄值加I ;
[0060]所述第三檢測(cè)單元,包括:
[0061]檢測(cè)子單元,用于檢測(cè)所述記錄值是否為預(yù)定記錄閾值;
[0062]判定子單元,用于在所述檢測(cè)子單元的檢測(cè)結(jié)果為所述記錄值為預(yù)定記錄閾值時(shí),判定檢測(cè)結(jié)果為所述Native API函數(shù)為所述目標(biāo)Native API函數(shù)。
[0063]本發(fā)明實(shí)施例提供的技術(shù)方案帶來(lái)的有益效果是:
[0064]通過(guò)目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍以及在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,獲取符合預(yù)定條件的指針數(shù)據(jù),根據(jù)所述指針數(shù)據(jù)的地址檢測(cè)模塊代碼段是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;若檢測(cè)結(jié)果為模塊代碼段存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù);解決現(xiàn)有技術(shù)中利用特征碼進(jìn)行暴力搜索時(shí),搜索效率和搜索命中率非常低的問(wèn)題;在應(yīng)用程序開(kāi)始執(zhí)行后,自動(dòng)根據(jù)當(dāng)前棧里的內(nèi)容搜索目標(biāo)Native API函數(shù),在搜索的過(guò)程中不受系統(tǒng)版本的限制,也不受人工的限制,達(dá)到了可以很大程度上提高搜索效率和搜索命中率的效果。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0065]為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0066]圖1是本發(fā)明一個(gè)實(shí)施例中提供的未導(dǎo)出的Native API函數(shù)獲取方法的方法流程圖;
[0067]圖2是本發(fā)明另一個(gè)實(shí)施例中提供的未導(dǎo)出的Native API函數(shù)獲取方法的方法流程圖;
[0068]圖3是本發(fā)明一個(gè)實(shí)施例中提供的未導(dǎo)出的Native API函數(shù)獲取裝置的結(jié)構(gòu)示意圖;
[0069]圖4是本發(fā)明另一個(gè)實(shí)施例中提供的未導(dǎo)出的Native API函數(shù)獲取裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0070]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
[0071]為了便于描述,首先對(duì)本發(fā)明實(shí)施例所涉及的相關(guān)知識(shí)進(jìn)行詳細(xì)描述。
[0072]在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中在調(diào)用執(zhí)行應(yīng)用程序所需的WINDOWS API函數(shù)或者Native API函數(shù)之前,WINDOWS API函數(shù)的地址或者Native API函數(shù)的地址容易被惡意程序優(yōu)先獲取,這樣應(yīng)用程序最終得到的結(jié)果很可能被惡意程序監(jiān)聽(tīng)到或者被惡意程序修改掉,因此對(duì)于應(yīng)用程序來(lái)講,存在很大的安全隱患。而發(fā)明人發(fā)現(xiàn)應(yīng)用程序在執(zhí)行的過(guò)程中,調(diào)用的WINDOWS API函數(shù)最終會(huì)調(diào)用較低級(jí)的未導(dǎo)出的NativeAPI函數(shù)以完成相應(yīng)的功能,且未導(dǎo)出的Native API函數(shù)不易被惡意程序監(jiān)聽(tīng)到,因此發(fā)明人將應(yīng)用程序在執(zhí)行相應(yīng)功能時(shí)需要的未導(dǎo)出的Native API函數(shù)均查找出來(lái),然后直接調(diào)用未導(dǎo)出的Native API函數(shù)即可完成相應(yīng)的功能,從而保證應(yīng)用程序的內(nèi)容不會(huì)被惡意程序監(jiān)聽(tīng)或篡改,可以大大提高應(yīng)用程序的安全性。
[0073]也就是說(shuō),當(dāng)應(yīng)用程序執(zhí)行時(shí),系統(tǒng)會(huì)將相關(guān)的動(dòng)態(tài)鏈接庫(kù)自動(dòng)加載至內(nèi)存的固定位置,這樣惡意程序就可以獲取內(nèi)存中該固定位置處動(dòng)態(tài)鏈接庫(kù)中的函數(shù)信息。由于應(yīng)用程序在執(zhí)行時(shí)需要調(diào)用相關(guān)的WINDOWS API函數(shù)來(lái)完成相應(yīng)的功能,而WINDOWS API函數(shù)最終是通過(guò)調(diào)用未導(dǎo)出的Native API函數(shù)完成對(duì)內(nèi)核函數(shù)的調(diào)用。因此如果能夠直接調(diào)用未導(dǎo)出的Native API函數(shù)就可以保證應(yīng)用程序完成正確的功能。
[0074]下面通過(guò)具體的實(shí)施例對(duì)未導(dǎo)出的Native API函數(shù)獲取方法進(jìn)行詳細(xì)說(shuō)明。
[0075]請(qǐng)參見(jiàn)圖1所示,其示出了本發(fā)明一個(gè)實(shí)施例中提供的未導(dǎo)出的Native API函數(shù)獲取方法的方法流程圖。該未導(dǎo)出的Native API函數(shù)獲取方法可以包括:
[0076]101,獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,該目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù);
[0077]在實(shí)際應(yīng)用中,當(dāng)應(yīng)用程序啟動(dòng)執(zhí)行后,系統(tǒng)首先會(huì)將相關(guān)的動(dòng)態(tài)鏈接庫(kù)加載至內(nèi)存,這些動(dòng)態(tài)鏈接庫(kù)中的內(nèi)容在內(nèi)存中的存在形式則為模塊代碼段。
[0078]模塊代碼段的范圍通常是從該模塊代碼段的起始地址到該模塊代碼段的結(jié)束地址。
[0079]102,獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,該指定函數(shù)為在被調(diào)用時(shí)調(diào)用目標(biāo)Native API 函數(shù)的 Windows API 函數(shù);
[0080]通過(guò)應(yīng)用程序啟動(dòng)執(zhí)行后,可以執(zhí)行相關(guān)的功能,每一個(gè)功能通常都會(huì)調(diào)用多個(gè)Windows API函數(shù),因此如果想要最終得到指定的目標(biāo)Native API函數(shù),則首先需要啟動(dòng)可以調(diào)用指定的Windows API函數(shù)的功能,當(dāng)在執(zhí)行該功能時(shí),指定的Windows API函數(shù)則會(huì)調(diào)用指定的目標(biāo)Native API函數(shù)。
[0081]對(duì)應(yīng)的,當(dāng)執(zhí)行該功能時(shí)會(huì)產(chǎn)生一個(gè)當(dāng)前棧,該當(dāng)前棧中的內(nèi)容通常會(huì)包含與該目標(biāo)Native API函數(shù)相關(guān)的數(shù)據(jù)。
[0082]103,根據(jù)該當(dāng)前棧獲取地址位于該模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);
[0083]當(dāng)前棧中的數(shù)據(jù)通常可以包含很多種類(lèi),比如可以為參數(shù)、指針或者變量等。
[0084]由于當(dāng)前棧中的所有數(shù)據(jù)都有對(duì)應(yīng)的一個(gè)地址,因此可以從該當(dāng)前棧中獲取地址位于上述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
[0085]104,根據(jù)該指針數(shù)據(jù)的地址檢測(cè)模塊代碼段中是否存在用于調(diào)用目標(biāo)NativeAPI函數(shù)的語(yǔ)句;
[0086]在實(shí)際應(yīng)用中,在用于調(diào)用某個(gè)函數(shù)的語(yǔ)句的后面,通過(guò)會(huì)設(shè)置一個(gè)指針數(shù)據(jù),該指針數(shù)據(jù)通常用于指向調(diào)用該函數(shù)的語(yǔ)句后面的返回地址,以便于在執(zhí)行完該函數(shù)的代碼之后,可以根據(jù)該指針數(shù)據(jù)返回到該用于調(diào)用函數(shù)的語(yǔ)句后面的地址,以繼續(xù)執(zhí)行該語(yǔ)句后面的代碼。
[0087]105,若檢測(cè)結(jié)果為模塊代碼段中存在用于調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)用于調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句獲取目標(biāo)Native API函數(shù)。
[0088]綜上所述,本發(fā)明實(shí)施例提供的未導(dǎo)出的Native API函數(shù)獲取方法,通過(guò)目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍以及在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,獲取符合預(yù)定條件的指針數(shù)據(jù),根據(jù)所述指針數(shù)據(jù)的地址檢測(cè)是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;若檢測(cè)結(jié)果為存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù);解決現(xiàn)有技術(shù)中利用特征碼進(jìn)行暴力搜索時(shí),搜索效率和搜索命中率非常低的問(wèn)題;在應(yīng)用程序開(kāi)始執(zhí)行后,自動(dòng)根據(jù)當(dāng)前棧里的內(nèi)容搜索目標(biāo)Native API函數(shù),在搜索的過(guò)程中不受系統(tǒng)版本的限制,也不受人工的限制,達(dá)到了可以很大程度上提高搜索效率和搜索命中率的效果。
[0089]請(qǐng)參見(jiàn)圖2所示,其示出了本發(fā)明另一個(gè)實(shí)施例中提供的未導(dǎo)出的NativeAPI函數(shù)獲取方法的方法流程圖。該未導(dǎo)出的Native API函數(shù)獲取方法可以包括:
[0090]201,獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù);
[0091]在實(shí)際應(yīng)用中,當(dāng)應(yīng)用程序啟動(dòng)執(zhí)行后,系統(tǒng)首先會(huì)將相關(guān)的動(dòng)態(tài)鏈接庫(kù)加載至內(nèi)存,這些動(dòng)態(tài)鏈接庫(kù)中的內(nèi)容在內(nèi)存中的存在形式則為模塊代碼段。
[0092]模塊代碼段的范圍通常是從該模塊代碼段的起始地址到該模塊代碼段的結(jié)束地址。
[0093]202,執(zhí)行調(diào)用指定函數(shù)的功能;
[0094]通過(guò)應(yīng)用程序啟動(dòng)執(zhí)行后,可以執(zhí)行相關(guān)的功能,每一個(gè)功能通常都會(huì)調(diào)用一個(gè)或多個(gè)Windows API函數(shù),因此如果想要最終得到目標(biāo)Native API函數(shù),則首先需要啟動(dòng)可以調(diào)用指定的Windows API函數(shù)的功能,當(dāng)在執(zhí)行該功能時(shí),指定的Windows API函數(shù)則會(huì)調(diào)用目標(biāo)Native API函數(shù)。
[0095]203,獲取在執(zhí)行調(diào)用指定函數(shù)的功能時(shí)生成的當(dāng)前棧;
[0096]對(duì)應(yīng)的,當(dāng)執(zhí)行該功能時(shí)會(huì)產(chǎn)生一個(gè)當(dāng)前棧,當(dāng)前棧中的內(nèi)容通常會(huì)包含與該目標(biāo)Native API函數(shù)相關(guān)的數(shù)據(jù)。所以,為了獲取與該目標(biāo)Native API函數(shù)相關(guān)的數(shù)據(jù),需要首先獲取該當(dāng)前棧。
[0097]204,利用匯編語(yǔ)言將當(dāng)前棧的地址由第一地址修改為第二地址;
[0098]由于從當(dāng)前棧中獲取想要得到的數(shù)據(jù)時(shí)需要一段時(shí)間,而這段時(shí)間內(nèi),還有其他進(jìn)程需要用到該當(dāng)前棧,也就是說(shuō)該當(dāng)前棧中的數(shù)據(jù)在這段時(shí)間內(nèi)可能會(huì)隨時(shí)改變,為了避免當(dāng)前棧中的數(shù)據(jù)被發(fā)生變化,首先暫時(shí)將當(dāng)前棧的地址進(jìn)行修改,這樣其余的進(jìn)程暫時(shí)無(wú)法更新該當(dāng)前棧中的內(nèi)容。
[0099]在實(shí)際應(yīng)用中,為了避免對(duì)當(dāng)前棧中數(shù)據(jù)的破壞,需要通過(guò)內(nèi)聯(lián)匯編的操作來(lái)完成對(duì)該當(dāng)前棧地址的修改。也就是說(shuō),利用匯編語(yǔ)言將當(dāng)前棧的地址由第一地址修改為第二地址。
[0100]205,利用匯編語(yǔ)言將具有第二地址的當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中;
[0101]在實(shí)際應(yīng)用中,在根據(jù)當(dāng)前棧查找與Native API函數(shù)相關(guān)的數(shù)據(jù)時(shí),為了保證避免其他進(jìn)程在使用時(shí)修改當(dāng)前棧中的內(nèi)容,需要將當(dāng)前棧中的數(shù)據(jù)復(fù)制出來(lái),此時(shí)可以在內(nèi)存中預(yù)先分配好一塊區(qū)域,用來(lái)存儲(chǔ)該當(dāng)前棧中的當(dāng)前數(shù)據(jù)。這里為了便于描述,可以將這塊區(qū)域稱(chēng)之為棧內(nèi)存。
[0102]同樣的,為了避免具有第二地址的當(dāng)前棧中的內(nèi)容在復(fù)制時(shí)被破壞掉,因此也需要使用匯編語(yǔ)言完成將具有第二地址的當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中的過(guò)程。
[0103]206,遍歷棧內(nèi)存,獲取地址在模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);
[0104]根據(jù)步驟204和步驟205可知,棧內(nèi)存中的數(shù)據(jù)和當(dāng)前棧中的數(shù)據(jù)是相同的,因此可以遍歷該棧內(nèi)存,以獲取地址在模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
[0105]在實(shí)際應(yīng)用中,在每一個(gè)用于調(diào)用函數(shù)語(yǔ)句的后面,通常會(huì)設(shè)置一個(gè)指針數(shù)據(jù),該指針數(shù)據(jù)通常用于指向用于調(diào)用該函數(shù)語(yǔ)句后面的返回地址,以便于在執(zhí)行完該函數(shù)代碼之后,可以根據(jù)該指針數(shù)據(jù)返回到該用于調(diào)用函數(shù)語(yǔ)句后面的地址,以繼續(xù)執(zhí)行后面的代碼。
[0106]需要注意的是,為了保證其他進(jìn)程可以繼續(xù)使用當(dāng)前棧,在將具有第二地址的當(dāng)前棧中的數(shù)據(jù)復(fù)制到到棧內(nèi)存之后,需要將當(dāng)前棧的第二地址修改回原來(lái)的第一地址,以便其他進(jìn)程可以識(shí)別并使用該當(dāng)前棧。為了保證在將當(dāng)前棧的第二地址改回為第一地址時(shí),當(dāng)前棧中的數(shù)據(jù)不被破壞掉,此時(shí)需要使用內(nèi)聯(lián)匯編完成將具有第二地址的當(dāng)前棧的地址由第二地址修改回第一地址的操作。也即,利用匯編語(yǔ)言將具有第二地址的當(dāng)前棧的地址由第二地址修改回第一地址。
[0107]207,根據(jù)指針數(shù)據(jù)的地址減去預(yù)定字節(jié)的長(zhǎng)度,得到第一起始地址;
[0108]預(yù)定字節(jié)的長(zhǎng)度通??梢詾?個(gè)字節(jié)。
[0109]208,檢測(cè)以第一起始地址為起始地址的語(yǔ)句是否為指定語(yǔ)句,指定語(yǔ)句為調(diào)用函數(shù)的語(yǔ)句;[0110]舉例來(lái)講,指定語(yǔ)句可以為CALL XXXXXX,其中后面的XXXXXX則為調(diào)用的函數(shù)的起始地址。
[0111]而指定語(yǔ)句CALL XXXXXX通常具有上面所講的預(yù)定字節(jié)的長(zhǎng)度,即可以為5個(gè)字節(jié)。
[0112]也就是說(shuō),根據(jù)獲取到的指針數(shù)據(jù)的地址減去該指定語(yǔ)句CALL XXXXXX的長(zhǎng)度,即為指定語(yǔ)句CALL XXXXXX的地址,也就是說(shuō)第一起始地址即為指定語(yǔ)句CALL XXXXXX的地址。
[0113]209,若檢測(cè)結(jié)果為以第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句,則檢測(cè)指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含Native API函數(shù)的特征;
[0114]舉例來(lái)講,當(dāng)指定語(yǔ)句為CALL XXXXXX時(shí),指定語(yǔ)句中的指針地址即為XXXXXX。
[0115]Native API函數(shù)的特征即為通用的Native API函數(shù)的特征,舉例來(lái)講,檢測(cè)指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否為MOV EAX, YYYYYY (通用的Native API函數(shù)的特征),這里的YYYYYY可以為Native API函數(shù)的系統(tǒng)調(diào)用號(hào)。
[0116]換句話說(shuō),如果以第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句CALLXXXXXX,則進(jìn)一步檢測(cè)指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含Native API函數(shù)的特征MOV ΕΑΧ,ΥΥΥΥΥΥ。
[0117]210,若檢測(cè)結(jié)果為指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征,則檢測(cè)Native API函數(shù)是否為目標(biāo)Native API函數(shù);
[0118]若指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征,也就是說(shuō)指定語(yǔ)句調(diào)用的函數(shù)為Native API函數(shù),此時(shí)則可以進(jìn)一步判斷該Native API函數(shù)是否為目標(biāo)Native API 函數(shù)。
[0119]舉例來(lái)講,可以先將用于記錄檢測(cè)到Native API函數(shù)的次數(shù)的記錄值加1,然后根據(jù)該記錄值判斷Native API函數(shù)是否為目標(biāo)Native API函數(shù)。換句話說(shuō),當(dāng)每次檢測(cè)到指定語(yǔ)句調(diào)用的函數(shù)為Native API函數(shù)時(shí),則將記錄值加1,然后可以根據(jù)該記錄值確定該Native API函數(shù)是否為目標(biāo)Native API函數(shù)。
[0120]在實(shí)際應(yīng)用中,根據(jù)該記錄值判斷Native API函數(shù)是否為目標(biāo)Native API函數(shù)可以包括:檢測(cè)該記錄值是否為預(yù)定記錄閾值;若檢測(cè)結(jié)果為該記錄值為預(yù)定記錄閾值,則判定檢測(cè)結(jié)果為Native API函數(shù)為目標(biāo)Native API函數(shù)。
[0121]通常情況下,當(dāng)前棧中地址位于模塊代碼段中的指針數(shù)據(jù)可能會(huì)有多個(gè),也就是說(shuō),該模塊代碼段中可能會(huì)存在多個(gè)Native API函數(shù),但通常在應(yīng)用程序每次執(zhí)行時(shí),它們的順序是不變的,且根據(jù)棧的特性可知,每次遍歷棧內(nèi)存,獲取指針數(shù)據(jù)的順序也是不變的。舉例來(lái)講,在實(shí)際應(yīng)用中,可以先人工確認(rèn)下所要找的目標(biāo)Native API函數(shù)是模塊代碼段中的第幾個(gè),比如目標(biāo)Native API函數(shù)為該模塊代碼段中的第4個(gè),此時(shí)可以將該預(yù)定記錄閾值設(shè)置為4,然后在應(yīng)用程序執(zhí)行時(shí),當(dāng)檢測(cè)到指定語(yǔ)句調(diào)用的函數(shù)是第四個(gè)被檢測(cè)到的Native API函數(shù)時(shí),則可以確定該函數(shù)為目標(biāo)Native API函數(shù)。
[0122]需要說(shuō)明的是,可以通過(guò)人工的方式確定應(yīng)用程序中所需要的所有未導(dǎo)出的Native API函數(shù)所對(duì)應(yīng)的預(yù)定記錄閾值,然后將這些預(yù)定記錄閾值預(yù)先設(shè)置在應(yīng)用程序中,以后在每次執(zhí)行該應(yīng)用程序時(shí),均可以自動(dòng)根據(jù)這些預(yù)定記錄閾值檢測(cè)是否查找到未導(dǎo)出的目標(biāo)Native API函數(shù)。
[0123]211,若檢測(cè)結(jié)果為Native API函數(shù)為目標(biāo)Native API函數(shù),則判定該指定語(yǔ)句為存在的用于調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句;
[0124]當(dāng)Native API函數(shù)為目標(biāo)Native API函數(shù)時(shí),則可以確定該指定語(yǔ)句CALLXXXXXX為用于調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句。
[0125]212,根據(jù)該指定語(yǔ)句中的指針?biāo)傅膬?nèi)容獲取目標(biāo)Native API函數(shù)。
[0126]也就是說(shuō),可以根據(jù)指定語(yǔ)句CALL XXXXXX中的指針?biāo)傅膬?nèi)容獲取目標(biāo)NativeAPI函數(shù)的起始地址,也即可以獲取到該Native API函數(shù)。
[0127]綜上所述,本發(fā)明實(shí)施例提供的未導(dǎo)出的Native API函數(shù)獲取方法,通過(guò)目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍以及在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,獲取符合預(yù)定條件的指針數(shù)據(jù),根據(jù)所述指針數(shù)據(jù)的地址檢測(cè)是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;若檢測(cè)結(jié)果為存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù);解決現(xiàn)有技術(shù)中利用特征碼進(jìn)行暴力搜索時(shí),搜索效率和搜索命中率非常低的問(wèn)題;在應(yīng)用程序開(kāi)始執(zhí)行后,自動(dòng)根據(jù)當(dāng)前棧里的內(nèi)容搜索目標(biāo)Native API函數(shù),在搜索的過(guò)程中不受系統(tǒng)版本的限制,也不受人工的限制,達(dá)到了可以很大程度上提高搜索效率和搜索命中率的效果。
[0128]請(qǐng)參見(jiàn)圖3所示,其示出了本發(fā)明一個(gè)實(shí)施例中提供的未導(dǎo)出的Native API函數(shù)獲取裝置的結(jié)構(gòu)示意圖。該未導(dǎo)出的Native API函數(shù)獲取裝置可以包括但不限于:范圍獲取模塊301、當(dāng)前棧獲取模塊302、指針數(shù)據(jù)獲取模塊303、檢測(cè)模塊304和目標(biāo)函數(shù)獲取模塊 305。
[0129]范圍獲取模塊301,可以用于獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,所述目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù);
[0130]當(dāng)前棧獲取模塊302,可以用于獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,所述指定函數(shù)為在被調(diào)用時(shí)調(diào)用所述目標(biāo)Native API函數(shù)的Windows API函數(shù);
[0131]指針數(shù)據(jù)獲取模塊303,可以用于根據(jù)所述當(dāng)前棧獲取模塊302獲取到的所述當(dāng)前棧,獲取地址位于所述范圍獲取模塊301獲取到的所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);
[0132]檢測(cè)模塊304,可以用于根據(jù)所述指針數(shù)據(jù)獲取模塊303獲取到的所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;
[0133]目標(biāo)函數(shù)獲取模塊305,用于在所述檢測(cè)模塊304的檢測(cè)結(jié)果為所述模塊代碼段中存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句時(shí),根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù)。
[0134]綜上所述,本發(fā)明實(shí)施例提供的未導(dǎo)出的Native API函數(shù)獲取裝置,通過(guò)目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍以及在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,獲取符合預(yù)定條件的指針數(shù)據(jù),根據(jù)所述指針數(shù)據(jù)的地址檢測(cè)是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;若檢測(cè)結(jié)果為存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù);解決現(xiàn)有技術(shù)中利用特征碼進(jìn)行暴力搜索時(shí),搜索效率和搜索命中率非常低的問(wèn)題;在應(yīng)用程序開(kāi)始執(zhí)行后,自動(dòng)根據(jù)當(dāng)前棧里的內(nèi)容搜索目標(biāo)Native API函數(shù),在搜索的過(guò)程中不受系統(tǒng)版本的限制,也不受人工的限制,達(dá)到了可以很大程度上提高搜索效率和搜索命中率的效果。
[0135]請(qǐng)參見(jiàn)圖4所示,其示出了本發(fā)明另一個(gè)實(shí)施例中提供的未導(dǎo)出的NativeAPI函數(shù)獲取裝置的結(jié)構(gòu)示意圖。該未導(dǎo)出的Native API函數(shù)獲取裝置可以包括但不限于:范圍獲取模塊401、當(dāng)前棧獲取模塊402、指針數(shù)據(jù)獲取模塊403、檢測(cè)模塊404和目標(biāo)函數(shù)獲取模塊405。
[0136]范圍獲取模塊401,可以用于獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù);
[0137]當(dāng)前棧獲取模塊402,可以用于獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,指定函數(shù)為在被調(diào)用時(shí)調(diào)用目標(biāo)Native API函數(shù)的Windows API函數(shù);
[0138]指針數(shù)據(jù)獲取模塊403,可以用于根據(jù)當(dāng)前棧獲取模塊402獲取到的當(dāng)前棧,獲取地址位于范圍獲取模塊401獲取到的模塊代碼段的范圍內(nèi)的指針數(shù)據(jù);
[0139]檢測(cè)模塊404,可以用于根據(jù)指針數(shù)據(jù)獲取模塊403獲取到的指針數(shù)據(jù)的地址,檢測(cè)是否所述模塊代碼段中存在調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句;
[0140]目標(biāo)函數(shù)獲取模塊405,可以用于在檢測(cè)模塊404的檢測(cè)結(jié)果為所述模塊代碼段中存在調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句時(shí),根據(jù)調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句獲取目標(biāo) Native API 函數(shù)。
[0141]在一個(gè)可能實(shí)現(xiàn)的實(shí)施方式中,當(dāng)前棧獲取模塊402可以包括:執(zhí)行單元402a和當(dāng)前棧獲取單元402b。
[0142]執(zhí)行單元402a,可以用于執(zhí)行調(diào)用指定函數(shù)的功能;
[0143]當(dāng)前棧獲取單元402b,可以用于獲取在執(zhí)行調(diào)用指定函數(shù)的功能時(shí)生成的當(dāng)前棧。
[0144]在一個(gè)可能實(shí)現(xiàn)的實(shí)施方式中,指針數(shù)據(jù)獲取模塊403可以包括:第一修改單元403a、復(fù)制單元403b和指針數(shù)據(jù)獲取單元403c。
[0145]第一修改單元403a,可以用于利用匯編語(yǔ)言將當(dāng)前棧的地址由第一地址修改為第二地址;
[0146]復(fù)制單元403b,可以用于利用匯編語(yǔ)言將具有第二地址的當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中;
[0147]指針數(shù)據(jù)獲取單元403c,可以用于遍歷棧內(nèi)存,獲取地址在模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
[0148]在一個(gè)可能實(shí)現(xiàn)的實(shí)施方式中,指針數(shù)據(jù)獲取模塊403還可以包括:第二修改單元 403d。
[0149]第二修改單元403d,可以用于利用匯編語(yǔ)言將具有第二地址的當(dāng)前棧的地址由第二地址修改回第一地址。
[0150]在一個(gè)可能實(shí)現(xiàn)的實(shí)施方式中,檢測(cè)模塊404可以包括:減去單元404a、第一檢測(cè)單元404b、第二檢測(cè)單元404c、第三檢測(cè)單元404d和判定單元404e。
[0151]減去單元404a,可以用于根據(jù)指針數(shù)據(jù)的地址減去預(yù)定字節(jié)的長(zhǎng)度,得到第一起始地址;
[0152]第一檢測(cè)單元404b,可以用于檢測(cè)以第一起始地址為起始地址的語(yǔ)句是否為指定語(yǔ)句;
[0153]第二檢測(cè)單元404c,可以用于在第一檢測(cè)單元404b的檢測(cè)結(jié)果為以第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句時(shí),檢測(cè)指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含NativeAPI函數(shù)的特征;
[0154]第三檢測(cè)單元404d,可以用于在第二檢測(cè)單元404c的檢測(cè)結(jié)果為指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征時(shí),檢測(cè)Native API函數(shù)是否為目標(biāo)NativeAPI函數(shù);
[0155]判定單元404e,可以用于在第三檢測(cè)單元404d的檢測(cè)結(jié)果為Native API函數(shù)為目標(biāo)Native API函數(shù)時(shí),判定存在調(diào)用目標(biāo)Native API函數(shù)的語(yǔ)句。
[0156]在一個(gè)可能實(shí)現(xiàn)的實(shí)施方式中,目標(biāo)函數(shù)獲取模塊405,還可以用于根據(jù)指定語(yǔ)句中的指針?biāo)傅膬?nèi)容獲取目標(biāo)Native API函數(shù)。
[0157]在一個(gè)可能實(shí)現(xiàn)的實(shí)施方式中,檢測(cè)模塊404可以包括:增加單元404f。
[0158]增加單元404f,可以用于將用于記錄檢測(cè)到Native API函數(shù)的次數(shù)的記錄值加
1
[0159]第三檢測(cè)單元404d還可以包括:檢測(cè)子單元和判定子單元。
[0160]檢測(cè)子單元,可以用于檢測(cè)記錄值是否為預(yù)定記錄閾值;
[0161]判定子單元,可以用于在檢測(cè)子單元的檢測(cè)結(jié)果為記錄值為預(yù)定記錄閾值時(shí),判定檢測(cè)結(jié)果為Native API函數(shù)為目標(biāo)Native API函數(shù)。
[0162]綜上所述,本發(fā)明實(shí)施例提供的未導(dǎo)出的Native API函數(shù)獲取裝置,通過(guò)目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍以及在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,獲取符合預(yù)定條件的指針數(shù)據(jù),根據(jù)所述指針數(shù)據(jù)的地址檢測(cè)是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句;若檢測(cè)結(jié)果為存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù);解決現(xiàn)有技術(shù)中利用特征碼進(jìn)行暴力搜索時(shí),搜索效率和搜索命中率非常低的問(wèn)題;在應(yīng)用程序開(kāi)始執(zhí)行后,自動(dòng)根據(jù)當(dāng)前棧里的內(nèi)容搜索目標(biāo)Native API函數(shù),在搜索的過(guò)程中不受系統(tǒng)版本的限制,也不受人工的限制,達(dá)到了可以很大程度上提高搜索效率和搜索命中率的效果。
[0163]需要說(shuō)明的是:上述實(shí)施例提供的未導(dǎo)出的Native API函數(shù)獲取裝置在獲取未導(dǎo)出的Native API函數(shù)時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說(shuō)明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將設(shè)備的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的未導(dǎo)出的Native API函數(shù)獲取裝置與未導(dǎo)出的Native API函數(shù)獲取方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過(guò)程詳見(jiàn)方法實(shí)施例,這里不再贅述。
[0164]上述本發(fā)明實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
[0165]本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過(guò)硬件來(lái)完成,也可以通過(guò)程序來(lái)指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤(pán)或光盤(pán)等。
[0166]以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種未導(dǎo)出的Native API函數(shù)獲取方法,其特征在于,所述方法,包括: 獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,所述目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù); 獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,所述指定函數(shù)為在被調(diào)用時(shí)調(diào)用所述目標(biāo)Native API 函數(shù)的 Windows API 函數(shù); 根據(jù)所述當(dāng)前棧,獲取地址位于所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù); 根據(jù)所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在用于調(diào)用所述目標(biāo)NativeAPI函數(shù)的指定語(yǔ)句; 若檢測(cè)結(jié)果為所述模塊代碼段中存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,則根據(jù)所述用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)NativeAPI函數(shù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,包括: 執(zhí)行調(diào)用所述指定函數(shù)的功能; 獲取在執(zhí)行調(diào)用所述指定函數(shù)的功能時(shí)生成的當(dāng)前棧。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述根據(jù)所述當(dāng)前棧獲取地址位于所述模塊代碼段的范圍內(nèi)的指針 數(shù)據(jù),包括: 利用匯編語(yǔ)言將所述當(dāng)前棧的地址由第一地址修改為第二地址; 利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中; 遍歷所述棧內(nèi)存,獲取地址在所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,在所述利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中之后,還包括: 利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧的地址由所述第二地址修改回所述第一地址。
5.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述根據(jù)所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句,包括: 根據(jù)所述指針數(shù)據(jù)的地址減去預(yù)定字節(jié)的長(zhǎng)度,得到第一起始地址; 檢測(cè)以所述第一起始地址為起始地址的語(yǔ)句是否為指定語(yǔ)句,所述指定語(yǔ)句為調(diào)用函數(shù)的語(yǔ)句; 若檢測(cè)結(jié)果為以所述第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句,則檢測(cè)所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含Native API函數(shù)的特征; 若檢測(cè)結(jié)果為所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征,則檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)Native API函數(shù); 若檢測(cè)結(jié)果為所述Native API函數(shù)為所述目標(biāo)Native API函數(shù),則判定所述指定語(yǔ)句為存在的用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述根據(jù)所述調(diào)用所述目標(biāo)NativeAPI函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù),包括: 根據(jù)所述指定語(yǔ)句中的所述指針?biāo)傅膬?nèi)容獲取所述目標(biāo)Native API函數(shù)。
7.根據(jù)權(quán)利要求5所述的方法,其特征在于,在所述檢測(cè)所述NativeAPI函數(shù)是否為所述目標(biāo)Native API函數(shù)之前,還包括: 將用于記錄檢測(cè)到Native API函數(shù)的次數(shù)的記錄值加I ; 所述檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)Native API函數(shù),包括: 檢測(cè)所述記錄值是否為預(yù)定記錄閾值; 若檢測(cè)結(jié)果為所述記錄值為預(yù)定記錄閾值,則判定檢測(cè)結(jié)果為所述NativeAPI函數(shù)為所述目標(biāo)Native API函數(shù)。
8.一種未導(dǎo)出的Native API函數(shù)獲取裝置,其特征在于,所述裝置,包括: 范圍獲取模塊,用于獲取目標(biāo)Native API函數(shù)所在的模塊代碼段的范圍,所述目標(biāo)Native API函數(shù)為指定的未導(dǎo)出的Native API函數(shù); 當(dāng)前棧獲取模塊,用于獲取在調(diào)用指定函數(shù)時(shí)生成的當(dāng)前棧,所述指定函數(shù)為在被調(diào)用時(shí)調(diào)用所述目標(biāo)Native API函數(shù)的Windows API函數(shù); 指針數(shù)據(jù)獲取模塊,用于根據(jù)所述當(dāng)前棧獲取模塊獲取到的所述當(dāng)前棧,獲取地址位于所述范圍獲取模塊獲取到的所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù); 檢測(cè)模塊,用于根據(jù)所述指針數(shù)據(jù)獲取模塊獲取到的所述指針數(shù)據(jù)的地址,檢測(cè)所述模塊代碼段中是否存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句; 目標(biāo)函數(shù)獲取模塊,用于在所述檢測(cè)模塊的檢測(cè)結(jié)果為所述模塊代碼段中存在用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句時(shí),根據(jù)所述用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句獲取所述目標(biāo)Native API函數(shù)。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述當(dāng)前棧獲取模塊,包括: 執(zhí)行單元,用于執(zhí)行調(diào)用所述指定函數(shù)的功能; 當(dāng)前棧獲取單元,用于獲取在執(zhí)行調(diào)用所述指定函數(shù)的功能時(shí)生成的當(dāng)前棧。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述指針數(shù)據(jù)獲取模塊,包括: 第一修改單元,用于利用匯編語(yǔ)言將所述當(dāng)前棧的地址由第一地址修改為第二地址; 復(fù)制單元,用于利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧中的內(nèi)容復(fù)制到預(yù)先在內(nèi)存中分配的棧內(nèi)存中; 指針數(shù)據(jù)獲取單元,用于遍歷所述棧內(nèi)存,獲取地址在所述模塊代碼段的范圍內(nèi)的指針數(shù)據(jù)。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述指針數(shù)據(jù)獲取模塊,還包括: 第二修改單元,用于利用匯編語(yǔ)言將具有所述第二地址的所述當(dāng)前棧的地址由所述第二地址修改回所述第一地址。
12.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述檢測(cè)模塊,包括: 減去單元,用于根據(jù)所述指針數(shù)據(jù)的地址減去預(yù)定字節(jié)的長(zhǎng)度,得到第一起始地址;第一檢測(cè)單元,用于檢測(cè)以所述第一起始地址為起始地址的語(yǔ)句是否為指定語(yǔ)句,所述指定語(yǔ)句為調(diào)用函數(shù)的語(yǔ)句; 第二檢測(cè)單元,用于在所述第一檢測(cè)單元的檢測(cè)結(jié)果為以所述第一起始地址為起始地址的語(yǔ)句為指定語(yǔ)句時(shí),檢測(cè)所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容是否包含Native API函數(shù)的特征; 第三檢測(cè)單元,用于在所述第二檢測(cè)單元的檢測(cè)結(jié)果為所述指定語(yǔ)句中的指針?biāo)傅膬?nèi)容包含Native API函數(shù)的特征時(shí),檢測(cè)所述Native API函數(shù)是否為所述目標(biāo)NativeAPI函數(shù); 判定單元,用于在所述第三檢測(cè)單元的檢測(cè)結(jié)果為所述Native API函數(shù)為所述目標(biāo)Native API函數(shù)時(shí),判定所述指定語(yǔ)句為存在的用于調(diào)用所述目標(biāo)Native API函數(shù)的語(yǔ)句。
13.根據(jù)權(quán)利要求12所述的裝置,其特征在于,所述目標(biāo)函數(shù)獲取模塊,還用于: 根據(jù)所述指定語(yǔ)句中的所述指針?biāo)傅膬?nèi)容獲取所述目標(biāo)Native API函數(shù)。
14.根據(jù)權(quán)利要求12所述的裝置,其特征在于,所述檢測(cè)模塊,還包括: 增加單元,用于將用于記錄檢測(cè)到Native API函數(shù)的次數(shù)的記錄值加I ; 所述第三檢測(cè)單元,包括: 檢測(cè)子單元,用于檢測(cè)所述記錄值是否為預(yù)定記錄閾值; 判定子單元,用于在所述檢測(cè)子單元的檢測(cè)結(jié)果為所述記錄值為預(yù)定記錄閾值時(shí),判定檢測(cè)結(jié)果為所述Native API函數(shù)為所`述目標(biāo)Native API函數(shù)。
【文檔編號(hào)】G06F21/57GK103632099SQ201310455256
【公開(kāi)日】2014年3月12日 申請(qǐng)日期:2013年9月29日 優(yōu)先權(quán)日:2013年9月29日
【發(fā)明者】馮世杰 申請(qǐng)人:廣州華多網(wǎng)絡(luò)科技有限公司