




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第七章Python逆向7.1PE文件結(jié)構(gòu)7.2靜態(tài)分析7.3反匯編技術7.4Hook技術習題
7.1PE文件結(jié)構(gòu)
7.1.1概述編程語言大致分為三類:機器語言、匯編語言和高級語言。比如高級語言C語言的源代碼經(jīng)過編譯鏈接后(參見圖7-1),在Windows系統(tǒng)下生成的可執(zhí)行程序都是以PE文件形式存儲。圖7-1編譯鏈接過程
PE文件全稱為PortableExecutable,意為可移植可執(zhí)行文件。常見的EXE、DLL、OCX、SYS、COM文件都屬于PE文件。PE文件采用段的形式存儲代碼和一些相關資源數(shù)據(jù),其中數(shù)據(jù)段和代碼段是每個PE文件所必需的。研究PE文件格式的主要目的,一是給應用程序添加代碼功能,比如注冊機代碼注入(KeygenInjection);二是手動給EXE脫殼。
由于所有Win32可執(zhí)行程序(除了VxD和16位的DLL)都使用PE文件格式,包括NT的內(nèi)核模式驅(qū)動程序(KernelModeDrivers),因而了解PE文件格式是學習Windows系統(tǒng)結(jié)構(gòu)的有效途徑。
PE文件的格式如圖7-2所示,其組成包括:
圖7-2PE結(jié)構(gòu)模型
(1)
DOS文件頭。所有PE文件(甚至32位的DLL)都必須以一個簡單的DOSMZheader開始。一旦程序在DOS下執(zhí)行,DOS就能識別出這是有效的執(zhí)行體,然后運行緊隨MZheader之后的DOSstub。DOSstub實際上是個有效的EXE,在不支持PE文件格式的操作系統(tǒng)中,它簡單顯示一個錯誤提示,類似于字符串“ThisprogramrequiresWindows”或者程序員可根據(jù)自己的意圖實現(xiàn)完整的DOS代碼。大多數(shù)情況下,它是由匯編器/編譯器自動生成。DOS文件頭有兩個字段比較重要,分別是e_magic和e.lfanew。其中e.lfanew字段是真正PE文件頭的相對偏移地址(RVA)。DOS文件頭如圖7-3所示。
圖7-3DOS文件頭
可執(zhí)行程序在支持PE文件結(jié)構(gòu)的操作系統(tǒng)中執(zhí)行時,PE裝載器將從DOSMZheader中找到PEheader的起始偏移量(0000003Ch),從而可以跳過DOSstub定位到真正的文件頭即PE文件頭,如圖7-4所示。
圖7-4定位真正的PE文件頭
(2)?PE文件頭。它是有效PE文件的簽名(Signature),其值為00004550h,ASCII碼字符串是“PE..”。
(3)?IMAGE_FILE_HEADER。它包含PE文件的基本信息,包括運行的平臺、文件的區(qū)塊數(shù)目、文件創(chuàng)建時間和IMAGE_OPTIONAL_HEADER的結(jié)構(gòu)大小,如圖7-5所示。
圖7-5PE文件頭結(jié)構(gòu)
(4)?IMAGE_OPTIONAL_HEADER。這是一個可選結(jié)構(gòu),用于更詳細定義PE文件屬性,與IMAGE_FILE_HEADER功能類似,其主要字段如圖7-6所示。
圖7-6PE可選頭結(jié)構(gòu)
(5)塊表。塊表是關于PE文件頭與原始數(shù)據(jù)的一個映射表。其中Name是相對應的塊名,VirtualAddress指明了塊的RVA地址,詳細信息參見圖7-7。
圖7-7PE塊表信息
(6)(區(qū))塊。PE預定義了多個區(qū)塊,.text是代碼區(qū)塊,.data、.rdata、.bss是數(shù)據(jù)區(qū)塊,.rsrc是資源區(qū)塊,.edata與.idata分別是輸出和輸入表區(qū)塊,.debug是調(diào)試信息區(qū)塊。例如:
塊的相關信息參見表7-1。
在后續(xù)對PE文件的操作過程中,經(jīng)常會對文件內(nèi)容以及內(nèi)存中的文件內(nèi)容進行讀取,此時將涉及多種形式的地址,因此,有必要對相關術語進行說明,具體信息參見表7-2。
表7-2中各地址之間的關系如下:
當要對一個PE文件插入代碼時,有一種方法是把代碼加入到一個存在的區(qū)塊的未用空間里。首先需要找到一個被映射到一個塊中且有執(zhí)行權限的區(qū)塊,最簡單的方法就是直接利用.text;然后需要查找這塊內(nèi)的多余空間(也就是填00h的個數(shù))。具體操作如圖7-8所示。
圖7-8.text起始地址?=?400000+1000=401000h
一個區(qū)塊(如.text)可以通過兩個變量的數(shù)值來計算其大小,這兩個變量分別是VirtualSize和SizeOfRawData,如圖7-9所示。
圖7-9
.text區(qū)塊的參數(shù)
圖7-9中,Misc_VirtualSize代表Section中代碼實際所占用的磁盤空間;SizeOfRawData代表根據(jù)磁盤對齊后所占的空間。通常SizeofRawData所占磁盤空間都會比VirtualSize的要大,而大出來的那部分就可以注入我們的代碼了。
FileAlignment定義磁盤區(qū)塊的對齊值,每個區(qū)塊從對齊值的倍數(shù)偏移位置開始。
eg:當FileAlignment=200h,第一個區(qū)塊在400h處開始,長度為90h,這一區(qū)塊對齊后就是400h~599h,其中490h~599h用0填充。而下一區(qū)塊就以600h開始。
SectionAlignment定義內(nèi)存區(qū)塊的對齊值,當其映射到內(nèi)存中時,每個區(qū)塊從頁邊界處開始。在X86系列CPU中,頁是按照4KB(1000h)來排列的。
eg:在磁盤中開始地址是400h的塊,映射到內(nèi)存中的裝入地址就是1000h字節(jié)處的。
地址映射關系如圖7-10所示,假設add1和add2的差值為?k,每個區(qū)塊的?k是不一樣的,有
某一虛擬地址(VA)?=?401112h,計算它的文件偏移地址(.text區(qū)塊中的差值為0C00h)如下:
圖7-10地址映射關系
7.1.2pefile
pefile是一個多平臺Python模塊,能夠?qū)OS_Header、OPTIONAL_HEADER和PESECTIONS進行全面的解析,也可以對PE結(jié)構(gòu)進行修改。利用pefile模塊可以得到PE文件關鍵的數(shù)據(jù)結(jié)構(gòu),從而進行靜態(tài)分析和二次開發(fā)。
pefile模塊的一些常用方法主要有:
(1)
set_bytes_at_offset():用給定的字符串覆蓋文件偏移量處的字節(jié)。
(2)
set_bytes_at_rva():用給定的字符串覆蓋RVA對應的文件偏移量處字節(jié)。
(3)
parse_export_directory():解析導出目錄。
(4)
parse_import_directory:遍歷并解析導入目錄。
(5)
parse_resources_directory:解析resources目錄。
(6)
write():寫入PE文件。
下面介紹pefile模塊的基本用法。
(1)獲取PE結(jié)構(gòu)信息。導入模塊并解析文件,將fast_load參數(shù)設置為True,將阻止解析目錄。代碼如下:
(2)獲取各個區(qū)塊的信息,代碼如下:
以上代碼運行結(jié)果如圖7-11所示。
圖7-11運行結(jié)果
(3)修改信息寫入磁盤。PE文件成功解析后,可以修改PE結(jié)構(gòu)里面的數(shù)據(jù),并作為PE實例屬性進行修改。代碼如下:
pe.OPTIONAL_HEADER.AddressOfEntryPoint=0xdeadbeef
pe.write(filename='file_to_write.exe')
(4)獲取導入的dll和表,代碼如下:
forentryinpe.DIRECTORY_ENTRY_IMPORT:
printentry.dll
forimpinentry.imports:
print'\t',hex(imp.address),
7.1.3腳本實例
[例7-1]
標識出hash值與函數(shù)的匹配關系。
shellcode和惡意軟件經(jīng)常使用hash算法混淆加載函數(shù)和鏈接庫,想要標識出hash值與函數(shù)的匹配關系,這就需要通過爬取Windows操作系統(tǒng)常用的鏈接庫列表,然后遍歷里面的函數(shù)。下述代碼以kernel32.dll為例。
[例7-2]
結(jié)合pydasm進行反匯編。
將pydasm和pefile模塊結(jié)合,先利用pefile模塊對PE文件解析,提取原始數(shù)據(jù);之后利用pydasm將其反匯編為匯編語句。
第03行對程序進行解析;第04行訪問PE結(jié)構(gòu)的AddressOfEntryPoint,得到程序執(zhí)行入口RVA(相對虛擬地址),再通過pe.OPTIONAL_HEADER.ImageBase得到程序的基地址,兩個地址的和就是VA(內(nèi)存虛擬地址);第06行返回PE文件的內(nèi)存布局相對應的數(shù)據(jù)。接下來,對數(shù)據(jù)進行反匯編,第09行pydasm.get_instruction創(chuàng)建一個指令對象;第10行將指令對象轉(zhuǎn)換為字符串表示。
上述代碼運行結(jié)果如圖7-12所示。
圖7-12代碼運行結(jié)果
[例7-3]
利用pefile對指定程序添加一個MessageBox彈窗。
要求:目標程序和執(zhí)行結(jié)果如圖7-13所示。
圖7-13目標程序和執(zhí)行結(jié)果
首先構(gòu)造一段彈窗的shellcode,將其插入到原程序中;然后修改程序入口地址為shellcode;再利用jmp指令跳轉(zhuǎn)到原程序入口,以保證原程序的正確執(zhí)行。
(1)獲取MessageBox地址(get_messagebox_address.c):
運行C語言程序,得到MessageBoxA的地址為0x751ffd1e。注意,這個地址對于每臺計算機是不一樣的。
(2)查詢call和jmp的機器指令:
call->E8
jmp->E9
(3)構(gòu)造shellcode
函數(shù)調(diào)用前4個參數(shù)入棧如圖7-14所示。
圖7-14參數(shù)入棧
在上述代碼中,0x00是待填充字段;E8的反匯編指令是call;E9的反匯編指令是jmp,后面也留空,等后續(xù)計算完成后再填充。
E8后邊的值 =真正要跳轉(zhuǎn)地址?-
E8當前指令的地址?+?E8當前指令的大小
=真正要跳轉(zhuǎn)地址?-
E8當前指令的下一行地址
(4)代碼區(qū)添加shellcode。首先,需要分析目標程序的PE結(jié)構(gòu),其主要字段如表7-3所示。
程序運行時,PE裝載器先創(chuàng)建進程,再將文件載入內(nèi)存,然后把EIP寄存器的值設置為ImageBase?+?AddressOfEntryPoint。第一區(qū)塊部分成員信息如表7-4所示。
然后,計算call后面的地址值。
①
MessageBox地址:0x751FFD1E(根據(jù)get_messagebox_address.c得到)。
②
call的機器指令:E8。
③?E8的下一指令在文件中的地址:X。
④?E8的下一指令映射到內(nèi)存中的地址:X?-?PointerToRawData+ImageBase+VirtualAddress。
⑤?E8(call)后面的值:MessageBox?-?E8的下一指令映射到內(nèi)存中的地址。
接著,計算jmp后面的地址值。
要保證所創(chuàng)建的MessageBox關閉后,程序能夠正常運行,可用jmp指令跳到原來的OEP入口地址。
①真正要跳轉(zhuǎn)的地址:ImageBase+AddressOfEntryPoint。
②?jmp的機器指令:E9。
③?E9的下一指令在文件中的地址:Y。
④?E9的下一指令映射到內(nèi)存中的地址:Y?-?PointerToRawData+ImageBase+VirtualAddress。
⑤?E9(jmp)后面的值:真正要跳轉(zhuǎn)的地址?-E9的下一指令映射到內(nèi)存中地址。
最后,計算并修改AddressOfEntryPoint。
文件中shellcode起始地址:Z。
AddressOfEntryPoint:Z-PointerToRawData+VirtualAddress。
接下來,可通過一個腳本來計算修改值:
以上代碼運行結(jié)果如圖7-15所示。
圖7-15運行結(jié)果
7.2
靜態(tài)分析
7.2.1概述靜態(tài)分析是指在程序尚未運行時進行的逆向分析行為,但也不是直接在硬盤上去分析,而是需要通過逆向軟件加載入內(nèi)存進行分析。當我們遇到軟件的某一模塊無法單獨運行或者病毒程序等情況時,就需要將目標軟件的二進制指令反匯編為匯編代碼,實現(xiàn)程序流程的靜態(tài)分析。
7.2.2IDAPython函數(shù)
IDAPython常用到的一些函數(shù)如表7-5所示。
7.2.3腳本實例
1.搜尋危險函數(shù)的交叉代碼
有一些函數(shù)被安全審計人員定義為危險函數(shù),對這類函數(shù)的使用不當將會產(chǎn)生一些安全問題,比如字符串拷貝例程(strcpy、sprintf)和缺乏長度檢查機制的拷貝函數(shù)(memcpy)。利用IDA可以查看程序使用的函數(shù)模塊名字,如圖7-16所示。
圖7-16調(diào)用的模塊名
下面將編寫一個腳本,用于搜尋程序中存在問題(或危險)的函數(shù)(如strcpy、sprintf和memcpy)以及所有調(diào)用這些危險函數(shù)的代碼引用。
將危險函數(shù)調(diào)用指令背景色設置為紅色,如圖7-17中灰色橫條所示。危險函數(shù)的地址如圖7-18所示。
圖7-17將危險函數(shù)背景色設置為紅色圖7-18危險函數(shù)地址
上述代碼的第02行列出危險函數(shù);第03、04行遍歷這些危險函數(shù),并通過LocByName(
)函數(shù)返回危險函數(shù)的內(nèi)存地址;第06行CodeRefsTo()得到該危險函數(shù)地址為目標地址的交叉引用;最后輸出地址,在第11行把這些危險函數(shù)的調(diào)用指令標注為紅色。
2.對重復函數(shù)進行高亮
對于許多復雜的代碼,不僅能靜態(tài)標識指令,并且能統(tǒng)計出對應的指令被使用了多少次。注意:因為要統(tǒng)計指令使用了多少次,所以要建立debugger并運行。
get_new_color(
)函數(shù)檢索出執(zhí)行的每一行并標識顏色,代碼會獲取給定行數(shù)代碼的當前顏色,決定將代碼設置成什么顏色并進行設定。將無顏色的代碼行數(shù)設置為高亮的藍色,對多次執(zhí)行的代碼函數(shù)設置為深藍色,在圖7-19中,分別對應圖中的淺灰色與深灰色。
圖7-19不同代碼的高亮
啟動調(diào)試器,然后通過調(diào)用RunTo(BeginEA())函數(shù)執(zhí)行到函數(shù)的入口處,接下來調(diào)用的GetDebuggerEvent()函數(shù)會等待直到斷點到達。
接著調(diào)用EnableTracing()函數(shù)來打開IDA的跟蹤功能;然后調(diào)用GetDebuggerEvent()函數(shù)會繼續(xù)執(zhí)行調(diào)試器,配置跟蹤步驟;最后進行顏色獲取和設定,運行結(jié)果如圖7-20所示。
圖7-20程序的流程圖
在圖7-20中,整塊的代碼分為幾種不同的顏色,函數(shù)的開始部分和結(jié)尾部分被執(zhí)行了一次,設置為淺藍色(即圖中淺灰色所示),因為這個程序是一個if分支語句,所以在右邊的代碼沒有被執(zhí)行則為白色;左邊的代碼為深藍色(即圖中深灰色所示),因為這里是一個循環(huán)語句,被多次執(zhí)行。這使得我們能夠更容易理解代碼執(zhí)行的流程。
3.跟蹤程序執(zhí)行路徑
每當命中一個斷點時,打印出所在地址。開啟IDA的內(nèi)建調(diào)試器,就會看到相關的輸出信息,這些輸出信息能夠使得調(diào)試器者更好地了解程序內(nèi)部函數(shù)的調(diào)用情況,以及它們之間的調(diào)用順序。
第02行首先建立一個FuncPath類,該類是DBG_Hooks的繼承類;第03行到第05行編寫類的函數(shù)dbg_bpt()用于斷點的處理;第06行debugger=FuncPath()建立一個對象debugger.hook(),將鉤子裝入IDA內(nèi)建調(diào)試器。
第09行遍歷所有的函數(shù),并添加相應的斷點。其中第11行的SetBptAttr()設置一個斷點控制標志,這個標志的作用是告訴調(diào)試器每當有斷點被觸發(fā)時,調(diào)試器不會停下。如果把這一步去掉,每次斷點命中只能手動將調(diào)試器復位。
最后輸出斷點的個數(shù)。
上述代碼執(zhí)行結(jié)果如圖7-21所示。雙擊斷點地址就可以定位到匯編代碼,如圖7-22所示。
圖7-21斷點被命中圖7-22定位匯編代碼
7.3反?匯?編?技?術
7.3.1
Capstone簡介
Capstone是一個輕量級的支持多平臺多架構(gòu)的反匯編框架。它可以支持多種硬件構(gòu)架,如ARM、ARM64、MIPS和x86。該框架使用C語言實現(xiàn),但它還支持C++、Python、Ruby、OCaml、C#、Java和Go語言,具有很好的擴展性。因此,該框架被256種工具所集成,如Cuckoo、Binwalk和IntelliJIDEA。滲透測試人員可以通過Python、Ruby語言編寫腳本,引入Capstone引擎,從而構(gòu)建自己的反匯編工具。
7.3.2Capstone安裝
方式一:Python安裝。
(1)
On*nixplatforms:
$sudopipinstallcapstone
(2)?OnWindowsplatforms:
$pipinstallcapstone
或
$pipinstallcapstone-windows
方式二:在終端輸入。
gitclone/aquynh/capstone
cdcapstone
make
makeinstall
7.3.3一個簡單例子
Capstone安裝完畢后,現(xiàn)在回答本節(jié)開頭的問題,如果我們獲取了一段機器碼,那么該如何將其反匯編成易讀易懂的匯編語言?在介紹Capstone的具體用法之前,先來看一個簡單的例子。
[例7-4]
分別用Capstone和IDAPro將一段機器碼反匯編成匯編代碼。
(1)?Capstone。
樣本輸出如下:
首先在第02行導入了Capstone;然后第03行是原始二進制代碼,本例中的代碼用十六進制來表示;接著在第04行創(chuàng)建了一個Cs類的實例對象并賦值給變量md;本例中,要反匯編的是x86架構(gòu)、32位模式的機器碼;在第05行通過Cs類的disasm()函數(shù)對機器碼進行反匯編,第一個參數(shù)是機器碼Byte數(shù)據(jù),第二個參數(shù)是這段代碼的“基地址”;該函數(shù)將反匯編所有代碼或者直到遇到一條錯誤的指令為止;disasm(
)將會返回一個包含CsInsn對象的列表,而for循環(huán)將會遍歷此列表中所有的CsInsn對象;最后第06行將輸出地址信息、助記符、操作數(shù)字符串。
(2)?IDAPro。
使用IDAPro對同一段機器碼進行反匯編的結(jié)果如圖7-23所示。
圖7-23
IDAPro反匯編結(jié)果
7.3.4
Capstone基本用法
1.
classCs
在例7-4代碼的第04行中出現(xiàn)了一個類——Cs類。當初始化一個Cs類時,需要給這個類傳入兩個參數(shù):硬件架構(gòu)(arch)和硬件模式(mode)。
目前,Capstone支持8種具有相應硬件模式的硬件架構(gòu),具體如表7-6所示。
注:還有幾種模式是由表中一些基本模式組合而成的,具體內(nèi)容參見網(wǎng)址/lang_python.html。
以下代碼為初始化一個ARM架構(gòu)、ARM模式的Cs類:
fromcapstoneimport*
CODE=“\x55\x48\x8b\x05\xb8\x13\x00\x00”
md=Cs(CS_ARCH_ARM,CS_MODE_ARM)
同樣,Cs類也提供了一些常用的屬性。
1)
detail
默認情況下,Capstone不會生成反匯編指令的詳細信息,如讀/寫隱式寄存器和語義組等。若需要這些信息,則需要啟用該選項,代碼如下:
md=Cs(CS_ARCH_x86,CS_MODE_32)
md.detail=True
但是,啟用detail選項后將生成更多的詳細信息,從而消耗更多的內(nèi)存,降低運行速度,因此只有在需要它時才啟用。如果不需要該選項,那么可以將其關閉,代碼如下:
md.detail=False
2)
syntax
在介紹syntax選項的基本用法之前,先介紹一下Intel語法和AT&T語法的區(qū)別。
(1)運算表達式(operands,即運算單元)的書寫順序相反。
Intel格式:<指令><目標><源>。
AT&T格式:<指令><源><目標>。
(2)
AT&T語法中,在寄存器名稱之前使用百分號(%)標記,在立即數(shù)之前使用美元符號($)標記。AT&T語法使用圓括號,而Intel語法則使用方括號。
(3)
AT&T語法里,每個運算操作符都需要聲明操作數(shù)的類型,如q指代quad(64位),l指代32位long型數(shù)據(jù),w指代16位word型數(shù)據(jù),b指代8位byte型數(shù)據(jù)等。
Intel語法和AT&T語法的其他區(qū)別請參考Sun公司發(fā)布的《x86AssemblyLanguageReferenceManual》。
x86匯編的默認語法是Intel語法。如果需要切換到AT&T語法,則需要對syntax選項進行相應操作。如下述代碼:
以上代碼運行結(jié)果如下:
3)
mode
我們可以通過mode選項更改模式。這對于Arm來說是非常有用的,因為某些操作需要在Arm和Thumb模式之間切換,這也是x86經(jīng)常發(fā)生的,我們希望在保護模式和實模式代碼之間來回切換。例如:
以上代碼運行結(jié)果如下:
Cs類提供了反匯編的方法——disasm()函數(shù):
disasm(code,offset,count=0)
disasm(
)函數(shù)是Cs類中一個非常重要的方法,其功能是對機器碼進行反匯編并返回一個CsInsn對象。其中,第一個參數(shù)code表示需要進行反匯編的機器碼數(shù)據(jù);第二個參數(shù)offset表示這段代碼的“基地址”。這個函數(shù)將反匯編所有的機器碼或者直到遇到一條錯誤的指令為止。
在Cs類中還有一個輕量級的反匯編二進制代碼的方法——disasm_lite()。
disasm_lite(code,offset,count=0)
disasm_lite()函數(shù)運行速度比disasm()的快20%左右,因為與disasm()方法不同,所以disasm_lite()只返回元組(address,size,mnemonic,op_str),而不是CsInsn對象。
下面介紹初始化一個x86架構(gòu)、64位模式的Cs類,并用反匯編二進制代碼并打印出匯編指令。代碼如下:
2.
classCsInsn
CsInsn類是另一個很重要同時也很常用的類。CsInsn類中包含了我們想要獲得的機器碼的所有內(nèi)部信息,如指令的地址、助記符等。這里簡單介紹一些CsInsn類中常用的屬性,如表7-7所示。
下述代碼可提取指令讀取的隱式寄存器的詳細信息,以及指令所屬的語義組。其中,md.disasm(CODE,0x1000)反匯編了“CODE”中的機器碼并返回了CsInsn對象,所以一般是不需要使用者自己去初始化一個CsInsn對象。
以上代碼運行結(jié)果如下:
7.3.5Capstone用法舉例
[例7-5]
結(jié)合pefile,按照x86架構(gòu)和32位模式,反匯編可執(zhí)行文件capstone.exe。
7.4Hook技術
7.4.1uhooker簡介
uhooker(即UniversalHooker)是攔截程序執(zhí)行的工具,可以攔截DLL內(nèi)部的API調(diào)用,以及查看內(nèi)存中可執(zhí)行文件的任意地址。
所謂通用(Universal)是指攔截一個程序中的函數(shù)有不同的方式,例如可以通過設置軟件斷點(int3h)、硬件斷點(cpuregs)或覆蓋函數(shù)的序言來跳轉(zhuǎn)到一個stub。以上提到的方式中,特別是最后一個,需要編寫鉤子腳本文件的程序員要熟悉想要攔截的函數(shù)。如果代碼是用C/C++語言這樣的編程語言來編寫的,那么每次攔截函數(shù)時,代碼都需要被重新編譯。但是uhooker允許程序員使用解釋性語言(Python)為不同的API和非API函數(shù)編寫鉤子,而不需要編譯任何東西。
鉤子腳本文件用Python編寫,當需要修改時,無須重新編譯處理程序。而且,每次調(diào)用鉤子函數(shù)時,鉤子腳本文件都從磁盤重新加載(由服務器執(zhí)行),這意味著可以更改鉤子函數(shù)的行為,而不必重新編譯代碼,或必須重啟正在被分析的應用程序。
7.4.2
uhooker安裝
uhooker安裝十分簡單,只需要將安裝包內(nèi)uhooker.dll、server.py和proxy.py三個文件全部拷貝到OllyDbg的安裝目錄下即可。
注:所有的Python腳本文件(即鉤子函數(shù)文件)必須被放置在OllyDbg的安裝目錄下;否則uhooker將找不到這些腳本文件,這些文件也就無法工作。
7.4.3工作原理
1.
uhooker的基本組件
(1)
uhooker內(nèi)核,一個OllyDbg插件(uhooker.dll)。
(2)配置文件(.cfg文件)。
(3)用Python編寫的服務器(server.py),用于處理與uhooker內(nèi)核的通信。
(4)一個使用Python(proxy.py)編寫的庫,其中包含了不同的用于實現(xiàn)與uhooker內(nèi)核通信的函數(shù)。開發(fā)人員可以使用這些函數(shù)對被攔截的進程進行不同的操作,例如讀取內(nèi)存、寫入內(nèi)存等。
(5)一個由開發(fā)人員編寫的Python腳本文件包含了被鉤住的函數(shù)或地址的代碼。該模塊使用Python庫proxy.py完成對相應進程的攔截。
2.運行過程
在解析完配置文件之后,OllyDbg加載一個定義了被攔截函數(shù)或地址的配置文件。當一個鉤子被觸發(fā)時,uhooker內(nèi)核與服務端進行通信并發(fā)送有關被攔截的函數(shù)或地址的信息,并且服務端執(zhí)行配置文件中定義的相應的鉤子函數(shù)。具體運行過程如圖7-24所示。
圖7-24運行過程
7.4.4基本用法
uhooker配置文件是一個常規(guī)的文本文件,其每行分別定義了被攔截的函數(shù)或地址。uhooker支持三種類型的鉤子,分別是:
(1)鉤子在進入函數(shù)前(類型“B”)。
(2)鉤子在函數(shù)返回后(類型“A”)。
(3)鉤子在當執(zhí)行到該地址時(類型“*”)。
Uhooker在攔截時可以采用兩種不同語法:
(1)攔截從一個dll導出的函數(shù):
name_of_dll:function_name:number_of_parametes:python_module.hook_handler_name:hook_type
例如在文件mymodule.py中,使用鉤子CreateFileA_handler在CreateFileA函數(shù)執(zhí)行前攔截該函數(shù)的語法如下:
kernel32.dll:CreateFileA:7:mymodule.CreateFileA_handler:B
(2)在一個進程的某個地址處設置斷點:
field_not_used:address_to_hook_in_hex:field_not_used:python_module.hook_handler_name:hook_type
例如在mymodule.py文件中,使用鉤子anybp在地址0x401000處設置斷點。
Dummy.dll:0x401000:0:mymodule.anybp:*
一旦配置文件編寫完畢,就可以通過OD來加載。在菜單欄中“Plugins”的下拉列表中選中“uhooker”,再選中“LoadCfgFile”,如圖7-25所示。
圖7-25選中“LoadCfgFile”
在彈出的對話框中選擇要加載的配置文件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 法律行業(yè)合同法與知識產(chǎn)權試題集
- 大規(guī)模數(shù)據(jù)分析與應用實戰(zhàn)指南
- 孵化器房屋租賃合同
- 管道襯膠施工方案
- 南通環(huán)保槽鋼施工方案
- 包柱廣告施工方案
- 平面夯實施工方案
- 帶電開挖電纜施工方案
- 旋挖咬合樁施工方案
- 部分區(qū)縣一模數(shù)學試卷
- 2022年大唐集團招聘筆試試題及答案
- 醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范培訓試題及答案
- 監(jiān)理工作業(yè)務指導手冊(頁含圖表)
- 新大象版科學四年級下冊珍貴的淡水資源課件公開課一等獎課件省賽課獲獎課件
- 2023年陜西延長石油(集團)有限責任公司招聘筆試題庫含答案解析
- 水稻種子生產(chǎn)技術
- 財經(jīng)紀律規(guī)范財務管理辦法
- 第四章 學習心理導論
- 旅游政策與法規(guī)教案
- 科創(chuàng)板開戶試題附答案
- 長輸管道工序監(jiān)理作業(yè)指導書
評論
0/150
提交評論