前言
首先感謝L4nce的學(xué)長們寫了《談Safengine系列的脫殼》,給了我很大的幫助,讓我開始了脫殼的入門。
L4nce的這篇文章一直被認(rèn)為是“巨人的肩膀”,但我覺得還是有一些東西可以寫得詳細(xì)一點(diǎn)。因?yàn)槭堑谝淮螌W(xué)炮擊和寫劇本,沒人指點(diǎn),請大家指正。
我美妙的旅程
至此,我就假設(shè)大家都讀完了L4nce的文章。接下來,我想說一些他在文章中沒有寫或者寫得很完整的東西,以及我的一些“奇妙旅程”。
關(guān)于用脫殼寫腳本的研究,我從簡單的程序(只有幾個API調(diào)用的匯編器)開始,分析了調(diào)用iat的代碼的特點(diǎn)和功能,然后寫了一個簡單的腳本來測試脫殼的成功。然后用比較復(fù)雜的程序(易語言靜態(tài)編譯器)測試腳本,改進(jìn)修改。
在我看來,這種方法可能比較費(fèi)時,但可以逐步解決困難,避免“卡”在莫名其妙的問題上。
先說SE的IAT加密。。。一開始劇本是按照L4nce的思路寫的,最后脫殼之類的測試成功。。。直到我打上√“使用哈希API函數(shù)名”然后測試外殼,才會無效。
分析了一下,我就不再走加edi,eax獲取API地址的路了。這樣的話,你只能另找方法獲取API地址了
這迫使我重新分析了兩個案例中調(diào)用鎮(zhèn)靜劑_section的過程,以尋找共同點(diǎn)和突破點(diǎn)。
一般來說,為了程序的速度,shell不會對原程序的iat調(diào)用加密太多,最多在第一次運(yùn)行的時候運(yùn)行的時間長一點(diǎn),然后就立刻得到目標(biāo)地址,調(diào)用API或者給寄存器分配API地址。這一點(diǎn),我認(rèn)為不僅適用于se,也適用于其他加密外殼。如果你遵循這個想法,你總能找到希望。
終于找到了一個點(diǎn):推xxxxxx
se獲得虛擬機(jī)中的目標(biāo)(API)地址后,會修改為推送目標(biāo)地址
因此,我修改了腳本流程:
1.查找呼叫鎮(zhèn)靜劑部分
2.步進(jìn)跟蹤查找推送xxxxxx和CMP DWORD PTRS: [ESP+0x4],0
3.立即將斷點(diǎn)寫入推送的硬件,以獲取目標(biāo)(應(yīng)用編程接口)地址
4.確定IAT呼叫的類型并進(jìn)行維修
關(guān)于第四點(diǎn),L4nce說了大部分情況,但有些特殊情況沒有詳細(xì)說明。我想在這里列出相關(guān)信息:
常見:
1 .調(diào)用dword ptr [iat]
2.jmp dword ptr [iat]
3.mov reg,dword ptr [iat]
呼叫注冊
罕見:
4.call @ jmp dword ptr [iat]
jmp dword ptr [iat]
在第四種情況下,調(diào)用有時是加密的,有時不是(但它調(diào)用的jmp dword ptr [iat]肯定是加密的)。在這種情況下,我們應(yīng)該始終將其視為加密。
判斷呼叫IAT的類型
在L4nce方法的基礎(chǔ)上,我做了一些大的改動。方法如下:
1.為兩個可能的返回地址設(shè)置一個單字節(jié)斷點(diǎn)(int3 ):調(diào)用section+5和section+6。
2.確定獲取的目標(biāo)(API)地址是否大于外殼段,從而確定是Mov_Reg類型還是其他IAT調(diào)用類型
見雪id: lixinist
https://bbs.pediy.com/thread-251066.htm
這篇文章最初是由一個名為Lixinist的雪論壇創(chuàng)建的
轉(zhuǎn)載,請來自觀雪社區(qū)注明
熱門書籍推薦
現(xiàn)在戳買!
1.《IAT Safengine Shielden v2.40 IAT修復(fù)及腳本編寫》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《IAT Safengine Shielden v2.40 IAT修復(fù)及腳本編寫》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/yule/1059017.html