大家好!很久不见了.我之前去音乐学院进修爵士吉他去了.现在回来了.之前我一直在学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逆向工程--全局变量的更多相关文章

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

    大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧. 然后看看汇编情况哦! 学习函数呢,肯定要弄清楚几个事情. 1.跳转地址. 2.返回地址 3.参数 4.函数获取 ...

  2. ios逆向工程-静态分析

    最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> --- ...

  3. ios逆向工程

    原 ios逆向工程-内部钩子(Method Swizzling)   Method+Swizzling ios hook Method Swizzling(方法调配) 怎么说呢,先了解什么是钩子为什么 ...

  4. iOS逆向工程资料

    链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)

  5. 从零开始学 ios 的一些建议 摘自http://www.cocoachina.com/ios/20150826/13151.html

    我是一只小菜鸟,今天在cocoaChina 看到一篇关于初学者,也就是零基础的童鞋的一些建议,感觉写的好好. 我觉得,学习真的是很累,但是,你要记得一句话,,世界上最最可怕的两个字是认真.共勉! 事情 ...

  6. 从零开始学 iOS 开发的15条建议

    事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交 ...

  7. iOS逆向工程,(狗神)沙梓社大咖免费技术分享。

    序言 简介:本文针对于广大iOS开发者,作为一名开发者,仅仅专注于一门语言可能已经不适用现在的市场需求,曾经因高薪和需求量巨大,而火爆一时的移动端开发者(Android,ios),如今的路却是不再那么 ...

  8. iOS逆向工程概述(转)

    逆向工程一词,对很多人来说可能很陌生,在android领域,我们经常会听到“反编译某个apk”,那么逆向工程从某种角度讲也包括反编译这项技术,这样一对比,可能我们就更容易理解逆向工程的定义了. 我们引 ...

  9. (素材源代码)猫猫学IOS(四)UI之半小时搞定Tom猫

    下载地址:http://download.csdn.net/detail/u013357243/8514915 以下是执行图片展示 制作思路以及代码解析 猫猫学IOS(四)UI之半小时搞定Tom猫这里 ...

随机推荐

  1. 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作

    开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...

  2. [C++] socket - 6 [API互斥事件对象实现线程同步]

    /*API互斥事件对象实现线程同步*/ #include<windows.h> #include<stdio.h> DWORD WINAPI myfun1(LPVOID lpP ...

  3. [JS7] 显示从0到99的100个数字

    <html> <head> <title>JS Unleashed</title> </head> <body> <SCR ...

  4. 如何利用tomcat搭建一个动态服务器

    这篇文章只记录已解压缩包的方式安装,通常linux服务器上也是这样. 1.下载tomcat.zip压缩包. http://tomcat.apache.org/download-70.cgi 2.把zi ...

  5. iOS开发-NSURLSession详解

    Core Foundation中NSURLConnection在2003年伴随着Safari浏览器的发行,诞生的时间比较久远,iOS升级比较快,AFNetWorking在3.0版本删除了所有基于NSU ...

  6. NodeJS-图片上传(Express)

    文件上传是每个网站不可避免的,最近需要做些上传图片的功能,主要解决两个问题,一个是文件上传样式和服务端路径保存,功能很简单,做起来倒是没那么简单,先从最简单的页面的上传页面的样式开始. 页面样式 Ht ...

  7. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  8. Proxy模式:管理第三方API

    软件中的Barrier. 数据从程序移到DB中时,要跨越数据库的Barrier.消息从一个PC到另一个PC时,要跨越网络Barrier. 跨越可能是复杂的,很可能处理Barrier的Code会多于处理 ...

  9. android: SQLite删除数据

    删除数据对你来说应该就更简单了,因为它所需要用到的知识点你全部已经学过了. SQLiteDatabase 中提供了一个 delete()方法专门用于删除数据,这个方法接收三个参数,第一 个参数仍然是表 ...

  10. Android视觉规范-间距规范与文字规范单位换算(dip、sp与px)

    http://blog.csdn.net/shimiso/article/details/29826073 1.dip与px Android工程师在写页面时,margin值的单位是dip,而视觉设计师 ...