我也要學iOS逆向工程--全局變量

  你們好!好久不見了.我以前去音樂學院進修爵士吉他去了.如今回來了.以前我一直在學windows開發和逆向.後來到了音樂學院,老師推薦了1個錄音軟件叫logic prox.惋惜啊!當時我只有個索尼的筆記本電腦,後來我在淘寶上找了個賣家,專門安裝黑蘋果的,結果個人電腦聲卡驅動不了.這下完蛋了.後來.只有花血本買了個15寸視網膜macbook.再後來我安裝了個xcode.哈哈!再後來沒想到,MACOS,IOS 開發比 Windows 開發好玩多了.而後學了半年的 IOS 開發.以爲很是有意思.以致於logic prox如今我都沒有學得好.不過也還在堅持學習當中了.如今我找到了一些資料和之前學習 Windows 開發時候的小經驗,好好學學 IOS 逆向方面的知識.你們一塊兒來吧.算法

全局變量:windows

  全局變量這下子懵了.在 IOS 下好像,我尚未用到過.不過 OC 百分之90幾都是 C,既然 C 有時候會用到全局變量.那麼就從它開始吧.沒準哪天分析的程序用到了呢.學習IOS逆向工程確定要懂得arm彙編了.可是直接學習arm彙編好像很枯燥呢.乾脆就不直接學了.經過分析程序再隨時查閱吧.以前學習了x86彙編不知道對arm有幫助沒?!xcode

先看一段代碼了:app

 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應該就是函數地址了.咱們先進去看看再說.spa

 

果真咱們來到了0x15ddc.呵呵!可是又看到好多不認識的.什麼movw,暈啊!多了個w什麼意思的呢,先無論了.不過第2行的意思應該是把0x1a0c地址放進r0寄存器中.誒!咱們不是要學習全局變量的嗎.我差點給忘記了.那咱們先看看gi這個全局變量的地址.咱們用po &gi 打印下看看..net

0x000177f4.咱們先記下來.在學習x86的時候,我記得全局變量是寫入了可執行文件的,也就是說,程序裏要找到它要麼是直接給出其地址,要麼是給出1個基地址+偏移找到它的.咱們在這裏沒有發現程序直接去找到它.不過咱們發現了1點可疑的地方.[r0]. 這個寄存器加了箇中括號.這說明,這裏以r0的值做爲地址去取了內存的值.而後依據這個線索,咱們看看r0的值何時曾經被改變過的.第2行movw r0 #0x1a0c ;還有第4行 add r0, pc 這兩條指令改變過它的.那麼能夠這麼去假設了.0x1a0c是一個偏移.pc寄存器裏的值是一個基地址. 這二者一加或者就是全局變量gi的地址.那麼咱們首先打印下pc寄存器的值調試

咱們再打開計算器計算下.0x1a0c + 0x00015ddc = 0x177E8 .感受不對.仔細想一想確定不對.可是又差很少太遠.由於0x177E8 和0x177f4不很遠.惋惜不正確啊!code

仔細想一想.或者這個 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/   由於我以爲她寫的東西都好酷.都還看不懂!努力學習吧!但願哪天可以讀懂.像她同樣的酷!

相關文章
相關標籤/搜索