本篇使用檔案與成果位於
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx16
根據上一篇的解析後,大家對於破解程式的解有了一些想法了吧,那我們就來解吧 !
對了,也是可以直接竄改字串的值為目標的 XOR 44
XOR 11
,然後再改 Check Sum
的校對值,但這樣太粗暴了,我們還是建一個代碼補丁好了。
首先,我們要建一個 code cave
,那要放在哪邊呢?
當補丁的量比較少時,書中推薦使用方法 1 ;其他使用 2 與 3 的方法較好。
那這次就使用方法一,先看看位置要設在哪裡吧。
首先,看到第一個 section
透過觀察其重要數值
另外配上
得出這個區塊在資料上佔了 400 byte,其中只有 280 byte 被使用到,而沒使用到的區域就是我們要佔據的未使用區域。( 實際上區塊經過對齊後有 1000 的空間 )
確認要把 cave code
設定的位置,才能讓跳躍成功降落。
看看上面的 address
+ sizeofRawData
→ 1000
+280
= 1280
,跳到該位置 :
一整片零,看來是很好的設置位置,就決定把大門設在 00401280
。
那我們要做的目標就是將那兩個字串修改成別的。直接在資料上修改被加密過後的字串位置是不行的( 這次該用 code cave
)。那先修改原本 jmp
至 OEP
的那個區塊紀錄跳躍點位置 401083
因為需要修改它,所以要找出他在被加密流程中被加密了幾次,00401083
是屬於在第一個加密區塊( 4010F5 ~ 401248
)。所以可以得知他的資料是經過了 XOR 7
才變成現在的指令。
查看原文件,看到 .text + 83
就是存加密 JMP OEP
的地方。(401083 - 40000 - 1000 + 400
)
那要把原本的指令修改成 jmp 00401280
還得通過解密要甚麼做呢 ?
答案就是想把原本的指令經過 XOR
一樣的數字,再次 XOR
時就會變回來了。
目標是 401280
,所以改成 EE FF 06
。
之後就可以然後開始寫 code cave,從 401280
開始 :
因為這邊的代碼每個人都會不一樣,以下是個人寫的 code cave
pushad
把暫存器的值存起來ECX
存字串長度ESI
移入要改的來源字串位置 ( 寫在下面空間 )EDI
放入被改的字串位置 ( 可以用在解密後用引用字串查位置 )ECX
次轉移字元popad
後就跳回 OEP
。把修改的 binary 檔案貼到檔案裡形成 Code Cave Patch
。
執行看看 :
成功了 ! 好耶 !
在理解這些技術之後,就要進入 DLL 注入的篇章。感謝各位能陪我到這邊,我們之後繼續加油吧 !