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

  大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧.

然后看看汇编情况哦!

学习函数呢,肯定要弄清楚几个事情.

1.跳转地址.

2.返回地址

3.参数

4.函数获取参数

5.返回值和如何返回

6.扫尾

我们开始了哦!1个个的突破!唉,这个学习笔记是一边学一边写,不知道到底能不能边写边突破呢.小马过河,试试吧.呵呵.

1.跳转地址.因为xcode默认反汇编的时候,并没有显示出机器码,所以这里,我们要用一个命令去显示:disassemble -fmb

我们发现这样子呢就可以看到机器码了.然后,bl就是call了哦.bl后面的0x18dc4就是具体的函数代码地址了.这里,我们要从机器码中学习下跳转地址是如何计算的.我们知道在x86中是这样计算的:

call指令的地址 +call指令的长度- 偏移量 = 跳转地址.课是这里我卡住了.

   0x18dfe:  0xf7ffffe1   bl     0x18dc4                   ; Add at main.m:13

我刚才忙乎了会,实在是没想出来算法.这里,我先做个记号.我们先学习下面的内容.

2.返回地址

我们从代码中可以看到bl(call)指令后的返回地址是 0x18e02 .我们脑子里首先浮现是x86平台,返回地址是存放在ESP寄存器中的.通过 ESP 寄存器的地址取内容就是返回地址.但是我们现在在 IOS 中.IOS 中我还没有发现 ESP 寄存器.那么只有一个办法.我们把进入函数前和进入函数后的寄存器都打印出来对比下.

进入函数前                                  进入函数后

我们看到进入函数后有一个寄存器叫lr或者叫r14的值与我们的0x18e02最接近.但是为什么会多1个1呢.哈哈,目前还未知啊!不过我们再看看函数的反汇编

在最后有bx lr ,既然这样,这条指令又在最后面,一个函数结束了肯定要返回的.所以说我们就可以认定lr寄存器就是放入的函数返回值.

3.参数

我们再看看这个图

我们程序传入的参数是1和2.我们从反汇编看到,1和2 被传入了r2和r3.只是我们目前在调试版下进行的实验,所以编译器做了些无用功.

但是最后我们发现,r2,r3是给了r0和r1.然后马上就跳转到函数了.那么说明,r0,r1做为传递参数的可能性最大.但是数据量大的时候怎么办的呢

等下回再分析了,呵呵.

4.函数获取参数

我们再看看这个截图呢

晕!调试版的程序就是比较麻烦啊.我们看到

0x18dc6:  str    r0, [sp, #0x8]

0x18dc8:  str    r1, [sp, #0x4]

0x18dca:  ldr    r0, [sp, #0x8]

0x18dcc:  ldr    r1, [sp, #0x4]

这笨蛋编译器把r0和r1中的参数又放到了栈里,又从栈里取回到原处.

这里的原因是因为调试版,,为什么ro和r1寄存器中的值刚刚保存,马上又将其加载回来.

但是至少我们知道.取函数,就是直接从寄存器里面取的了.

5.返回值和如何返回

从上面的截图我们知道

0x18dce:  add    r0, r1

返回值放入了r0中了.

然后呢

0x18dd4:  add    sp, #0xc

因为之前呢

0x18dc4:  sub    sp, #0xc

所以现在必须把12加回去.因为必须确保栈指针的正确性,不然栈指针会指向错误的地方了哦.!

我们之前要减12呢.其实目前来看,就是预留了12个字节的空间.

6.扫尾了哦!

0x18dd6:  bx     lr

最后,执行bx指令会回到调用函数的地方.还记得lr吗,放的是函数的返回地址哦.

至此函数就分析完了,但是我忘记了一个事情,就是没有在函数里放置局部变量.等下次我再加入局部变量分析了哦!学习过x86确定对看 IOS arm也有帮助.其实关键是分析思路哦!要根据蛛丝马迹重现犯罪现场哦!

当然后面会继续分析 OC 的方法,希望不要太难了哦!

时间: 2024-10-09 14:52:26

我也要学iOS逆向工程--函数的相关文章

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

大家好!很久不见了.我之前去音乐学院进修爵士吉他去了.现在回来了.之前我一直在学windows开发和逆向.后来到了音乐学院,老师推荐了1个录音软件叫logic prox.可惜啊!当时我只有个索尼的笔记本电脑,后来我在淘宝上找了个卖家,专门安装黑苹果的,结果我的电脑声卡驱动不了.这下完蛋了.后来.只有花血本买了个15寸视网膜macbook.再后来我安装了个xcode.哈哈!再后来没想到,MACOS,IOS 开发比 Windows 开发好玩多了.然后学了半年的 IOS 开发.觉得非常有意思.以至于l

ios逆向工程-静态分析

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

学iOS开发(一)——实现一款App之Foundation框架的使用

当你着手为你的应用编写代码的时候,你会发现有许多可供使用的Objective-C的框架类,其中尤其重要的就是基础框架类,它为平台所有的应用提供基础服务.基础框架类中包括了表示字符串和数字等基本数据类型的值类(value classes),也有用来存储其他对象的集合类(collection classes).你将会依赖值类和集合类为你的ToDoList app编写大量代码. 值对象(Value Objects) Foundation框架提供了生成字符串.二进制数据.日期和时间.数字以及其他值对象的

学iOS开发(二)——实现一款App之编写自定义类

今天学iOS开发(二)--实现一款App之编写自定义类 当开发iOS应用程序时,你会发现在许多场景下,你需要编写自己的自定义类.当你需要数据和自定义行为一起打包时,自定义类就很有用了.在一个自定义的类中,你可以为存储.操纵和显示数据定义你自己的行为. 例如,考虑iOS Clock app中的全球时钟标签(World Clock tab).这个表视图中的单元格需要显示比标准表视图单元格更多的内容.这是一个不错的机会实现一个扩展UITableViewCell行为的子类,从而在给定的表视图单元格中显示

ARM指令集应该也算得上是iOS逆向工程的基础

当然,如果读者仅仅是想阅读污点跟踪相关的代码,可以去github中按照自己的需要下载对应部分源码即可.如实现变量级.Native级污点跟踪的代码基本都在dalvik目录下,单个函数调用操作所使用的栈部分被称为栈帧(stack frame)结构,其一般结构如上图所示.栈帧结构的两端由两个指针来指定.寄存器ebp通常用做帧指针(frame pointer),而esp则用作栈指针(stack pointer).在函数执行过程中,栈指针esp会随着数据的入栈和出栈而移动,因此函数中对大部分数据的访问都基

iOS逆向工程之使用LLDB的USB连接调试第三方App

LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具.使用LLDB可以动态的调试你的应用程序,如果你不做其他的额外处理,因为debugserver缺少task_for_pid权限,所以你只能使用LLDB来调试你自己的App.那么本篇博客中就要使用LLDB来调试从AppStore下载安装的App,并且结合着Hopper来分析第三方App内部的结构.LLDB与Hopper的结合,会让你看到不一样的东西,本篇博客就会和你

iOS逆向工程-工具篇

对于初开始学习iOS逆向工程的人来说,实现一个tweak可以算是入门逆向工程了.当然了,可能你现在还不知道tweak是什么.简单来说,你可以把一个tweak当作某一个app的一个插件(类似于浏览器广告屏蔽插件).在app运行的时候,tweak会hook住某个函数,然后在hook的函数里面,你可以插入你的代码.比如用户在登陆微信账号的时候,tweak可以hook住登录函数,dump出用户的账号密码.那问题来了,我们要如何知道哪个函数是账号登录函数咧?这就涉及到我们如何去分析一个iOS app 要进

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

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

iOS指向函数的指针和block

  一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作为函数的参数传递: 与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用: 二:普通数据类型.指向函数的指针.block的定义的类比 1:基本数据类型: 例如:int a = 10; 格式:数据类型  变量名 = 值: 2:指向函数的指针:可以仿照上边基本数据类型的定义 例如:voi