[OSX][ASM]初探Mac OSX軟件爆破(GDB遠程調試+反匯編+打補丁)

為什麼會有這篇文產生呢,
純粹因為一直很想摸OSX的App逆向
不過又沒有入門
對岸跟台灣基本上根本沒有文章可以參考...變得入門很難
去找了幾篇國外原文然後花一兩個小時摸摸~這篇算是簡略心得文(?)

是說破完之後發現其實OSX幾乎呈現0保護狀態耶XD
OSX的軟體都還蠻好破解的...
不像MicroSoft被一堆大牛們破解到怕了XD所以Windows超多防護機制
(也很多廠商推出混淆、虛擬機...等手法來反破解這樣)

本身有Windows逆向工程底子的人來摸其實還蠻快就上手惹
會覺得OSX之後會不會像多多鳥一樣很可愛、然後變成下一個Windows的命運XD?
____________我是分割線____________
所以這算是筆記吧(?)
在逆向之前總得有個可憐的孩子被逆向,
不過因為我很菜...不會醜到爆的Obj-C、噁爛的Swift(它真的看起來超像Shift的)
所以我這邊是用C++Builder的跨平台FireMonkey專案開發了一支小App做測試

首先我在VM內寫Code
設計超級他媽簡單...就只有一個按鈕
按鈕內響應的事件:
整個做的事情非常簡單。把a的值設為1,b的值設為2
假設a跟b相等則彈出“Happy”的視窗;若不相等則彈出“Angry"的視窗。
不過因為a跟b本來就永遠都不可能相等所以永遠都只會彈出angryangryangryangryangryangryangryangryangryangryangryangryangryangry

接著用Xcode跟VM的C++Builder遠程連機然後編譯:
長出了一個野生的視窗,上面的按鈕按下去,視窗永遠看起來很生氣的樣子

接著就是調適的部分了
我這邊用的是Hopper Dissasmbler付(ㄆㄛˋ)費(ㄐㄧㄝˇ)版
不要跟我要,網路上找一下就有惹XD
接著載入今天主角...翻了一下它的外導函數很快就可以找到Button_Click的事件惹
(不要問我為啥外導函數這麼醜,去問問CBuilder官方T__T,CBuilder生產出來的東西外導函數都很ㄐㄅ醜)

接著可以看到Button_Click的asm Code怎麼跑的
不過Hopper的反匯編能力還不錯,可以幫你把asm逆推回C++ Code看邏輯怎麼跑
如果你的asm功力頗菜可以參考一下XD
可以從反匯編上看到雖然我們C++ Builder的Source寫得很簡單
不過在程式被編譯完後asm是這麼跑的:
先把var_m12賦予值 = 1 (變數a)、var_m16賦予值 = 2 (變數b)
接著比對如果var_m12跟var_m16相等,則把暫存器EDX設為0x2bd32
若兩者不相等則設為0x2bd38(這兩者其實就是"Angry"跟"Happy"的文字記憶體位置)
最後再透過@System@UnicodeString API(我猜是CBuilder官方自己搞出來的函數)把var_m20的文字從EDX位置上Copy進去,最後才透過Fmx@Dialogs@ShowMessage API把文字給彈出來

然後在Button_Click事件上下斷點(F9)
這邊比較特別的是
例如說Cheat Engine下斷點是F5 單步F7 躍過F8 執行F9
OD是斷點F2 單步F7 躍過F8 執行F9
不過Hopper是斷點F9 單步F7 躍過F8 執行F5

然後使用GDB遠程CreateProcess
是說這邊蠻哭爸的事情是...GDB一開始初始化好像不會幫你在Entry下一個暫停
所以UI會直接彈出來,沒有讓你去跟蹤Entry怎麼跑的
然後我們去按那個超大粒的按鈕,就會觸發Debugger訊息傳回GDB然後暫停
(而且速度超慢der...不知道他們怎麼通訊的,Windows底下OD、CE在調適都超快)

然後GDB Catch到Debugger Event之後,就可以用F7F7F7F7F7F7跟蹤啦~
接著跟蹤到底下很快就可以看到asm code這邊對兩個記憶體變數做比對
不相等就跳到0x14b5f做"Angry"文字記憶體位置導到EDX內,否則就繼續跑到0x14b57做導入"Happy"文字記憶體位置到EDX內

接著底下繼續跑就會處理ShowMessage()函數的呼叫了
我們可以看一下GDB跑到JNE上的時候的EIP
這時候如果我們幫它把即將閱讀的0x14b55改為0x14b57
在GDB上把EIP改為0x14b57之後可以看到Hopper同步讀取點跳到了0x14b57
成功繞掉了JNE那行了~按F5跑跑看

看見視窗很開心的說Happy惹
所以很明顯今天要幹的事情就是把跳入0x14b5f給取消掉
幫它補上兩個nop(原本JNE是短跳所以佔用兩個BYTE)

最後測試一下,OK,沒問題
把Patch好的執行擋用Hopper生出來,然後塞回去原本的程式裡面

熱門文章