版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五十二章-ASProtect v2.3.04.26 脫殼-Part2上次給大家搞的一個(gè)小比賽已經(jīng)結(jié)束了。由于難度比較大,所以我僅僅只收到了提交來(lái)的少數(shù)幾份穎而出了,Hiei 童鞋就成功編寫出將加了 ASProtect 殼的 UnPackMe 的AntiDump 修復(fù)了。盡管如此,還是有童鞋脫這里需要提一下,很多時(shí)候的 OD 加載了 OllyAdvanced 插件,調(diào)試加了 ASProtect 殼的程序無(wú)法正常運(yùn)行。這是因?yàn)镺llyAdvanced 這款插件中的 AntiRDTSC 這個(gè)功能加載的驅(qū)動(dòng)導(dǎo)致的,AntiRDTSC 這個(gè)反反調(diào)試功能并不兼容所有機(jī)器。不知道大家對(duì) RDTSC 了不了
2、解,很多殼利用該指令檢測(cè)某段程序執(zhí)行的時(shí)間間隔以此來(lái)判斷該程序是否正在被調(diào)試。但是現(xiàn)在開(kāi)始流行多核了,已經(jīng)不宜再用 RDTSC 指令來(lái)測(cè)試指令周期和時(shí)間了。我看了一下 ASProtect 的版本,已經(jīng)沒(méi)有采用 RDTSC 指令來(lái)進(jìn)行反調(diào)試了,很可能是考慮到多核系統(tǒng)的兼容問(wèn)題,所以這里就不必糾結(jié)這個(gè)問(wèn)題了。好了,下面用上一章中介紹的方法定位到 OEP,下面來(lái)執(zhí)行下面的這個(gè)看看效果。現(xiàn)在處于 OEP 處,這里大家需要注意一下,Hiei 童鞋的這個(gè)不能在老版本的 OllyScript 下執(zhí)行,大家需要使用新版本的OllyScript 插件,這里我找到了 OllyScript 的新版,大家自行附件中的
3、 ODbgScript 添加到 OD 的插件目錄下就行。添加了新版的 OllyScript 插件以后,重啟 OD,再次來(lái)到了 OEP 處,大家了關(guān)閉break-on execute 這個(gè)選項(xiàng)(PS:這里并沒(méi)有使用作者介紹的這個(gè)方法來(lái)定位 OEP,作者介紹的方法已經(jīng)失靈了,所以不必關(guān)閉break-on execute 這個(gè)選線帶來(lái)的影響),不然會(huì)出問(wèn)題的。雖然這是 OllyScript 插件新的版本,但是由于與老版本的名字并不相同,所以 OD 插件菜單中新老兩個(gè)插件都顯示出來(lái)了。選擇新版的 OllyScript,然后定位到 Hiei 童鞋的。這里啟動(dòng)以后,要求輸入待修復(fù) CALL 的地址,這里機(jī)
4、器該地址是 19A0000。(PS:大家機(jī)器上這個(gè)待修復(fù)的地址可能不盡相同,請(qǐng)根據(jù)自己機(jī)器的地址來(lái)輸入)地址輸入完以后,單擊 OK,該稍等片刻。就開(kāi)始執(zhí)行了。這里可以看到之前那些 CALL 19A0000 的指令已經(jīng)被修復(fù)了,嘿嘿,HIEI 童鞋寫的很好用,贊一個(gè)。接著使用 OllyDump 對(duì)其進(jìn)行 dump(PS:這里我就不按作者的來(lái)了,我直接用 OllyDump 來(lái)修復(fù) IAT,所以選中了 Rebuild Import這一項(xiàng)中 Method1)。接下來(lái)直接運(yùn)行 dump 并修復(fù) IAT 的程序看看效果。可以看到完美運(yùn)行。下面是 Hiei 童鞋的,Hiei 童鞋加了詳細(xì)的注釋,接下來(lái)我來(lái)給
5、大家一一做講解。/*-=-CracksLatinoS:本作者 Hiei目的:修復(fù) ASProtect v2 3 SKE AntiDump目標(biāo)程序:UnPackMe_ASProtect 2 3 04 26 a exe配置: ODbgScript v1 3x 或者更高版本,執(zhí)行到 OEP 處,忽略所有異常日期: 2006 年 8 月 5 日- = 備注 = -感謝:Ricardo Narvaja 和 Martian 的指導(dǎo)沒(méi)有上面兩位老師的指導(dǎo),我就不能順利編寫這個(gè))-=-*/var var_oepvar var_codebasevar var_codesizevar var_base_asprv
6、ar var_base_aipvar var_ini_iatvar var_dirvar var_dir_iatvar var_sigvar var_destvar var_apivar var_countcmp $VER,1 30/ 檢查OllyScript 插件的版本jb err_verask 請(qǐng)輸入 ASProtect 構(gòu)造 CALL 的地址:cmp $RESULT,0je to_leavemov var_base_aip,$RESULT/ 保存用戶輸入的待修復(fù)的地址mov var_oep,eip/ 將 OEP 保存到變量 var_oep 中g(shù)mi eip,codebase/ 獲取主程序
7、代碼段的址mov var_codebase,$RESULT/ 將代碼段的址保存到變量var_codebase 中g(shù)mi eip,codesize/ 獲取代碼段的大小mov var_codesize,$RESULT/ 將代碼段的大小保存到變量 var_codesize 中add var_codesize,var_codebase/ 計(jì)算代碼段的結(jié)束位置mov var_ini_iat,460814/ 將 IAT 的起始地址保存到變量 var_ini_iat 中mov var_base_aspr,46C048/ 保存知要調(diào)用哪個(gè) API 函數(shù)指令地址所在區(qū)段的址(該區(qū)段由ASProtect 創(chuàng)建)a
8、dd var_base_aspr,3B02E/ 在址的基礎(chǔ)上加上這個(gè)常量就可以定位到關(guān)鍵地址了bphws var_base_aspr,x/ 對(duì)該關(guān)鍵地址設(shè)置硬件執(zhí)行斷點(diǎn)jmp to_lookforto_lookfor:find var_codebase,#E8?#/ 從代碼段址處開(kāi)始查找以機(jī)器碼 E8 開(kāi)頭的 CALLcmp $RESULT,0/ 如果沒(méi)有找到,就輸出總共找到的 CALL 個(gè)數(shù),并退出je no_callsmov var_dir,$RESULT/ 如果找到的以機(jī)器碼 E8 開(kāi)頭的 CALL,就把該 CALL 的地址保存到變量 var_dir 中mov var_sig,var_d
9、ir/ 將找到的以機(jī)器碼 E8 開(kāi)頭的 CALL 的地址保存到變量var_sig 中mov var_dest,var_dir/ 將找到的以機(jī)器碼 E8 開(kāi)頭的 CALL 的地址保存到變量var_dest 中add var_sig,5/ 計(jì)算該 CALL 下一條指令的地址并保存到變量 var_sig 中inc var_dest/ 將指針指向偏移量,并將指向偏移量的指針保存到變量 var_dest 中mov var_dest,var_dest/ 獲取操作碼 E8 后的偏移量,并保存到變量var_dest 中add var_dest,var_sig/ 計(jì)算 CALL 的目標(biāo)地址cmp var_des
10、t,var_base_aip/ 判斷 CALL 的目標(biāo)地址是否與用戶輸入的地址相同,如果相同則跳轉(zhuǎn)到 to_execute處進(jìn)行下一步處理je to_executeinc var_dir/ 如果 CALL 的目標(biāo)地址與用戶輸入的地址不相同,則繼續(xù)查找待修復(fù) CALL 的地址mov var_codebase,var_dir/ 更新待查找的地址并保存到 var_codebase 中jmp to_lookforto_execute:/ 是用戶輸入的待修復(fù) CALL 的目標(biāo)地址mov eip,var_dir/ 將 EIP 修改為待修復(fù) CALL 所在的地址run/ 運(yùn)行起來(lái)eob to_verify/
11、 如果斷下來(lái)了,就跳轉(zhuǎn)到 to_verify處to_verify:cmp eip,var_base_aspr/ 判斷斷下來(lái)的地方是不是關(guān)鍵地址(執(zhí)行到該關(guān)鍵地址處時(shí),此時(shí)的 EDX 中保存了實(shí)際要調(diào)用 API 函數(shù)的地址)jne unexpected/ 如果斷下來(lái)的地方不是關(guān)鍵地址處,說(shuō)明發(fā)生異常了,直接跳轉(zhuǎn)到 unexpected處,進(jìn)行異常處理mov var_api,edx/ 如果斷下來(lái)的地方是關(guān)鍵地址處,則將 EDX 寄存器中實(shí)際要調(diào)用 API 函數(shù)的地址保存到變量 var_api 中jmp to_lookfor_api/ 跳轉(zhuǎn)到 to_lookfor_api處,進(jìn)行下一步的處理to_l
12、ookfor_api:cmp var_ini_iat, 460F28/ 判斷是否超出了IAT 的范圍je error/ 如果超出了 IAT 的范圍,說(shuō)明并沒(méi)有在 IAT 中定位到API 函數(shù)對(duì)應(yīng)的IAT 項(xiàng)cmp var_ini_iat,var_api/ 判斷是否是與該 API 函數(shù)地址對(duì)應(yīng)的 IAT 項(xiàng)je to_repair/ 如果是與該 API 函數(shù)對(duì)應(yīng)的 IAT 項(xiàng),則跳轉(zhuǎn)到 to_repair處add var_ini_iat,4/ 如果不是與該API 函數(shù)對(duì)應(yīng)的IAT 項(xiàng),將指向 IAT 的指針往后移 4 個(gè)字節(jié),便于下一次查找jmp to_lookfor_api/ 跳轉(zhuǎn)到 to_l
13、ookfor_api處繼續(xù)查找 IAT 項(xiàng)to_repair:mov var_dir_iat,var_ini_iat/ 將與該API 函數(shù)對(duì)應(yīng)的 IAT 項(xiàng)的指針保存到變量var_dir_iat 中ref var_dir/ 搜索該待修復(fù)的 CALL 的參考處cmp $RESULT,0/ 判斷待修復(fù)的 CALL 的指令有沒(méi)有參考jne repair_jump/ 如果待修復(fù) CALL 的指令有參考,則跳轉(zhuǎn)到repair_jump處eval Call dwordvar_dir_iatasm var_dir,$RESULT/ 將待修復(fù)的 CALL 匯編成 CALL DWORD對(duì)應(yīng) IAT 項(xiàng)的指針的形
14、式inc var_count/ 更新已修復(fù)項(xiàng)的計(jì)數(shù)inc var_dirmov var_codebase,var_dirmov var_ini_iat,460814/ 將 var_ini_iat 變量重新設(shè)置為IAT 的起始位置,以便下次查找jmp to_lookforrepair_jump:eval Jmp dwordvar_dir_iatasm var_dir,$RESULT/ 將待修復(fù)的 CALL 匯編成 JMP DWORD對(duì)應(yīng) IAT 項(xiàng)的指針的形式inc var_countinc var_dirmov var_codebase,var_dirmov var_ini_iat,46081
15、4/ 將var_ini_iat 變量重新設(shè)置為 IAT 的起始位置,以便下次查找jmp to_lookforunexpected:msg 發(fā)生異常了,是否繼續(xù)cmp $RESULT,0je to_leaverunerror:eval 錯(cuò)誤,請(qǐng)手動(dòng)修改 CALL 的地址: var_dirhmsg $RESULTrunno_calls:bphwc var_base_aspreval 任務(wù)完成! 總共修復(fù)var_counth 個(gè) CALL?;)msg $RESULTjmp to_leaveerr_ver :msg 錯(cuò)誤,OllyScript 版本過(guò)低!retto_leave:bphwc var_ba
16、se_asprmov eip,var_oepret附幾張的截圖:我感覺(jué)上面中的注釋已經(jīng)夠詳細(xì)了,不需要我再一條語(yǔ)句一條語(yǔ)句的解釋了。這里我需要解釋的就是其如何實(shí)現(xiàn)在任意機(jī)器上定位 ASProtect 的函數(shù)的,這里它并沒(méi)有采用我說(shuō)的內(nèi)存這里是保存 ASProtect 創(chuàng)建區(qū)段的起始地址。斷點(diǎn)的方式。mov var_base_aspr,46C048/ 保存知要調(diào)用哪個(gè)API 函數(shù)指令地址所在區(qū)段的址(該區(qū)段由ASProtect 創(chuàng)建)add var_base_aspr,3B02E/ 在址的基礎(chǔ)上加上這個(gè)常量就可以定位到關(guān)鍵地址了bphws var_base_aspr,x/ 對(duì)該關(guān)鍵地址設(shè)置硬件執(zhí)
17、行斷點(diǎn)jmp to_lookfor在 46c048 這個(gè)地址指向的內(nèi)存單元中可以定位到關(guān)鍵地址(由該關(guān)鍵地址指令所在處可以得知要實(shí)際要調(diào)用哪個(gè) API函數(shù))所在區(qū)段的址,然后加上一個(gè)常量就可以得到關(guān)鍵地址,這樣就可以實(shí)現(xiàn)在各個(gè)機(jī)器上通用。因?yàn)椴煌臋C(jī)器上可以該基地址可能會(huì)不相同,但是關(guān)鍵地址的偏移量是相同的,這里的關(guān)鍵地址的偏移量就是 3B02E。所在接著對(duì)該關(guān)鍵地址設(shè)置硬件執(zhí)行斷點(diǎn)。好了,下面從起始地址為 401000 的代碼段開(kāi)始搜索目標(biāo)地址為用戶輸入 CALL 的地址。to_execute:/ 是用戶輸入的待修復(fù) CALL 的目標(biāo)地址mov eip,var_dir/ 將 EIP 修改為待
18、修復(fù) CALL 所在的地址run/ 運(yùn)行起來(lái)這里將 EIP 設(shè)置為待修復(fù) CALL 的地址,然后運(yùn)行起來(lái),緊接著下面的 eob to_verify 命令是遇到中斷則跳轉(zhuǎn)到 to_verify處。eob to_verify/ 如果斷下來(lái)了,就跳轉(zhuǎn)到 to_verify處這里是驗(yàn)證是否斷在了之前設(shè)置的硬件執(zhí)行斷點(diǎn)的指令處,如果是,則跳轉(zhuǎn)到 to_verify進(jìn)行下一步處理。to_verify:cmp eip,var_base_aspr/ 判斷斷下來(lái)的地方是不是關(guān)鍵地址(到執(zhí)行到該關(guān)鍵地址處時(shí),此時(shí)的 EDX 中保存了實(shí)際要調(diào)用 API 函數(shù)的地址)jne unexpected/ 如果斷下來(lái)的地方不
19、是關(guān)鍵地址處,說(shuō)明發(fā)生異常了,直接跳轉(zhuǎn)到 unexpected處,進(jìn)行異常處理mov var_api,edx/ 如果斷下來(lái)的地方是關(guān)鍵地址處,則將 EDX 寄存器中實(shí)際要調(diào)用 API 函數(shù)的地址保存到變量var_api 中jmp to_lookfor_api/ 跳轉(zhuǎn)到 to_lookfor_api處,進(jìn)行下一步的處理這里是判斷是不是斷在了關(guān)鍵地址處(該關(guān)鍵地址處,EDX 寄存器中保存了實(shí)際要調(diào)用API 函數(shù)的地址),如果不是斷在關(guān)鍵地址處,就表示出錯(cuò)了,就跳轉(zhuǎn)到 unexpected處(異常處理),如果斷在了關(guān)鍵地址處,則保存 EDX 中的 API 函數(shù)地址,接著跳轉(zhuǎn)到to_lookfor_a
20、pi處進(jìn)行下一步處理。to_lookfor_api:cmp var_ini_iat, 460F28/ 判斷是否超出了IAT 的范圍je error/ 如果超出了 IAT 的范圍,說(shuō)明并沒(méi)有在 IAT 中定位到API 函數(shù)對(duì)應(yīng)的IAT 項(xiàng)cmp var_ini_iat,var_api/ 判斷是否是與該 API 函數(shù)地址對(duì)應(yīng)的 IAT 項(xiàng)je to_repair/ 如果是與該 API 函數(shù)對(duì)應(yīng)的 IAT 項(xiàng),則跳轉(zhuǎn)到 to_repair處add var_ini_iat,4/ 如果不是與該API 函數(shù)對(duì)應(yīng)的IAT 項(xiàng),將指向 IAT 的指針往后移 4 個(gè)字節(jié),便于下一次查找jmp to_lookfor_api/ 跳轉(zhuǎn)到 to_lookfor_api處繼續(xù)查找 IAT 項(xiàng)這里判斷待查找的 IAT 指針是否超出了 IAT 的范圍,如果指針已經(jīng)超出 IAT 的范圍,說(shuō)明沒(méi)找到與之匹配的 IAT 項(xiàng),則跳轉(zhuǎn)到 error處,請(qǐng)用戶重新輸入待修復(fù)的地址。如果在 IAT 中查找到了 API 函數(shù)對(duì)應(yīng)的 IAT 項(xiàng),則跳轉(zhuǎn)到 to_repair處進(jìn)行修復(fù)處理。修復(fù)處理如下:首先判斷待修復(fù) CALL 指令是否存在參考,如果不存在存在處則將其匯編為 CALL 對(duì)應(yīng) IAT 項(xiàng)的地址的形式,如果存在參考,則將其匯編為 JMP 對(duì)應(yīng) IAT 項(xiàng)的地址的
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鴨產(chǎn)業(yè)鏈國(guó)際化拓展策略-洞察分析
- 2024年枝江市人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 《電工及電子基礎(chǔ)》課件
- 2025年湘師大新版高一數(shù)學(xué)下冊(cè)階段測(cè)試試卷
- 2024年滬科版必修2地理下冊(cè)階段測(cè)試試卷
- 2025年粵教滬科版七年級(jí)科學(xué)下冊(cè)階段測(cè)試試卷含答案
- 2024年滬科版八年級(jí)化學(xué)上冊(cè)階段測(cè)試試卷含答案
- 《相交流異步電動(dòng)機(jī)》課件
- 學(xué)習(xí)資料零花錢協(xié)議
- 企業(yè)電費(fèi)違約金管理策略
- 2023-2024學(xué)年河北省高二上學(xué)期期末考試生物試題(解析版)
- 金剛砂固化地坪施工合同
- 車輛駕駛考試培訓(xùn)委托書(shū)
- 開(kāi)票稅點(diǎn)自動(dòng)計(jì)算器
- 2024親戚借名買房協(xié)議書(shū)
- 小學(xué)二年級(jí)上冊(cè)數(shù)學(xué)-數(shù)角的個(gè)數(shù)專項(xiàng)練習(xí)
- 期末核心素養(yǎng)測(cè)評(píng)卷2023-2024學(xué)年語(yǔ)文五年級(jí)上冊(cè)+統(tǒng)編版
- 醫(yī)療器械質(zhì)量安全風(fēng)險(xiǎn)會(huì)商管理制度
- 《我愛(ài)上班》朗誦稿
- 2024年石油石化技能考試-石油鉆井工筆試參考題庫(kù)含答案
- 2024年度帶狀皰疹課件
評(píng)論
0/150
提交評(píng)論