• 我也要学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 的方法,希望不要太难了哦!

  • 相关阅读:
    flexbox 伸缩布局盒
    border-radius 知识点
    appium+Python第一个unitest
    linux常用命令整理
    appium的demo编程
    appium+Python环境搭建
    pycharm将py文件打包成可执行文件exe
    jmeter线程组设置
    jmeter的如何设置headers
    Python使用pillow的坑
  • 原文地址:https://www.cnblogs.com/dodolook/p/4262330.html
Copyright © 2020-2023  润新知