- 上一篇文章: 深入解读:探索Reveal调试工具的奥秘
这篇文章写完后,收到了群里小伙伴的积极反馈,其中一位私聊我说,通过阅读文章,对Reveal的操作有了更清晰的认识,尽管没有亲自动手操作,但通过文章中的描述,他已经了解了如何使用。这让我感到非常欣慰,证明了逆向文章的价值所在。
感谢这位朋友的反馈,也感谢大家的支持。接下来,我会继续更新更多的逆向文章,希望你能够喜欢,并且期待得到你的反馈和支持。如果有任何问题或建议,请随时留言给我,我会尽力改进和完善。
- 本篇继续介绍逆向工具
下面是我之前写得逆向工具文章
下面是我最近写得工具文章
1.MachOView
- MachOView下载地址 地址
最后的更新的版本:2019-07-27,已经是最新的了,我们开发中使用最新版本就可以了.
- 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--汇编程序员的生命
交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。
目前最棒的一个静态反编译软件,为众多[0day]世界的成员和[ShellCode]安全分析人士不可缺少的利器!
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉[Windows]或[Linux] [WinCE] [MacOS]平台主机来分析程序, 被公认为最好的逆向工程利器。
只需要next进行安装,然后启动,就可以分析自己的汇编程序了.
IDA Pro如何使用呢?
- 1.创建项目
- 2.找到可执行文件
- 3.IDA打开可执行文件
-
4.找到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 是一款帮助我们静态分析可执行文件的工具.
它可以将Mach-O文件的机器语言代码反编译成汇编代码,OC/Swift伪代码
Hoppe可以让你进行反汇编、反编译和调试你的应用程序。-
Hopper Disassembler结构
第一次打开我们可以看到,Hopper Disassembler分几个???
1.定义所有符号列表及列表字符串,所看到的类名,方法名等
2.汇编语言
3.检查器,包含有关探索区域的上线信息
4.python命令工具
5.D,A,C,P,U 数据,ASCLL,代码,过程,定义
6.代码编译的几种模式
我们仍然使用上一篇文章中的项目TEST
我们打包项目,获取ipa包(这里不再详细描述打包的过程)
- 我们点击TEST,可以看到TEST的Unix可执行文件,这就是我们需要的文件
我们拷贝TEST到桌面
接着,我们打开Hopper Disassembler
- 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按钮反编译后的源码
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的逆向工具及调试工具.