Windows PE变形练手1-用PE自己的机器码修改自己的逻辑
PE變形練手1-用PE自己的機器碼修改自己的邏輯
????就是找一個PE文件,用自己的部分代碼部分覆蓋或者而修改自己另一個代碼部分的補丁姿勢(現實中使用很少,極少數破解可以用到。這次例子目的是了解PE)。
第一個實驗,寫個例子。然后把函數1和函數2調換一下。
代碼如上,很簡單。先輸出111,在輸出222.根據:
可知,相關FOA???main?0x440??main1?0x400??main2?420
兩個函數如上,最后C3是return,仔細觀察,是下面參數不同:
OK,好辦,直接替換這兩個參數就行了唄:
然而發現,并不性。還是先輸出111,有輸出222。當時我還傻愣半天,還找同事問問。怎么這么簡單,改個東西。我卻失敗了。額...結果我輸了一塊雪糕。原因是這兩個函數根本沒有被調用到。比如這樣。我上來就C3,發現程序繼續運行。
原因是因為直接被優化掉了,編譯器編譯的時候直接把這兩個函數的字節碼弄到了調用的地方,看反匯編就知道了:
相關編譯選項是這兩個:
我們可以把?內聯函數擴展禁用:
????這樣就調用函數了,這個時候再去改函數就有反應了。這里不上圖了,我本地測試發現可以。
下面我試了下編譯選項,總結了一些組合產生的結果(VS2015?C++)
(1)優化:完全??內聯函數擴展:開
?
(1)優化:禁用???內聯函數擴展:開
(2)優化:禁用???內鏈函數擴展:關
(3)優化:完全???內鏈函數擴展:關
例子2,模擬一個最簡單的破解:
要想在錯誤密碼或者不輸入密碼的時候走yes函數,姿勢有很多:
(1)OD直接加載起來,在判斷密碼正誤的地方改下邏輯,可以直接改判斷部分或者if不滿足后執行的函數地址(如果是實際情況,推薦這個)。
(2)直接上來把PE入口函數指向yes,這樣可以直接跑yes函數了。但是這樣的缺點不會執行其他別的邏輯代碼了,而且執行完,應該不會退出。我記得是退出不了。或者再在后面自己追加退出代碼。
(3)覆蓋部分主函數里面的代碼,讓他進入主函數后直接就跳轉到yes函數了。(這個思路也行)。
(4).....還有很多姿勢。下面就簡單實現下上面三個姿勢。雖然沒什么用,練著玩,為接下來的復雜PE變形做鋪墊。
實現姿勢1:OD加載走走邏輯破解:
OK這就行了,比較簡單,不細說了。
實現姿勢2:改PE入口的地址,直接讓他跑yes函數:
看下入口:
之前是什么都不管,反正RVA1000對應FOA400
OK?yes函數在這里,41000處,直接把13F2?改成1000就行了:
這樣雙擊就直接破解了:
和預想一樣,點擊確定后卡在這個黑色界面上了:
實現姿勢3:直接代碼覆蓋(這個不通用,之后在解釋):
?
? ? 直接把400-420的函數yes?代碼覆蓋到420-440的no里,如果no里代碼比較多,可以直接C3返回,但是上面也有很多坑,之后會的例子里會解釋。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Windows PE变形练手1-用PE自己的机器码修改自己的逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows PE 第十三章 PE补丁
- 下一篇: R3获取kernel32地址