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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論