最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Getright 5 手動脫殼和重建IAT--第二部分(圖)

互聯(lián)網(wǎng)   發(fā)布時間:2008-10-08 19:05:33   作者:佚名   我要評論
在本參考教程的第一部分我們學習了如何正確地轉儲(dump)Getright 5. 現(xiàn)在我們將要去找神奇跳轉,這樣IAT會被正確地轉儲下來,而不用手工修復了. 要完成這一點,我們需要打敗程序中的一些陷阱, 并使它們即使在檢測到被執(zhí)行脫殼時也無所作為. 讓我們開始吧! 第一步:如

在本參考教程的第一部分我們學習了如何正確地轉儲(dump)Getright 5. 現(xiàn)在我們將要去找神奇跳轉,這樣IAT會被正確地轉儲下來,而不用手工修復了. 要完成這一點,我們需要打敗程序中的一些陷阱, 并使它們即使在檢測到被執(zhí)行脫殼時也無所作為.
讓我們開始吧!
第一步:如何找到IAT的起始點和終點
在我們開始之前,先在安全的地方保存一份我們在先前第一部分教程中得到的轉儲文件的副本. 我將它命名為TUTE.exe記住這個名字.
用Ollydbg載入TUTE.exe. 我們將要去尋找IAT.

正如我們在上圖中看到的,如果我們稍加跟蹤,我們很容易發(fā)現(xiàn)一個
CALL [xxxxxx] 或者 JMP [xxxxxx] 間接地帶有它們即將跳往IAT中某處的內(nèi)存地址值.在這張圖中,我們可以看到 CALL [5e9d94]. 那意味著這個call將要前往這個內(nèi)存地址,實際上就是IAT表的入口值.在它的右邊我們可以看到"kernel32.Getversion" (黃色). 這就意味著這是一個可以在IMPORT RECONTRUCTOR上被找到的正確的入口值.
讓我們看一下轉儲(DUMP)窗口.在轉儲(DUMP)窗口右擊,選擇"前往 表達 5E9D94".

這就是看上去很不錯的IAT. 正如你所看到的入口5E9D94指向77E5D142,那個值在我的機器里是API GetVersion.這個入口是正確的,此入口周圍的其它一些入口也是指向類似7xxxxxxx的值.
注意在其它的機器上值7xxxxxx可能會有所不同.但是這些值都是相互類似的. 現(xiàn)在我們稍微往上看一看,去找此表的起始點.我們到達這里:

紅線標記了此表的起始點.在此線的上面沒有其它任何API值了.現(xiàn)在我們知道表從哪兒開始了
TABLE STARTS= 5E99EC
現(xiàn)在到右下角轉儲區(qū)去找IAT表的終止點.正如我們在圖中看到的有兩個可能的終止點. 如果我們吃不準最好選后面那個.但是我們有更好的方法.

選擇任何一個不確認的值,然后將表向上翻頁.停在401000.我們必須去找一個CALL [xxxxx]或者一個JMP [xxxxx].右擊鼠標并選擇SEARCH FOR BINARY STRING

我們將要去尋找那些不確認的入口中的一個,讓我們試試5EA25C.記住逆序寫這個值如下圖所示.

到了這里

稍稍往上翻一下

我們看到那兒有一個使用此值的CALL,所以那些不確認的值也都是屬于IAT的.
現(xiàn)在我們知道了
END OF TABLE= 5EA2BC
終點值是用來計算表的長度的.這是很簡單的一步:
LENGTH= END-START
LENGTH=5EA2BC-5E99EC
LENGTH= 8D0
在紙上寫下OEP,表的起始點和長度,在使用import reconstructor時你將用到這些值.
第二步:找出那些不指向任何API的錯值.
當GETRIGHT.exe正在進行轉儲時,這個問題變的很容易.然后選擇VIEW-MEMORY你將看到哪些入口指向了dlls而哪些則指向了錯誤的地方.
無論如何如果我們嘗試用revirgin或import reconstructor則會有很多入口無法解決.這就是我們?yōu)槭裁凑埑龉锊ㄌ貛硪恍┠Х?

正如在表中看到的,還存在一些(黃色標記)沒有解決的入口.通常對付這種情況的方法是從我開始轉儲起就跟蹤,然后追蹤每一個調(diào)用API的call,寫下名字最后用Import Reconstructor.
如果自由很少幾處沒有解決的入口這樣做將非常簡便,但是如果有很多的話,這項工作將令人難以忍受,所以讓我們看看另一種方法.
第三步:如何去找出MAGIC JUMP
這里說明一點:我們已經(jīng)知道程序的父進程和他的子進程是相同文件,但要用不同的句柄裝入兩次,所以他們變成兩個不同的進程。一方面父進程的OEP是5F90B9,父進程從這里開始運行.

另一方面我們知道當子進程被轉儲時其OEP是534E90,但我也要告訴你,子進程也是以相同的父進程的入口點5F80B9開始運行.子進程運行并且解出自己的IAT然后跳到子進程引起錯誤的OEP,我希望你記住這一點,我在第一部分曾經(jīng)講過.
如果你相信以上所說,我告訴你,跟蹤父進程直到父進程開始轉變?yōu)閮蓚€進程,父進程和子進程,找到那個地方,那非常有用.我已經(jīng)找到了那個地方,那是個條件跳轉,至于如何找到的,我以后再告訴你.
順便一提它不是從父進程那復制 IAT 到它的子進程,卻是從子進程那解出自己的 IAT。這應該是一大麻煩,因為我們不能在他從父進程脫離前用 OllyDbg 進入子進程。
這是個煩惱,因為我不知道如何進入子進程去觀察它如何解出自己的IAT.
首先我嘗試著從轉儲程序TUTE.exe中找一個錯誤的entry.

我選擇了5E9C34但是你可以選擇其它任何錯誤的entry.正如你所看到的,它的值為DF5070.
按老規(guī)矩記住要將 IsDebuggerPresent 的值設為零,清除所有以前的 BPX、BP WaitForDebugEvent 然后單擊運行.
我們將停在此斷點或者某個例外上.那時,打開PUPE選擇進程中2個進程中的上面一個(因為他是子進程,是我們需要的).右擊進入parcheando窗口選擇4字節(jié),如圖在地址里填入錯誤的entry offset 5E9C34.然后點擊BUSCAR. 你將會看到?jīng)]什么變化,因為所有值都是零.

然后不斷的在OD中點擊運行、在PUPE中點擊BUSCAR,并檢查字節(jié)窗口中的值.

相關文章

最新評論

南木林县| 昔阳县| 东明县| 墨竹工卡县| 三台县| 大田县| 馆陶县| 泸西县| 长阳| 三门峡市| 望谟县| 嘉峪关市| 武冈市| 阜阳市| 申扎县| 洛阳市| 安化县| 郯城县| 韩城市| 同江市| 辉南县| 丰县| 孝昌县| 晋宁县| 韶山市| 宿州市| 文水县| 集贤县| 高唐县| 维西| 赫章县| 永济市| 丹寨县| 临邑县| 武威市| 拜城县| 康乐县| 织金县| 中阳县| 偃师市| 平利县|