麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 邏輯算法 > 正文

輸入表隱藏、加密的原理和手工實現

2019-09-10 09:02:02
字體:
來源:轉載
供稿:網友

一、前言:現在對輸入表的查已經成為軟件毒的一個重要方面,沒有一個軟件不把輸入表作為查的對象,通常的輸入表移位、重建已經不能作為的重要手段,可以說軟件也在逐步進步,而我先前倡導的輸入表按序號重建也因為存在系統兼容性問題不能作為輸入表的手段。如何改變輸入表部分的內容與結構,使其與原先的不同,這就是本文要討的問題。
二、目的:通過本文的學習,可以掌握手工導入輸入表和手工加密輸入表函數的名稱的辦法,并能學習到匯編語言的精辟。
三、基本知識
在開始之前,我們先來了解二個kernel32.dll的函數的使用方法,即:kernel32.LoadLibraryA和kernel32.GetProcAddress,它們是本文要用到的二個關鍵函數。具體的函數介紹可以看看這篇文章:《3個脫相關的重要函數介紹》http://bbs.pediy.com/showthread.php?threadid=20230
1、LoadLibraryA函數
LoadLibrary函數是把指定的可執行模塊映射進調用進程的地址空間。通俗的說,如程序需要調用ole32.dll里面的CreateStreamOnHGlobal函數,首先應該用LoadLibraryA函數找到ole32.dll的句柄。然后根據這個句柄用GetProcAddress找到CreateStreamOnHGlobal的內存指針。
它有一個參數,即動態鏈接庫名稱的內存地址。匯編語言是這樣實現的(以前面為例):
PUSH 10018888   //10018888指向ole32.dll名稱。
CALL DWORD PTR DS:[10019990]   //10019990是LoadLibraryA的內存指針。
結果放在EAX里面,返回值為模塊句柄。
2、GetProcAddress函數
GetProcAddress函數返回指定的輸出動態鏈接庫內的函數地址。它有二個參數。匯編語言是這樣實現的(以前面為例):
PUSH 1001888C   //1001888C指向CreateStreamOnHGlobal名稱。
PUSH EAX   //EAX的值為LoadLibraryA的返回值,即ole32.dll的句柄。
CALL DWORD PTR DS:[1001999C]   //1001999C為GetProcAddress函數的內存指針。
結果也放在EAX里面,返回值為DLL輸出函數的內存地址。
四、輸入表加密工具的原理和優缺點
我在之前的文章中采用了一個加密工具,可以用來加密EXE的輸入表,通過這個工具加密之后,整個輸入表大部分消失了,只剩下kernel32.dll和它的二個API函數,就是上面介紹的二個,LoadLibraryA函數和GetProcAddress函數。它加密的原理就是采用LoadLibraryA函數和GetProcAddress函數在程序中用代碼加密的輸入表DLL的名稱以及API函數的名稱和內存指針恢復,用匯編語言實現是很簡單的。
這個加密工具的缺點是只能加密部分EXE文件(雖然我對加密工具進行了一個修正,但據反映,有些EXE文件還是不能用來加密輸入表),不能加密DLL文件。而且用這個工具加密后再通過我的改處理服務端的方法已經被瑞星關注了,瑞星就在加后的輸入表GetProcAddress函數上。
五、手工編寫輸入表隱藏和加密代碼
現在開始本文的重點,就是用手工編寫代碼改變輸入表的結構,隱藏部分輸入表。我們以Pcshare中的PcMain.dll為例,為什么采用這個做為例子,因為下一個教程我準備出DLL改教程,用這個教程為下一個教程做鋪墊。
我做二個示范,分別屬于二種情況,一種是隱藏輸入表中鏈接庫DLL和其所有API函數,另外一種是只隱藏鏈接庫DLL中的某一個API函數。至于加密函數名稱,可以采用我的輸出表加密函數名稱的辦法(雙字節異或加密),這里不做介紹了,一般采用隱藏輸入表就可以達到的目的。
PcMain.dll中ole32.dll只有一個函數CreateStreamOnHGlobal,把ole32.dll和其CreateStreamOnHGlobal隱藏, 另外隱藏shell32.dll中的ShellExecuteA函數。
1、加空區段。作為代碼寫入的區域。記住程序原入口點為100116E3。
2、寫入代碼。一般采用PUSHAD開始,POPAD結束,以避免不必要的錯誤。同時采用CALL(下一句的地址)和POP結構實現程序的自定位,通過內存的相對位置使程序也能用于DLL文件的輸入表隱藏。
我們記下幾個內存值:
程序新入口點10018000
EBP:10018000
ole32.dll名稱起始內存地址:1001333C(用C32ASM尋找,再換算),與EBP的差值為4CC4。
CreateStreamOnHGlobal名稱起始內存地址:10013326(用C32ASM尋找,再換算),與EBP的差值為4CDA。
CreateStreamOnHGlobal原程序中起始內存指針地址:1001236C(在OD里同時按CTRL和N,再查找),與EBP的差值為5C94。
Shell32.dll名稱起始內存地址:10013318(用C32ASM尋找,再換算),與EBP的差值為4CE8。
ShellExecuteA名稱起始內存地址:100132E0(用C32ASM尋找,再換算),與EBP的差值為4D20。
ShellExecuteA原程序中起始內存指針地址:10012248(在OD里同時按CTRL和N查找),與EBP的差值為5DB8。
LoadLibraryA函數內存指針:100121BC(在OD里同時按CTRL和N),與EBP的差值為5E44。
GetProcAddress函數內存指針:1001210C(在OD里同時按CTRL和N),與EBP的差值為5EF4。
開始寫代碼,看操作。
代碼如下:
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名稱起始內存地址

10018012     53               push ebx//作為參數進棧
10018013     8BDD             mov ebx,ebp
10018015     81EB 445E0000   sub ebx,5E44//EBX指向LoadLibraryA函數內存指針
1001801B     FF13         call dword ptr ds:[ebx]//調用LoadLibraryA函數
1001801D     8BF8             mov edi,eax//結果放在EDI
1001801F     8BDD             mov ebx,ebp
10018021   81EB DA4C0000   sub ebx,4CDA//EBX指向CreateStreamOnHGlobal名稱起始內存地址
10018027     53               push ebx//參數進棧
10018028     57               push edi//參數進棧
10018029     8BDD             mov ebx,ebp
1001802B     81EB F45E0000   sub ebx,5EF4//EBX指向GetProcAddress函數內存指針
10018031     FF13             call dword ptr ds:[ebx]//調用GetProcAddress函數
10018033     8BDD             mov ebx,ebp
10018035     81EB 945C0000   sub ebx,5C94//EBX指向CreateStreamOnHGlobal原程序中起始內存指針地址
1001803B     8903             mov dword ptr ds:[ebx],eax//將CreateStreamOnHGlobal內存地址放入原內存指針地址
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//跳回原入口點
二進制代碼如下: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、刪除原鏈接庫DLL和其API函數指針。對于ole32.dll我們采用LORDPE進行操作,我們在輸入表里刪除ole32.dll,對于ShellExecuteA我們采用C32ASM打開文件,根據上面的ShellExecuteA原程序中起始內存指針地址換算成偏移地址,然后將其填充為00。這樣我們的修改就好了。
修改好的輸入表里我們刪除了ole32.dll,ShellExecuteA雖然在輸入表里還存在,但是它的內存指針已經沒有了,可以用OD看下,同樣按CTRL和N,找到ShellExecuteA,看它的內存指針變成了00。我們在Od跟蹤下,指針恢復了。
測試上線成功。功能無損。
這種方法適用于所有PE文件,包括EXE和DLL文件的輸入表處理。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 精品一区二区免费 | 午夜丰满少妇高清毛片1000部 | 午夜视频在线免费观看 | 成人影片在线免费观看 | 亚洲国产精久久久久久久 | 亚洲成在人 | 欧美特级黄色 | 国产精品中文在线 | 老师你怎么会在这第2季出现 | 最新黄色电影网站 | 最新欧美精品一区二区三区 | 97中文字幕第一一一页 | 亚洲国产色婷婷 | 日韩视频在线视频 | 黄色片免费看网站 | 精品一区二区三区毛片 | 亚洲视色 | 嗯~啊~弄嗯~啊h高潮视频 | 国产成人高潮免费观看精品 | av免费在线观看av | 久久久久久久久久综合 | 欧美国产日韩在线观看成人 | 中文字幕亚洲一区二区三区 | 黄色毛片a级 | 视频一区二区久久 | 黄色高清视频网站 | 一级性生活视频 | 中午字幕无线码一区2020 | 欧美一级毛片大片免费播放 | 日韩黄色三级视频 | 亚洲午夜在线 | 国产精品久久在线观看 | 欧美成人国产va精品日本一级 | wankz100%videos | 午夜视频免费在线观看 | 色婷婷一区二区三区 | 黄色毛片免费看 | 成人宗合网 | 九九热久久免费视频 | 91精品国产乱码久 | 欧美成人理论片乱 |