国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 邏輯算法 > 正文

輸入表隱藏、加密的原理和手工實(shí)現(xiàn)

2019-09-10 09:02:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、前言:現(xiàn)在對(duì)輸入表的查已經(jīng)成為軟件毒的一個(gè)重要方面,沒(méi)有一個(gè)軟件不把輸入表作為查的對(duì)象,通常的輸入表移位、重建已經(jīng)不能作為的重要手段,可以說(shuō)軟件也在逐步進(jìn)步,而我先前倡導(dǎo)的輸入表按序號(hào)重建也因?yàn)榇嬖谙到y(tǒng)兼容性問(wèn)題不能作為輸入表的手段。如何改變輸入表部分的內(nèi)容與結(jié)構(gòu),使其與原先的不同,這就是本文要討的問(wèn)題。
二、目的:通過(guò)本文的學(xué)習(xí),可以掌握手工導(dǎo)入輸入表和手工加密輸入表函數(shù)的名稱(chēng)的辦法,并能學(xué)習(xí)到匯編語(yǔ)言的精辟。
三、基本知識(shí)
在開(kāi)始之前,我們先來(lái)了解二個(gè)kernel32.dll的函數(shù)的使用方法,即:kernel32.LoadLibraryA和kernel32.GetProcAddress,它們是本文要用到的二個(gè)關(guān)鍵函數(shù)。具體的函數(shù)介紹可以看看這篇文章:《3個(gè)脫相關(guān)的重要函數(shù)介紹》http://bbs.pediy.com/showthread.php?threadid=20230
1、LoadLibraryA函數(shù)
LoadLibrary函數(shù)是把指定的可執(zhí)行模塊映射進(jìn)調(diào)用進(jìn)程的地址空間。通俗的說(shuō),如程序需要調(diào)用ole32.dll里面的CreateStreamOnHGlobal函數(shù),首先應(yīng)該用LoadLibraryA函數(shù)找到ole32.dll的句柄。然后根據(jù)這個(gè)句柄用GetProcAddress找到CreateStreamOnHGlobal的內(nèi)存指針。
它有一個(gè)參數(shù),即動(dòng)態(tài)鏈接庫(kù)名稱(chēng)的內(nèi)存地址。匯編語(yǔ)言是這樣實(shí)現(xiàn)的(以前面為例):
PUSH 10018888   //10018888指向ole32.dll名稱(chēng)。
CALL DWORD PTR DS:[10019990]   //10019990是LoadLibraryA的內(nèi)存指針。
結(jié)果放在EAX里面,返回值為模塊句柄。
2、GetProcAddress函數(shù)
GetProcAddress函數(shù)返回指定的輸出動(dòng)態(tài)鏈接庫(kù)內(nèi)的函數(shù)地址。它有二個(gè)參數(shù)。匯編語(yǔ)言是這樣實(shí)現(xiàn)的(以前面為例):
PUSH 1001888C   //1001888C指向CreateStreamOnHGlobal名稱(chēng)。
PUSH EAX   //EAX的值為L(zhǎng)oadLibraryA的返回值,即ole32.dll的句柄。
CALL DWORD PTR DS:[1001999C]   //1001999C為GetProcAddress函數(shù)的內(nèi)存指針。
結(jié)果也放在EAX里面,返回值為DLL輸出函數(shù)的內(nèi)存地址。
四、輸入表加密工具的原理和優(yōu)缺點(diǎn)
我在之前的文章中采用了一個(gè)加密工具,可以用來(lái)加密EXE的輸入表,通過(guò)這個(gè)工具加密之后,整個(gè)輸入表大部分消失了,只剩下kernel32.dll和它的二個(gè)API函數(shù),就是上面介紹的二個(gè),LoadLibraryA函數(shù)和GetProcAddress函數(shù)。它加密的原理就是采用LoadLibraryA函數(shù)和GetProcAddress函數(shù)在程序中用代碼加密的輸入表DLL的名稱(chēng)以及API函數(shù)的名稱(chēng)和內(nèi)存指針恢復(fù),用匯編語(yǔ)言實(shí)現(xiàn)是很簡(jiǎn)單的。
這個(gè)加密工具的缺點(diǎn)是只能加密部分EXE文件(雖然我對(duì)加密工具進(jìn)行了一個(gè)修正,但據(jù)反映,有些EXE文件還是不能用來(lái)加密輸入表),不能加密DLL文件。而且用這個(gè)工具加密后再通過(guò)我的改處理服務(wù)端的方法已經(jīng)被瑞星關(guān)注了,瑞星就在加后的輸入表GetProcAddress函數(shù)上。
五、手工編寫(xiě)輸入表隱藏和加密代碼
現(xiàn)在開(kāi)始本文的重點(diǎn),就是用手工編寫(xiě)代碼改變輸入表的結(jié)構(gòu),隱藏部分輸入表。我們以Pcshare中的PcMain.dll為例,為什么采用這個(gè)做為例子,因?yàn)橄乱粋€(gè)教程我準(zhǔn)備出DLL改教程,用這個(gè)教程為下一個(gè)教程做鋪墊。
我做二個(gè)示范,分別屬于二種情況,一種是隱藏輸入表中鏈接庫(kù)DLL和其所有API函數(shù),另外一種是只隱藏鏈接庫(kù)DLL中的某一個(gè)API函數(shù)。至于加密函數(shù)名稱(chēng),可以采用我的輸出表加密函數(shù)名稱(chēng)的辦法(雙字節(jié)異或加密),這里不做介紹了,一般采用隱藏輸入表就可以達(dá)到的目的。
PcMain.dll中ole32.dll只有一個(gè)函數(shù)CreateStreamOnHGlobal,把ole32.dll和其CreateStreamOnHGlobal隱藏, 另外隱藏shell32.dll中的ShellExecuteA函數(shù)。
1、加空區(qū)段。作為代碼寫(xiě)入的區(qū)域。記住程序原入口點(diǎn)為100116E3。
2、寫(xiě)入代碼。一般采用PUSHAD開(kāi)始,POPAD結(jié)束,以避免不必要的錯(cuò)誤。同時(shí)采用CALL(下一句的地址)和POP結(jié)構(gòu)實(shí)現(xiàn)程序的自定位,通過(guò)內(nèi)存的相對(duì)位置使程序也能用于DLL文件的輸入表隱藏。
我們記下幾個(gè)內(nèi)存值:
程序新入口點(diǎn)10018000
EBP:10018000
ole32.dll名稱(chēng)起始內(nèi)存地址:1001333C(用C32ASM尋找,再換算),與EBP的差值為4CC4。
CreateStreamOnHGlobal名稱(chēng)起始內(nèi)存地址:10013326(用C32ASM尋找,再換算),與EBP的差值為4CDA。
CreateStreamOnHGlobal原程序中起始內(nèi)存指針地址:1001236C(在OD里同時(shí)按CTRL和N,再查找),與EBP的差值為5C94。
Shell32.dll名稱(chēng)起始內(nèi)存地址:10013318(用C32ASM尋找,再換算),與EBP的差值為4CE8。
ShellExecuteA名稱(chēng)起始內(nèi)存地址:100132E0(用C32ASM尋找,再換算),與EBP的差值為4D20。
ShellExecuteA原程序中起始內(nèi)存指針地址:10012248(在OD里同時(shí)按CTRL和N查找),與EBP的差值為5DB8。
LoadLibraryA函數(shù)內(nèi)存指針:100121BC(在OD里同時(shí)按CTRL和N),與EBP的差值為5E44。
GetProcAddress函數(shù)內(nèi)存指針:1001210C(在OD里同時(shí)按CTRL和N),與EBP的差值為5EF4。
開(kāi)始寫(xiě)代碼,看操作。
代碼如下:
10018000     60               pushad
10018001     E8 00000000     call PcMain01.10018006//自定位
10018006     5D               pop ebp//EBP的值為本行地址
10018007     83ED 06         sub ebp,6
1001800A     8BDD             mov ebx,ebp
1001800C     81EB C44C0000   sub ebx,4CC4//EBX指向ole32.dll名稱(chēng)起始內(nèi)存地址

10018012     53               push ebx//作為參數(shù)進(jìn)棧
10018013     8BDD             mov ebx,ebp
10018015     81EB 445E0000   sub ebx,5E44//EBX指向LoadLibraryA函數(shù)內(nèi)存指針
1001801B     FF13         call dword ptr ds:[ebx]//調(diào)用LoadLibraryA函數(shù)
1001801D     8BF8             mov edi,eax//結(jié)果放在EDI
1001801F     8BDD             mov ebx,ebp
10018021   81EB DA4C0000   sub ebx,4CDA//EBX指向CreateStreamOnHGlobal名稱(chēng)起始內(nèi)存地址
10018027     53               push ebx//參數(shù)進(jìn)棧
10018028     57               push edi//參數(shù)進(jìn)棧
10018029     8BDD             mov ebx,ebp
1001802B     81EB F45E0000   sub ebx,5EF4//EBX指向GetProcAddress函數(shù)內(nèi)存指針
10018031     FF13             call dword ptr ds:[ebx]//調(diào)用GetProcAddress函數(shù)
10018033     8BDD             mov ebx,ebp
10018035     81EB 945C0000   sub ebx,5C94//EBX指向CreateStreamOnHGlobal原程序中起始內(nèi)存指針地址
1001803B     8903             mov dword ptr ds:[ebx],eax//將CreateStreamOnHGlobal內(nèi)存地址放入原內(nèi)存指針地址
1001803D     8BDD             mov ebx,ebp//以下步驟同上,處理ShellExecuteA
1001803F     81EB E84C0000   sub ebx,4CE8
10018045     53               push ebx
10018046     8BDD             mov ebx,ebp
10018048     81EB 445E0000   sub ebx,5E44
1001804E     FF13             call dword ptr ds:[ebx]
10018050     8BF8             mov edi,eax
10018052     8BDD             mov ebx,ebp
10018054     81EB 204D0000   sub ebx,4D20
1001805A     53               push ebx
1001805B     57               push edi
1001805C     8BDD             mov ebx,ebp
1001805E     81EB F45E0000   sub ebx,5EF4
10018064     FF13             call dword ptr ds:[ebx]
10018066     8BDD             mov ebx,ebp
10018068     81EB B85D0000   sub ebx,5DB8
1001806E     8903             mov dword ptr ds:[ebx],eax
10018070     61               popad
10018071   - E9 6D96FFFF     jmp PcMain01.100116E3//跳回原入口點(diǎn)
二進(jìn)制代碼如下:60 E8 00 00 00 00 5D 83 ED 06 8B DD 81 EB C4 4C 00 00 53 8B DD 81 EB 44 5E 00 00 FF 13 8B F8 8B DD 81 EB DA 4C 00 00 53 57 8B DD 81 EB F4 5E 00 00 FF 13 8B DD 81 EB 94 5C 00 00 89 03 8B DD 81 EB E8 4C 00 00 53 8B DD 81 EB 44 5E 00 00 FF 13 8B F8 8B DD 81 EB 20 4D 00 00 53 57 8B DD 81 EB F4 5E 00 00 FF 13 8B DD 81 EB B8 5D 00 00 89 03 61 E9 6D 96 FF FF
3、刪除原鏈接庫(kù)DLL和其API函數(shù)指針。對(duì)于ole32.dll我們采用LORDPE進(jìn)行操作,我們?cè)谳斎氡砝飫h除ole32.dll,對(duì)于ShellExecuteA我們采用C32ASM打開(kāi)文件,根據(jù)上面的ShellExecuteA原程序中起始內(nèi)存指針地址換算成偏移地址,然后將其填充為00。這樣我們的修改就好了。
修改好的輸入表里我們刪除了ole32.dll,ShellExecuteA雖然在輸入表里還存在,但是它的內(nèi)存指針已經(jīng)沒(méi)有了,可以用OD看下,同樣按CTRL和N,找到ShellExecuteA,看它的內(nèi)存指針變成了00。我們?cè)贠d跟蹤下,指針恢復(fù)了。
測(cè)試上線成功。功能無(wú)損。
這種方法適用于所有PE文件,包括EXE和DLL文件的輸入表處理。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 华池县| 兴化市| 灵山县| 张家川| 海宁市| 常山县| 高要市| 开化县| 什邡市| 新营市| 沂水县| 沾益县| 外汇| 抚远县| 襄樊市| 宁陕县| 阿克陶县| 武穴市| 宿松县| 安庆市| 海林市| 葫芦岛市| 喀喇沁旗| 青河县| 淮阳县| 图木舒克市| 罗山县| 富阳市| 霍城县| 乌拉特中旗| 河北省| 黄冈市| 谢通门县| 枣庄市| 河东区| 房山区| 合山市| 阳春市| 和龙市| 中阳县| 阳朔县|