大家好,这篇我开始学习函数了.先学 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 的方法,希望不要太难了哦!

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

  1. 我也要学iOS逆向工程--全局变量

    大家好!很久不见了.我之前去音乐学院进修爵士吉他去了.现在回来了.之前我一直在学windows开发和逆向.后来到了音乐学院,老师推荐了1个录音软件叫logic prox.可惜啊!当时我只有个索尼的笔记 ...

  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. 从头开始学JavaScript (七)——函数

    原文:从头开始学JavaScript (七)--函数 一.return 函数在执行完return之后停止并立即退出. return返回值:与return: 如下两个例子: function sum(n ...

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

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

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

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

随机推荐

  1. windows上自动设置java环境变量的脚本

    近期打算学习安卓开发,于是乎要准备java开发环境,安装好jdk后,就要设置java环境变量,java环境变量要设置JAVA_HOME,Path,CLASSPATH三个值,每次配置查百度复制粘贴都很麻 ...

  2. 【Leetcode】【Medium】Palindrome Partitioning

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  3. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  4. [ALM]一步一步搭建MS ALM环境 - 安装域服务器

    描述: 搭建并配置域服务器,先安装操作系统,配置网络,安装组件,配置域帐号 步骤: 1,打开Hyper-V Manager,参考[Hyper-V]使用操作系统模板创建新的虚拟机,先完成操作系统的安装, ...

  5. Nginx运行Mono Web (ASP.NET)

    Mono Web除了可以使用Apache/mod_mono方式承载运行外,还可以使用Nginx/FastCGI方式运行. Nginx配置asp.net更简单方便,用处也多,可以通过FastCGI运行a ...

  6. 比较任意两个JSON串是否相等(比较对象是否相等)JAVA版

    废话少说,直接入题. 在面向对象语言中,经常会比较两个对象是否相等,而比较的大多是实体类实例,也就是封装数据的那些类实例,或者是Map.List互相嵌套成的复杂数据结构. 比较对象是否相等,常见的思路 ...

  7. [ThingWorx] Install PostgreSQL Issue

    ThingWorx application need PostgreSQL, I try configurate it in macbook. The first step is install Po ...

  8. 【原】对频率论(Frequentist)方法和贝叶斯方法(Bayesian Methods)的一个总结

    注: 本文是对<IPython Interactive Computing and Visualization Cookbook>一书中第七章[Introduction to statis ...

  9. 在ASP.NET MVC5中建置以角色为基础的授权机制

    在前一篇贴文中,已探索过如何在MVC5中自定ASP.NET Identity,接下来要来试试在MVC5中如何运用 ASP.NET Identity来设定一个以 "角色"为基础的授权 ...

  10. 文件系统:Ext3和Ext4

    一.ext3和ext4的区别: 1.与Ext3兼容:执行若干条命令,就能将Ext3在线迁移到Ext4,而无须重新格式化磁盘或者重新安装系统.原有Ext3数据结构照样保留, Ext4作用于新数据,当然, ...