在Mac OS下分析Crash Log有很多種方法,這裡不是要說明如何分析的Crash Log, 主要是展示下Hopper的使用。 強大的IDA大家可能已經知道,但它的Mac OS版本又讓人回到了DOS時代。幸運的是Mac OS有了一個小巧的替代品:Hopper, 基本上滿足了工作上的反組譯碼的需要,包括虛擬碼以及控制流程圖(Control Flow Graph),支援ARM指令集並對Objective-C的做了最佳化。
先給張介面總覽(左側是符號列表,開啟程式後,用工具列最右側的Read Executable就可以開啟可執行程式分析):
下面以分析Crash Log為例,展示下Hopper的使用。
在應用程式一個位置使用assert讓它崩掉,可以得到如下的Crash Log:
Crash Log
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x981fd9c6 __pthread_kill + 10
1 libsystem_c.dylib 0x99692f78 pthread_kill + 106
2 libsystem_sim_c.dylib 0x01e5a57b abort + 140
3 libsystem_sim_c.dylib 0x01e3c286 __assert_rtn + 267
4 BlogCounter 0x000033c9
5 BlogCounter 0x00003362
開啟Hopper,找到菜單Navigate->Go To Address or Symbol
在對話方塊輸入33c9,Hopper就會跳到程式崩的位置。
產生偽碼看看
太短了! 和原始碼比比:
顯然編譯器最佳化過了。因為assert(0)是穩定崩定的,所以下面的代碼都沒有產生。
可以將assert改為
assert(URLString==nil);
再嘗試時,崩潰的位置已經變更(Mac OS有一項技術,程式和程式庫在載入時的地址是動態決定的)。我們再看下新的代碼和控制流程圖(CFG):
CFG:
官網: www.hopperapp.com
它用的反組譯碼引擎:
http://www.beaengine.org/
轉載請註明出處: http://blog.csdn.net/horkychen