我也要学IOS逆向工程--全局变量

  大家好!很久不见了.我之前去音乐学院进修爵士吉他去了.现在回来了.之前我一直在学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/   因为我觉得她写的东西都好酷.都还看不懂!努力学习吧!希望哪天能够读懂.像她一样的酷!

时间: 2024-10-01 03:30:05

我也要学IOS逆向工程--全局变量的相关文章

我也要学iOS逆向工程--函数

大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧. 然后看看汇编情况哦! 学习函数呢,肯定要弄清楚几个事情. 1.跳转地址. 2.返回地址 3.参数 4.函数获取参数 5.返回值和如何返回 6.扫尾 我们开始了哦!1个个的突破!唉,这个学习笔记是一边学一边写,不知道到底能不能边写边突破呢.小马过河,试试吧.呵呵. 1.跳转地址.因为xcode默认反汇编的时候,并没有显示出机器码,所以这里,我们要用一个命令去显示:disassemble -fmb 我们发现这样

ios逆向工程-静态分析

最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> ----------------------------------------------------凌乱的分割线------------------------------------------ 其次讲讲要用到的工具(ios安装工具使用Cydia中搜索安装,有些需要数据源可以自行查找): 已经越狱的IOS设备

猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:加入导航控制器 上一篇博客完毕了对底部的TabBar的设置,这一章我们完毕自己定义导航控制器(NYNavigationController). 为啥要做自己定义呢.由于为了更好地封装代码,而且系统的UINavigationController不能满足我们的需求了,所以得自己定义. 首先,我们在NYTabBarViewCon

从零开始学ios开发(八):Autorotation and Autosizing

不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios. 这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容自动旋转,因为iphone有重力感应系统(陀螺仪???),屏幕的内容会随着用户手握iphone的方式(竖着握Portrait.横着握Landscape)而改变,这个相信大家都已经有所体会,Autosizing是指当iphone的屏幕旋转后,屏幕里面控件的大小和位置也会自动改变.好了,下面跟着例子继续

从零开始学ios开发(六):IOS控件(3),Segmented Control、Switch

这次的学习还是基于上一个项目继续进行(你也可以新建一个项目)学习Segmented Control和Switch. Segmented Control Switch Segmented Control和Switch的主要区别在于Segmented Control可以有多个值进行选择,而Switch只有2个值. 1)添加Segmented Control从object library中拖一个Segmented Control到iphone界面上然后调整Segmented Control位置以及它的

一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/ 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: [csharp] view plaincopy #import <UIKit/UIKit.h> @interface TextViewController : UIViewController <UITextViewDelegate> { UITe

从零开始学ios开发(十五):Navigation Controllers and Table Views(中)

这篇内容我们继续上一篇的例子接着做下去,为其再添加3个table view的例子,有了之前的基础,学习下面的例子会变得很简单,很多东西都是举一反三,稍稍有些不同的内容,好了,闲话少说,开始这次的学习. 如果没有上一篇的代码,可以从这里下载Nav_1 1)第三个subtableview:Controls on Table Rows这个例子,我们将为每个table view的每一行添加一个按钮,这个按钮将放在accessory icon的位置(之前我们使用过accessoryType,其实这也是一个

从零开始学ios开发(十四):Navigation Controllers and Table Views(上)

这一篇我们将学习一个新的控件Navigation Controller,很多时候Navigation Controller是和Table View紧密结合在一起的,因此在学习Navigation Controller的同时,我们还将继续学习Table View其他一些特性,毕竟Navigation Controller还是相对来说毕竟简单的,没有什么太大的花头,它的主要作用就是一个view的切换,切来切去,而Table View的花头就比较多了,这次我们将这2个控件结合在一起进行学习. 再多说一

从零开始学ios开发(十二):Table Views(中)UITableViewCell定制

我们继续学习Table View的内容,这次主要是针对UITableViewCell,在前一篇的例子中我们已经使用过UITableViewCell,一个默认的UITableViewCell包含imageView.textLabel.detailTextLabel等属性,但是很多时候这些默认的属性并不能满足需要,其实更多的时候我们想自己制定UITableViewCell的内容,这篇学习的就是制定自己的UITableViewCell. UITableViewCell继承自UIView,因此它可以加载