大家好!很久不見了.我之前去音樂學院進修爵士吉他去了.現在回來了.之前我一直在學windows開發和逆向.后來到了音樂學院,老師推薦了1個錄音軟件叫logic prox.可惜啊!當時我只有個索尼的筆記本電腦,后來我在淘寶上找了個賣家,專門安裝黑蘋果的,結果我的電腦聲卡驅動不了.這下完蛋了.后來.只有花血本買了個15寸視網膜macbook.再后來我安裝了個xcode.哈哈!再后來沒想到,MACOS,IOS 開發比 Windows 開發好玩多了.然后學了半年的 IOS 開發.覺得非常有意思.以至於logic prox現在我都沒有學得好.不過也還在堅持學習當中了.現在我找到了一些資料和以前學習 Windows 開發時候的小經驗,好好學學 IOS 逆向方面的知識.大家一起來吧.
全局變量:
全局變量這下子懵了.在 IOS 下好像,我還沒有用到過.不過 OC 百分之90幾都是 C,既然 C 有時候會用到全局變量.那么就從它開始吧.沒准哪天分析的程序用到了呢.學習IOS逆向工程肯定要懂得arm匯編了.但是直接學習arm匯編好像很枯燥呢.干脆就不直接學了.通過分析程序再隨時查閱吧.之前學習了x86匯編不知道對arm有幫助沒?!
先看一段代碼了:
1 #import <UIKit/UIKit.h> 2 #import "AppDelegate.h" 3 4 int gi = 12; 5 6 int addFunction() { 7 8 return gi; 9 } 10 11 int main(int argc, char * argv[]) { 12 斷點13 int d = addFunction(); 14 printf("%d\r\n", d); 15 @autoreleasepool { 16 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 } 18 }
首先這里我們聲明並初始化了1個全局變量gi;然后在13行處打一個斷點,這樣調試的時候就會停止在addFunction()函數這里了.我們先運行並打開反匯編窗口哦!
恩!不錯,進到了不少眼熟的,比如push,mov sub add 不過還有好多不眼熟啊!什么str ldr什么的.不過先不去管這些.目前來說,我們所知道的線索是:
首先我們在addFunction下的斷點.程序調試運行后,應用會停在這個函數上.如圖,確實是這樣的.那么說明bl這個指令應該就是調用指令,比如 X86里的call一樣. bl 后面的0x15ddc應該就是函數地址了.我們先進去看看再說.
果然我們來到了0x15ddc.呵呵!但是又看到好多不認識的.什么movw,暈啊!多了個w什么意思的呢,先不管了.不過第2行的意思應該是把0x1a0c地址放進r0寄存器中.誒!我們不是要學習全局變量的嗎.我差點給忘記了.那我們先看看gi這個全局變量的地址.我們用po &gi 打印下看看.
0x000177f4.我們先記下來.在學習x86的時候,我記得全局變量是寫入了可執行文件的,也就是說,程序里要找到它要么是直接給出其地址,要么是給出1個基地址+偏移找到它的.我們在這里沒有發現程序直接去找到它.不過我們發現了1點可疑的地方.[r0]. 這個寄存器加了個中括號.這說明,這里以r0的值作為地址去取了內存的值.然后依據這個線索,我們看看r0的值什么時候曾經被改變過的.第2行movw r0 #0x1a0c ;還有第4行 add r0, pc 這兩條指令改變過它的.那么可以這么去假設了.0x1a0c是一個偏移.pc寄存器里的值是一個基地址. 這兩者一加或者就是全局變量gi的地址.那么我們首先打印下pc寄存器的值
我們再打開計算器計算下.0x1a0c + 0x00015ddc = 0x177E8 .感覺不對.仔細想想肯定不對.但是又差不多太遠.因為0x177E8 和0x177f4不很遠.可惜不正確啊!
仔細想想.或者這個 PC 寄存器不是這么用的.或者這個PC寄存器是表示當前指令的地址.那我們改變下算法.
我們這樣來 0x1a0c + 0x15de4 = 0x177F0. 哇!離0x177f4越來越近了.只差4字節了.
只差4了也!這4會是什么.查閱了下資料.arm里1條指令長度是32位也就是4字節.那么也就是說我們這里還要加上當前指令的長度4.這樣正好就是全局變量gi的地址了.不知道這個算不算是迷信了.應該我想的是對的吧.
但是我們發現我們目前用的全局變量是申明的時候就初始化過了.如果申明的時候沒有初始化過,會是什么情況呢,我們先看看代碼
#import <UIKit/UIKit.h> #import "AppDelegate.h" int gi ; int addFunction() { gi = 12; return gi; } int main(int argc, char * argv[]) { 斷點 int d = addFunction(); printf("%d\r\n", d); @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
然后看匯編代碼:
同樣我們安裝剛才的算法計算下gi的地址:
然后再:0x1264 + 0xefddc +4 = 0xF1044. 暈死!完全不對.怎么回事呢?!
我們繼續看看代碼.我們發現后面好幾條指令都有[r0], 也就是說,后面的一些指令做過這樣的操作:以r0為地址取內存的值.這里有點思路了.或許沒有初始化的全局變量是需要以基地址+偏移+4 然后再以這個值作為地址取內容的.好.我們去內存里以這個0xf1044以地址取內容
真好!確實是這樣子的.
至此全局變量分析完了.之后我會繼續學習其余的內容,比如函數啊.OC 里的方法啊.和其他什么的.反正我們的目標是看懂IOS反匯編.然后就可以分析自己和別人的app了.加油哦!我很喜歡有個女孩子的博客.叫 程序媛念茜. http://blog.csdn.net/yiyaaixuexi/ 因為我覺得她寫的東西都好酷.都還看不懂!努力學習吧!希望哪天能夠讀懂.像她一樣的酷!