[ASM][IDA][C++]爆破也能很優雅!純靜態爆破文件關鍵點+純靜態打Patch(IDA反組譯﹢打Patch)

在打Patch方面,Windows上分析
一直都有著優異分析能力的Ring3工具有三套
Cheat Engine、OllyICE、IDA

大家比較熟的可能是OllyICE可以直接分析PE Header、分析.text段
然後直接對Patch的資料保存回執行檔文件

或者不少人也知道Cheat Engine有提供一個噁爛等級的Lua腳本
讓你直接用ASM+Lua,不會主流程式語言也能輕鬆製作出補釘工具
有些人乾脆就自己寫一個KeyGen or Patch文件了.

不過今天要介紹的不是這些,
而是大多數人知道IDA可以分析程式靜態邏輯,輕鬆得知內容
而不知道其實IDA也有Patch文件的功能XD
(知道的就別看這篇文啦~很雷很雷~~大牛請飄過)

是說本來這篇文想用純英文耍屌寫文章
後來想想...算惹 幹嘛這樣吃力不討好呢(尻杯XD)
本文開始
內有一個Normal.exe是未修改的程式
Patch.exe則是手動修改過的程式

破解總要有個方向~所以用CBuilder自寫了一個小程式
至於它的功能是啥...
詳見Code:
我只在Button1Click的事件上寫了
製造一個變數a的數字內容為0到99其中一個數字
假如a變數的數字哪天出現了100,則跳出訊息說"Hello"

不過因為變數範圍為0~99,永遠不可能是100,所以MessageBox永遠不會跳出來 

(至於為啥我要寫這麼麻煩...因為CBuilder會邊譯器優化,如果寫恆等句會自動被清除不必要的垃圾Code...)

Ok,看到這邊大概能知道我們要幹嘛惹吧
首先這個事情要Patch,對使用OD的破解者來說十分難分析
問題點在於一般人可能不知道怎麼找到這個事件的位置(有些看雪大牛可能會用特徵碼之類der就不特別討論),CE的破解者也很難分析這個事件點的狀況

不過特別提一下,如果你真的想用CE跟OD破解,可以考慮從SendMessage API下手,然後跟蹤整個WinNT的消息機制...不過應該會跟到哭哭(or 採用看雪大牛們的特徵碼辦法)

不過今天要教的是不弄髒手又可以很優雅的IDA打Patch
所以請出我們的主角,垮奶肥婆IDA!
不過她奶有沒有很垮我是不知道啦,但你們進來看我文章應該就要認同我的偏見吧(?)
廢話結束

首先用IDA Pro v6.6的版本載入這支小程式
然後開啟完畢後,給垮奶奶一點點時間分析整個.text段在幹嘛
分析完畢後,找到右邊很多外導函數對吧
直接找到我們的事件Button1Click,然後展開它
ok,這時候你會看到...咦 這不是識曾相似的感覺嗎
不過你可以看到a變數不見了,變成一個叫result的變數
看來應該是C++Builder為了節省空間做的優化,直接把eax暫存器當做變數存放點來用了
選擇到View找到Disassembly
然後就可以跳到組語介面了~
然後看一下組語Code搭配剛剛IDA分析內容,可以很快的看到
它直接把區域變數[EBP+0x0A]當做變數a來使用,然後比對如果[EBP+0x0A]不等於0x64(100),就跳到函數尾巴做釋放區域變數記憶體然後返回

找到關鍵點在.text段的0x00402E10那怎麼做Patch呢
選擇選單上的Edit內有個叫做Patch Program的功能,選擇Assemble功能
(p.s.記得先mark你要修改的那行 jnz     short loc_402E22)
既然它那麼愛跳,就斷它跳嘛,不讓它亂跳啊對吧
把原本那行補上兩個nop
這樣它就會乖乖不敢亂跳了
最後選擇到Apply patches to input file功能
就會看到Patch完之後的程式每次按按鈕都會乖乖跳出Hello囉

留言

這個網誌中的熱門文章

[C#] Lambda花式應用噁爛寫法(跨UI委派秒幹、多線程處理...etc)

[Windows] 逆向工程 C++ 中入口函數參數 main(argc, argv) 與如何正確的進行參數劫持

重建天堂之門:從 32 位元地獄一路打回天堂聖地(上)深度逆向工程 WOW64 設計