我也要学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有帮助没?!
先看一段代码了:
#import <UIKit/UIKit.h>
#import "AppDelegate.h" int gi = ; int addFunction() { return gi;
} int main(int argc, char * argv[]) { 断点13 int d = addFunction();
printf("%d\r\n", d);
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
首先这里我们声明并初始化了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 = ;
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/ 因为我觉得她写的东西都好酷.都还看不懂!努力学习吧!希望哪天能够读懂.像她一样的酷!
我也要学iOS逆向工程--全局变量的更多相关文章
- 我也要学iOS逆向工程--函数
大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧. 然后看看汇编情况哦! 学习函数呢,肯定要弄清楚几个事情. 1.跳转地址. 2.返回地址 3.参数 4.函数获取 ...
- ios逆向工程-静态分析
最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> --- ...
- ios逆向工程
原 ios逆向工程-内部钩子(Method Swizzling) Method+Swizzling ios hook Method Swizzling(方法调配) 怎么说呢,先了解什么是钩子为什么 ...
- iOS逆向工程资料
链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)
- 从零开始学 ios 的一些建议 摘自http://www.cocoachina.com/ios/20150826/13151.html
我是一只小菜鸟,今天在cocoaChina 看到一篇关于初学者,也就是零基础的童鞋的一些建议,感觉写的好好. 我觉得,学习真的是很累,但是,你要记得一句话,,世界上最最可怕的两个字是认真.共勉! 事情 ...
- 从零开始学 iOS 开发的15条建议
事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交 ...
- iOS逆向工程,(狗神)沙梓社大咖免费技术分享。
序言 简介:本文针对于广大iOS开发者,作为一名开发者,仅仅专注于一门语言可能已经不适用现在的市场需求,曾经因高薪和需求量巨大,而火爆一时的移动端开发者(Android,ios),如今的路却是不再那么 ...
- iOS逆向工程概述(转)
逆向工程一词,对很多人来说可能很陌生,在android领域,我们经常会听到“反编译某个apk”,那么逆向工程从某种角度讲也包括反编译这项技术,这样一对比,可能我们就更容易理解逆向工程的定义了. 我们引 ...
- (素材源代码)猫猫学IOS(四)UI之半小时搞定Tom猫
下载地址:http://download.csdn.net/detail/u013357243/8514915 以下是执行图片展示 制作思路以及代码解析 猫猫学IOS(四)UI之半小时搞定Tom猫这里 ...
随机推荐
- SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)
开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...
- [安卓] 8、VIEW和SURFACEVIEW游戏框架
这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制.这里要1个简单的layout资源和2个java类:在MainActivity中主要和以往一样,唯一不同的是去除电池图标和标题等操作,然后第 ...
- [ACM_数学] Taxi Fare [新旧出租车费差 水 分段函数]
Description Last September, Hangzhou raised the taxi fares. The original flag-down fare in Hangzhou ...
- [matlab] 矩阵操作
>_<:矩阵构造 1.简单矩阵构造 最简单的方法是采用矩阵构造符“[]”.构造1´n矩阵(行向量)时,可以将各元素依次放入矩阵构造符[]内,并且以空格或者逗号分隔:构造m´n矩阵时,每行如 ...
- [stm32] GPIO及最小框架
1.GPIO硬件结构图: 2.GPIO程序结构: 3.框架介绍: 这里的ASM是固定启动文件夹,startup_stm32f10x_hd.s表示当前stm32类型为高容量设备,当然还有md.s等. C ...
- 一个格式化日期和时间的JavaScript类库
原文地址:http://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.html 结合meizz的代码做了适当调整. Date.pro ...
- Spring - 基于注解的组件扫描
关于Spring的书籍都会花很大篇幅来讲解Spring如何注入各种bean的问题,非常令人头疼,自己在工作中还从来没有用到过. 所以就要跳过那些篇章,直接学习基于注解的组件扫描. 发现spring2是 ...
- Authentication in .NET Web Api
在介绍WebApi这个小demo前,先来简单说一下OAuth这个东西. OAuth开放授权,用户可以对自己的资源进行第三方授权,那么第三方就可以不用你的账号密码就可以访问你授权的资源了.比如一些论坛直 ...
- paip.汉字简化大法总结
paip.汉字简化大法总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax ...
- JSP取得绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下: 一.使用${pageContext.reques ...