IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译-阿里云开发者社区

开发者社区> 刘恒兴> 正文

IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译

简介: 反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。
+关注继续查看

反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。反编译的快捷键是F5,菜单位置在 顶部菜单View->Open Subviews->Pseudocode。(有网友问到为什么按照第一篇的地址下载IDA后也没有F5,最终是发现他自己装了python,设了环境变量,这会令IDA工作不正常)


在显示反汇编的窗口中按F5,经过分析后,会多了一个标签栏Pseudocode-A:

继续上一节(可用两个浏览器窗口对比)的示例,以-[TestButton printLog]为例,可得到反编译代码:

__CFString *__cdecl _TestButton_Test__printLog_(void *a1)
{
  int v1; // ebx@1
  __CFString *result; // eax@3
  void *v3; // ecx@3

  v1 = OBJC_IVAR___TestButton_m_model;
  if ( DataModel__count(*(_DWORD *)((char *)a1 + OBJC_IVAR___TestButton_m_model)) )
  {
    if ( DataModel__count(*(_DWORD *)((char *)a1 + v1)) == 1 )
    {
      v3 = objc_msgSend(a1, (const __seg *)model[0]);// 改名前显示为v3 = objc_msgSend(a1, (const __seg *)off_57FC[0]);
      result = &cfstr_Fine;
      if ( !v3 )
        result = &cfstr_Error;
    }
    else
    {
      result = *(__CFString **)((char *)a1 + OBJC_IVAR___TestButton_m_printLog);
    }
  }
  else
  {
    result = &cfstr_Ok;
    if ( *(_DWORD *)((char *)a1 + OBJC_IVAR___TestButton_m_printLog) )
      result = *(__CFString **)((char *)a1 + OBJC_IVAR___TestButton_m_printLog);
  }
  return result;
}

改名的操作同样可在反编译代码中进行,只是界面稍有不同。在off_57FC处右键单击,选择Rename global item。无论在反汇编还是反编译改名,都会在另一方同步修改。



Objective-C和C++一样,每个类的函数实际都可用static的C函数表示,第一参数是self或this指针。所以反编译代码中,参数a1的类型显示为void*,实际也就是id,类的实例对象,即self指针。相比源码,反编译中有许多冗余代码,而且好多的类型转换和解引用,这是难免的,代码写法太多,总不能要求IDA这么智能。其实看多了也就习惯了,O(∩_∩)O

再看另一个函数:

源码中 @symthesize model 会得到 -[TestButton setModel:]函数,其反编译代码为:

int __cdecl _TestButton_setModel__(int a1, int a2, int a3)
{
  int result; // eax@1

  result = OBJC_IVAR___TestButton_m_model;
  *(_DWORD *)(a1 + OBJC_IVAR___TestButton_m_model) = a3;
  return result;
}
实际上这个函数返回值应该是void,但编译器是没有void返回值概念的,总会把一些东西返回,只是没用。a2是selector,实质为字符串的起始地址,IDA只能识别为int。a3是Objective-C语法的第一个参数,即被setModel的model,我们知道它是DataModel*,即传来的是一个地址,也被IDA当做int了,即32bit的数值。

这个结果很容易看出来实际操作是 m_model = a3;

第3个例子:

- (bool)inWindow
{
    return self.window != nil;
}
bool __cdecl _TestButton_inWindow_(void *a1)
{
  return objc_msgSend(a1, (const __seg *)off_57C4[0]) != 0;
}

其中off_57C4改名后就是window。如此简单的源码才可能和反编译代码形同。另外也可看出,0可能会代表实际代码中的 NO,false,NULL,nil等。1则可能会代表YES,true。

当没有debugging symbol时,bool会被显示为char,因为bool是语法类型,不是编译器类型,占1个字节,和char相同。


以上便是反编译最简单的应用。

上一篇:IDA反汇编/反编译静态分析iOS模拟器程序(四)反汇编的符号信息与改名

下一篇:IDA反汇编/反编译静态分析iOS模拟器程序(六)交叉引用

本文请勿转载。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
静态分析Smali添加日志
如何动手实现Smali添加日志
136 0
iOS - Analyze 静态分析
1、Analyze 使用 Xcode 自带的静态分析工具 Product -> Analyze(快捷键 command + shift + B)可以找出代码潜在错误,如内存泄露,未使用函数和变量等。
1149 0
使用 gcc 命令把C语言程序反汇编
之前看过一点汇编,不过现在都忘记得差不多了。最近又很蛋疼地想起反汇编这个东西。这里使用 gcc 命令对 .c 文件进行反汇编,把 C语言 翻译成汇编语言 先准备一个简单的 C 程序 sum.c #include int add(int, int); int mode(int, i...
3072 0
gdb反汇编详解C函数底层实现笔记(程序堆栈、内存分配)
以下是在读《深入理解计算机系统》前面的章节“程序的机器级表示”时,自己动手在linux上使用了gdb对一个简单的C程序进行反汇编,通过不懈的努力终于查清楚弄明白了绝大多数的语句。
798 0
IDA反汇编/反编译静态分析iOS模拟器程序(三)函数表示与搜索函数
打开IDA一般都是去搜索函数,可以说函数是IDA工程的基本单位吧,数据结构什么的都是为函数服务而已。函数列表在界面左侧的Functions Window: 可以看到,UIKit有27789个函数呢。
891 0
IDA反汇编/反编译静态分析iOS模拟器程序(四)反汇编的符号信息与改名
首先看看windows IDA和xcode的反汇编有什么不同。因为不确定直接分析UIKit的代码会不会有法律问题,还是自己写个例子吧。分析UIKit的时候因为没有完整的debugging symbols,所以得到的反汇编信息会比自己写的代码较少。
855 0
IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译
反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。
1064 0
反汇编教程及汇编命令详解(一)
原文地址:http://www.cnblogs.com/xqzhao/archive/2008/04/15/1154607.html原作者:济公计算机寄存器分类简介:32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
793 0
xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编 - (void)test { UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.
739 0
+关注
刘恒兴
一个喜欢在各个技术领域到处浪的人
119
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载