美文网首页important
iOS逆向工具之(MacOS)工具介绍二

iOS逆向工具之(MacOS)工具介绍二

作者: 木子心语 | 来源:发表于2019-12-25 17:19 被阅读0次

    写了上篇文章后,群里的小伙伴反馈挺好的,小伙伴私聊我说Reveal的操作,他现在清楚了,就是没有亲自动手操作一下.他看了逆向文章后,跟着文章中的描述一步一步的操作,清晰明了,自己不亲自操作也知道如何使用.

    这是写文章以来,感觉自己比较欣慰的一件事,说明逆向文章没有白写.

    很感谢这位朋友的反馈,接下来文章继续进行.

    希望你能够喜欢逆向文章,也希望得到你的支持,我将下面的文章继续更新下去.

    希望得到大家的反馈.还是那句话,请留言给我.

    • 本篇继续介绍逆向工具

    下面是我之前写得逆向工具文章

    • 汇编逆向工具集 地址
    • 汇编逆向工具集(二) 地址

    下面是我最近写得工具文章

    • iOS逆向之逆向工具介绍 地址
    • iOS逆向之Reveal调试工具 地址

    最近写得逆向文章,我会一直更新的.

    1.MachOView

    MachOView
    • MachOView下载地址 地址
    MachOView下载地址

    最后的更新的版本:2019-07-27,已经是最新的了,我们开发中使用最新版本就可以了.

    • MachOView源码地址 地址
    MachOView源码地址
    • MachOView是一个可视化的Mach-O文件浏览器。它为探索和就地编辑Intel和ARM二进制文件提供了一个完整的解决方案。

    • Mach-O格式全称为Mach Object文件格式的缩写,是mac上可执行文件的格式.

    • Mach-O文件类型分为:
      1、Executable:应用的主要二进制
      2、Dylib Library:动态链接库(又称DSO或DLL)
      3、Static Library:静态链接库
      4、Bundle:不能被链接的Dylib,只能在运行时使用dlopen( )加载,可当做macOS的插件
      5、Relocatable Object File :可重定向文件类型

    • 使用

    在iDA中导出的可执行文件,依然可以用MachOView进行打开.

    注意
    如图,Mach64 Header(64位架构),选中mach header 可以看到每个类的cpu架构信息、load commands数量 、load commandssize 、file type等信息

    • 64位和32位架构有哪些不同?
    32位架构:
    
    struct mach_header {
        uint32_t    magic;      /* mach magic number identifier */
        cpu_type_t  cputype;    /* cpu specifier */
        cpu_subtype_t   cpusubtype; /* machine specifier */
        uint32_t    filetype;   /* type of file */
        uint32_t    ncmds;      /* number of load commands */
        uint32_t    sizeofcmds; /* the size of all the load commands */
        uint32_t    flags;      /* flags */
    };
    
    64位架构:
    
    struct mach_header_64 {
        uint32_t    magic;      /* mach magic number identifier */
        cpu_type_t  cputype;    /* cpu specifier */
        cpu_subtype_t   cpusubtype; /* machine specifier */
        uint32_t    filetype;   /* type of file */
        uint32_t    ncmds;      /* number of load commands */
        uint32_t    sizeofcmds; /* the size of all the load commands */
        uint32_t    flags;      /* flags */
        uint32_t    reserved;   /* reserved */
    };
    
    • 32位和64位架构的头文件区别是64位多了一个保留字段(reserved)
    • magic:魔数,用于快速确认该文件用于64位还是32位
    • cputype:CPU类型,比如 arm
    • cpusubtype:对应的具体类型,比如arm64、armv7
    • filetype:文件类型,比如可执行文件、库文件、Dsym文件

    2.IDA Pro--汇编程序员的生命

    image.png
    • 交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。

    • 目前最棒的一个静态反编译软件,为众多[0day]世界的成员和[ShellCode]安全分析人士不可缺少的利器!

    • IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉[Windows]或[Linux] [WinCE] [MacOS]平台主机来分析程序, 被公认为最好的逆向工程利器。

    • 只需要next进行安装,然后启动,就可以分析自己的汇编程序了.

    IDA Pro如何使用呢?
    • 1.创建项目
    创建项目
    • 2.找到可执行文件
    找到可执行文件
    • 3.IDA打开可执行文件
    IDA打开可执行文件
    • 4.找到main编译的汇编代码


      找到main编译的汇编代码
    • 5.分析汇编代码

    ; int __cdecl main(int argc, const char **argv, const char **envp)
    public _main
    _main proc near
    var_1C= dword ptr -1Ch
    var_18= dword ptr -18h
    var_14= dword ptr -14h
    var_10= qword ptr -10h
    var_4= dword ptr -4
    
    push    rbp
    mov     rbp, rsp
    sub     rsp, 20h
    lea     rax, cfstr_D    ; "%d"
    mov     [rbp+var_4], edi
    mov     [rbp+var_10], rsi
    mov     [rbp+var_14], 1
    mov     [rbp+var_18], 2
    mov     edi, [rbp+var_14]
    add     edi, [rbp+var_18]
    mov     [rbp+var_1C], edi
    mov     esi, [rbp+var_1C]
    mov     rdi, rax
    mov     al, 0
    call    _NSLog
    xor     eax, eax
    add     rsp, 20h
    pop     rbp
    retn
    _main endp
    
    • 6.通过对汇编代码进行分析,可以复原main方法中的代码
    分析

    3.Hopper Disassembler

    Hopper Disassembler
    • 官网地址:地址

    • 软件 我会统一整理后放到群里面,方便大家下载.

    • Hopper 是一款帮助我们静态分析可执行文件的工具.
      它可以将Mach-O文件的机器语言代码反编译成汇编代码,OC/Swift伪代码
      Hoppe可以让你进行反汇编、反编译和调试你的应用程序。

    • Hopper Disassembler结构


      Hopper Disassembler结构
    • 第一次打开我们可以看到,Hopper Disassembler分几个模块.
      1.定义所有符号列表及列表字符串,所看到的类名,方法名等
      2.汇编语言
      3.检查器,包含有关探索区域的上线信息
      4.python命令工具
      5.D,A,C,P,U 数据,ASCLL,代码,过程,定义
      6.代码编译的几种模式

    • 我们仍然使用上一篇文章中的项目TEST

    • 我们打包项目,获取ipa包(这里不再详细描述打包的过程)

    TEST
    • 我们点击TEST,可以看到TEST的Unix可执行文件,这就是我们需要的文件
    TEST-Unix
    • 我们拷贝TEST到桌面

    • 接着,我们打开Hopper Disassembler

    打开Hopper
    • Open TEST-Unix文件
    Open TEST-Unix
    • 点击OK,可以看到项目的结构


      项目结构
    • 我们对照源码看一下,我把源码粘贴到这里

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @property (nonatomic,strong)UIButton *revealBtn;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        [self.view addSubview:self.revealBtn];
    }
    
    -(UIButton*)revealBtn{
        if (!_revealBtn) {
            _revealBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            _revealBtn.frame = CGRectMake(100,100, 100,40);
            _revealBtn.backgroundColor = [UIColor redColor];
            [_revealBtn setTitle:@"测试" forState:UIControlStateNormal];
            [_revealBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        }
        return _revealBtn;
    }
    
    @end
    
    • 我们看一下创建revealBtn按钮反编译后的源码
    revealBtn反编译
    nop
    ldr        x0, #0x100008d78
    nop
    ldr        x1, #0x100008d38 ; @selector(buttonWithType:)
    movz       x2, #0x0
    bl         imp___stubs__objc_msgSend
    mov        x29, x29
    bl         imp___stubs__objc_retainAutoreleasedReturnValue
    ldr        x8, x19, x22
    str        x0, x19, x22
    mov        x0, x8
    bl         imp___stubs__objc_release
    ldr        x0, x19, x22
    nop
    ldr        x1, #0x100008d40 ; @selector(setFrame:)
    nop
    ldr        d0, #0x100006b68
    nop
    ldr        d3, #0x100006b70
    mov        v1, v0
    mov        v2, v0
    bl         imp___stubs__objc_msgSend
    adrp       x21, #0x100008000
    ldr        x0, [x21, #0xd80] ; objc_cls_ref_UIColor,_OBJC_CLASS_$_UIColor
    nop
    ldr        x1, #0x100008d48 ; @selector(redColor)
    bl         imp___stubs__objc_msgSend
    mov        x29, x29
    bl         imp___stubs__objc_retainAutoreleasedReturnValue
    mov        x20, x0
    ldr        x0, x19, x22
    nop
    ldr        x1, #0x100008d50 ; @selector(setBackgroundColor:)
    mov        x2, x20
    bl         imp___stubs__objc_msgSend
    mov        x0, x20
    bl         imp___stubs__objc_release
    ldr        x0, x19, x22
    nop
    ldr        x1, #0x100008d58 ; @selector(setTitle:forState:)
    adr        x2, #0x100008060
    nop
    movz       x3, #0x0
    bl         imp___stubs__objc_msgSend
    ldr        x20, x19, x22
    ldr        x0, [x21, #0xd80] ; objc_cls_ref_UIColor,_OBJC_CLASS_$_UIColor
    nop
    ldr        x1, #0x100008d60 ; @selector(whiteColor)
    bl         imp___stubs__objc_msgSend
    mov        x29, x29
    bl         imp___stubs__objc_retainAutoreleasedReturnValue
    mov        x21, x0
    nop
    ldr        x1, #0x100008d68 ; @selector(setTitleColor:forState:)
    mov        x0, x20
    mov        x2, x21
    movz       x3, #0x0
    bl         imp___stubs__objc_msgSend
    mov        x0, x21
    bl         imp___stubs__objc_release
    ldr        x0, x19, x22
    
    • 下面看一下对比
    源码对比

    我们通过观察,创建按钮的代码我们都可以猜到.当然这是很简单的Demo,复杂一些我们就要通过汇编代码进行分析,分析可能没有那么顺利,我们我要不断的尝试.

    • 记得 我在iOS逆向的第二篇文章有介绍逆向的经历,我们不需要把应用代码完全的翻译,因为那样会浪费很多的时间.如果你通过汇编代码猜测到了应用的实现逻辑,基本就知道了功能是怎么实现的.所以不需要花费大量的时间和精力.
    • Hopper的其他功能你可以自己尝试操作一下,可以帮助到你逆向分析.
      请一定要动手尝试一下,我会把软件放到群里面,方便大家下载.

    总结

    本篇文章主要介绍MacOS上安装的应用:

    • MachOView
    • IDA Pro
    • Hopper Disassembler

    这些应用都会对你的逆向分析有辅助作用.
    下面是MacOS的其他工具文章介绍:

    • iOS逆向之逆向工具介绍 地址
    • iOS逆向之Reveal调试工具 地址

    下一篇文章我们将要介绍iOS的逆向工具及调试工具.

    相关文章

      网友评论

        本文标题:iOS逆向工具之(MacOS)工具介绍二

        本文链接:https://www.haomeiwen.com/subject/oghqoctx.html