"循序渐进:MacOS工具探索"

这篇文章写完后,收到了群里小伙伴的积极反馈,其中一位私聊我说,通过阅读文章,对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

这些应用都会对你的逆向分析有辅助作用.

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

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351