使用ollydbg從零開始cracking第四十二章-acprotect v1.09脫殼尋找oep,繞過硬件_第1頁
使用ollydbg從零開始cracking第四十二章-acprotect v1.09脫殼尋找oep,繞過硬件_第2頁
使用ollydbg從零開始cracking第四十二章-acprotect v1.09脫殼尋找oep,繞過硬件_第3頁
使用ollydbg從零開始cracking第四十二章-acprotect v1.09脫殼尋找oep,繞過硬件_第4頁
使用ollydbg從零開始cracking第四十二章-acprotect v1.09脫殼尋找oep,繞過硬件_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第四十二章-ACProtect V1.09 脫殼(尋找OEP,繞過硬件斷點檢測,修復 Stolen code)更加復雜的殼-ACProtect 1 09。本章開始,一步步的來剖析這個殼的保護機制。該例子的名稱為 UnPackMe_ACProtect 1 09g f。配合好反反調(diào)試插件,用 OD 加載之。直接運行起來,看看會發(fā)生什么。這里我用的是Parcheado_4(西班牙語:Patched_4)這個OD,接著按照下圖來配置HideOD 0 12 反反調(diào)試插件,這樣就可以正常運行了,該殼會使用 Pros32Next 這類 API 函數(shù)來檢測 OD 進程,反反調(diào)試插件可以繞過。下面來定位 OEP

2、。前面章節(jié)介紹了很多定位 OEP 的方法,比如說可以使用 OD 自帶的功能就能定位到 OEP,打開主菜單項 Debuggingoptions-SFX,選擇 Trace real entry blockwise(inaccurate)。接著重啟 OD,不一會兒斷在了這里?,F(xiàn)在的問題是這里是否是真正的 OEP,或者說是不是存在 stolen bytes。來看一看堆棧的情況。現(xiàn)在不勾選自動定位 OEP 的選項,重啟 OD??梢钥吹奖乳_始的時候多了兩個值。一般來說,這樣情況存在 stolen bytes。下面來定位 stolen bytes。在定位 stolen bytes 之前,先來給大家介紹一下如

3、何利用 HBP txt 這個來設置硬件斷點,這個方法在的編寫那一章中介紹過了,大家應該還記得吧!通過來設置硬件斷點可以繞過很多殼對于硬件斷點的檢測。假如現(xiàn)在想通過設置硬件斷點讓程序斷在 OEP 處的話,會發(fā)現(xiàn)程序并不會斷下來,可以通過 HPB txt 這個來解決這個問題。下面就來給大家詳細講解硬件斷點為什么不觸發(fā)的原因,以及 HPB txt如何解決這個問題的。下面再次重啟 OD,分別給 KiUserExceptionDispatcher 以及其內(nèi)部調(diào)用的 ZwContinue 處設置斷點。下面來給 OEP 處設置一個硬件執(zhí)行斷點。此時在殼的處,單擊鼠標右鍵選擇-Goto-Expres,輸入地址

4、 4271B5。在這里設置一個硬件執(zhí)行斷點。單擊鼠標右鍵選擇 Breakpo -Hardware,on execution,接著運行起來。斷了下來,來看下堆棧情況。此時斷在了 KiUserExceptionDispatcher 的處,堆棧中偏移 4 的單元中存放了 context 的指針,下面到數(shù)據(jù)窗口中定位該context。這里我暫時不解釋 CONTEXT 結(jié)構(gòu)體各個字段的含義,等后面用到的時候再解釋。在寄存器窗口中,單擊鼠標右鍵選擇 View debug registers,切換到調(diào)試寄存器顯示模式,如果沒有該選項的話,說明當前已經(jīng)是調(diào)試寄存器顯示模式了。這些就是調(diào)試寄存器組,Dr0 Dr

5、7。Dr0,Dr1,Dr2,Dr3 是用于設置硬件斷點的,由于只有 4 個硬件斷點寄存器,所以同時最多只能設置 4 個硬件斷點。產(chǎn)生的異常是 SUS_SINGLE_STEP(單步異常)。Dr4,Dr5 是系統(tǒng)保留的。Dr7 是一些控制位,用于控制斷點的方式,Dr6 是用于顯示哪個硬件調(diào)試寄存器的斷點,如果是 Dr0 Dr3 的話,相應位會被置 1。即如果是 Dr0的斷點,則Dr6的第 0 位被置 1,如果是 Dr1的斷點,則 Dr6 的第 1 位被置 1,依次類推。因為硬件斷點同時只會觸發(fā)一個,所以 Dr6 的低 4 位最多只有一位被置 1,所以在進入單步后,可以通過檢測Dr6 的低 4 位是

6、否有 1 的位,就可以判斷該單步是否是因為硬件斷點被斷下的。如果是硬件斷點被斷下的,進而可以通過 Dr6 的哪一位為 1 來判斷是由 Dr0Dr3 中的哪個斷點斷下的。調(diào)試控制寄存器 Dr7 比較重要,其 32 位結(jié)構(gòu)如下:位 0 L0 和位 1 G0:用于控制 Dr0 是全局斷點還是局部斷點,如果 G0 為 1 則是全局斷點,如果 L0 為 1 則為局部斷點。G0,L0 G3,L3分別用于控制 Dr1Dr3。LE 和 GE:P6 family 和之后的 IA32 處理器都不支持這兩位。當設置時,使得處理器會檢測觸發(fā)數(shù)據(jù)斷點的精確的指令。當其中一個被設置的時候,處理器會放慢執(zhí)行速度,這樣當命令

7、執(zhí)行的時候可以通知這些數(shù)據(jù)斷點。建議在設置數(shù)據(jù)斷點時需要設置其中一個。切換任務時 LE 會被清除而 GE 不會被清除。為了兼容性,el 建議使用精確斷點時把 LE 和 GE 都設置為 1。LEN0 到 LEN3:指定調(diào)試地址寄存器 DR0 到 DR3 對應斷點所下斷的長度。如果 R/Wx 位為 0(表示執(zhí)行斷點),則 LENx 位也必須為0(表示 1 字節(jié)),否則會產(chǎn)生不確定的行為。LEN0 到 LEN3 其可能的取值如下:(1)00 1 字節(jié)(2)01 2 字節(jié)(3)10 保留(4)11 4 字節(jié)R/W0 到 R/W3:指定各個斷點的觸發(fā)條件。它們對應于 DR0 到 DR3 中的地址以及 D

8、R6 中的 4 個斷點條件標志??赡艿娜≈等缦拢海?) 00 只執(zhí)行(2) 01 寫入數(shù)據(jù)斷點(3) 10 I/O 端口斷點(只用于 pentium+,需設置 CR4 的DE 位,DE 是 CR4 的第 3 位 )(4) 11 讀或?qū)憯?shù)據(jù)斷點GD 位:用于保護 DRx,如果 GD 位為 1,則對 Drx 的任何都會導致進入 1 號調(diào)試陷阱(1)。即 IDT 的對應,這樣可以保證調(diào)試器在必要的時候完全控制 Drx。此時 Dr0 為 4271B5,表示 4271B5 地址處被設置了硬件斷點?,F(xiàn)在來看看 CONTEXT 結(jié)構(gòu)。這里可以看到 context 結(jié)構(gòu)中 Dr0Dr3 寄存器的內(nèi)容。黃色標注

9、的 4271B5 是設置了硬件斷點的地址。其他三個粉紅色標注的位零,因為只設置了一個硬件斷點,所以它們是空的。當異常處理完畢以后,context 中的值將被清零,一起來看一看,直接運行起來,斷在第二個斷點處??梢钥吹浇?jīng)過了異常處理以后,Dr0 被清零了,來恢復它。這里有兩種方案,第案:在斷在可以編寫KiUserExceptionDispatcher處時將 context 中調(diào)試寄存器的值保存一份。當斷在下面的 ZwContinue 的調(diào)用處時將調(diào)試寄存器的值恢復。第二種方案:在 context 中定位到程序的返回地址,在返回地址處設置一個斷點,當斷在返回地址處時恢復硬件斷點,相當于重新設置了一

10、次硬件斷點。好,這里采用第二種方案,但是現(xiàn)在的問題是程序的返回地址保存在 context 結(jié)構(gòu)中的哪里呢?Context 的起始地址偏移 0B8 地址處就保存了返回地址,12FC8C + 0B8 = 12FD44機器上是:12FD44 內(nèi)存單元中就保存著程序的返回地址,在中可以對返回地址設置一個斷點,當程序返回以后,再次設置硬件斷點,來看一看是怎么寫的。的開頭定義一個變量var 命令是用來一個變量,這個變量 RetAddr用來保存由異常返回的地址。這就是恢復硬件斷點的一部分,首先將 ESP 寄存器的值保存到 RetAddr 變量中。此時 RetAddr 保存 ESP 寄存器的值,接著再取其內(nèi)容

11、,也就是 context 結(jié)構(gòu)的首地址,我這里 context 的首地址為 12FC8C,接著加上0B8 等于 12FD44,12FD44 內(nèi)存單元中就保存了異常的返回地址。最后再次取內(nèi)容就得到了異常的返回地址,接著就對該返回地址設置斷點。然后運行起來。這里是判斷斷下來的地址是 KiUserExceptionDispatcher 的處,還是 ZwContinue 的調(diào)用處,還是異常的返回地址。這里是刪除異常返回地址處的斷點,接著重新設置硬件斷點。好了,下面來看看執(zhí)行的效果,重啟程序。通過這個來斷到 OEP 處?,F(xiàn)在來運行,設置KiUserExceptionDispatcher處以及下面ZwCo

12、ntinue 調(diào)用處的斷點,還要記得將忽略異常的選項都勾選上。這里可以看到斷在了硬件斷點處,選擇 NO,不繼續(xù)。好,現(xiàn)在斷在了 OEP 處。有些殼會通過一些方法來清除硬件斷點,現(xiàn)在就可以很完美的給 stolen bytes 設置硬件斷點了。首先來看看有沒有異常,從最后一次異常處開始。在日志窗口中可以看到在到達 OEP 之前產(chǎn)生了一次異常,可以看到類型是 Acs violation when reading。來清空掉相應的異常忽略選項。禁用掉中用到的斷點?,F(xiàn)在重新啟動,然后運行起來。斷在了最后一次異常處,給當前區(qū)段設置內(nèi)存斷點,讓其斷在異常處理程序中。按 Shift + F9 忽略異常運行起來。

13、按 F7 鍵單步幾下到達異常處理函數(shù)的 RET 處。接著運行起來,返回到了這里下面可以對 OEP 處設置斷點,因為此時殼已經(jīng)完畢了?,F(xiàn)在就可以從 471090 處開始了,不一會兒完畢了,現(xiàn)在到達了 OEP 處。來看一看的指令列表。這里的指令的最后幾行,這里可以搜索 PUSH EBP,一般是從上往下搜索,但這里前面位于系統(tǒng) DLL 中的 PUSH EBP 過多,所以這里從下往下搜索。(PS:由于這里的 TXT 又幾十 M,所以這里我使用的是 EditPlus)這里可以看到 stolen bytes,接著是 NOP 指令,然后使用 PUSHAD 指令保存寄存器環(huán)境,那么在跳往OEP 之前會使用POPAD 指令來恢復寄存器環(huán)境的。這里可以看到 stolen bytes 的數(shù)值部分是被保存在棧中的。EBP 寄存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論