otx 是用于在 OS X 10.0-10.4 上反汇编 Mach-O 二进制文件的工具。它是 otool 之上的增强功能,可向其反汇编输出添加额外的符号信息。
主站点和 SVN 存储库 ( http://otx.osxninja.com/ ) 似乎早已不复存在。我在 GitHub 上看到了一些存储库,但有没有人维护或更新 otx 以在现代版本的 Mac OS 上工作?
otx 是用于在 OS X 10.0-10.4 上反汇编 Mach-O 二进制文件的工具。它是 otool 之上的增强功能,可向其反汇编输出添加额外的符号信息。
主站点和 SVN 存储库 ( http://otx.osxninja.com/ ) 似乎早已不复存在。我在 GitHub 上看到了一些存储库,但有没有人维护或更新 otx 以在现代版本的 Mac OS 上工作?
我发现的最新叉子otx是Cai 的. 我已经在 macOS 10.11.6 上尝试了他的v1.7 : Build 566版本的 CLI 界面,它在基本反汇编中运行良好,尽管调用它-o来“检查可执行文件的混淆”对我编写的一些测试代码,它终止于
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[X8664Processor verifyNops:numFound:]: 无法识别的选择器发送到实例 0x7fb7e5806200”
在我看来,如今有更适合的工具可用于在 OSX 上反汇编二进制文件,其中otool与otx临时反汇编相比,即使是现在,它似乎也不缺乏功能。
让我们通过反汇编读取的代码部分(本质上是 的 32 位版本32-__builtin_clz(n))来快速浏览一下:
static uint8_t f1_u32(uint32_t n) {
return n ? 1 + f1_u32(n/2) : 0;
}
使用otool -t -d -vV -j -q -H -P ./kk 2>/dev/null | grep -A24 "^_f1_u32:"我们得到:
_f1_u32:
0000000100000de0 55 pushq %rbp
0000000100000de1 48 89 e5 movq %rsp, %rbp
0000000100000de4 48 83 ec 10 subq $0x10, %rsp
0000000100000de8 89 7d fc movl %edi, -0x4(%rbp)
0000000100000deb 83 7d fc 00 cmpl $0x0, -0x4(%rbp)
0000000100000def 0f 84 1b 00 00 00 je 0x100000e10
0000000100000df5 8b 45 fc movl -0x4(%rbp), %eax
0000000100000df8 c1 e8 01 shrl $0x1, %eax
0000000100000dfb 89 c7 movl %eax, %edi
0000000100000dfd e8 de ff ff ff callq _f1_u32
0000000100000e02 0f b6 f8 movzbl %al, %edi
0000000100000e05 83 c7 01 addl $0x1, %edi
0000000100000e08 89 7d f8 movl %edi, -0x8(%rbp)
0000000100000e0b e9 0a 00 00 00 jmp 0x100000e1a
0000000100000e10 31 c0 xorl %eax, %eax
0000000100000e12 89 45 f8 movl %eax, -0x8(%rbp)
0000000100000e15 e9 00 00 00 00 jmp 0x100000e1a
0000000100000e1a 8b 45 f8 movl -0x8(%rbp), %eax
0000000100000e1d 88 c1 movb %al, %cl
0000000100000e1f 0f b6 c1 movzbl %cl, %eax
0000000100000e22 48 83 c4 10 addq $0x10, %rsp
0000000100000e26 5d popq %rbp
0000000100000e27 c3 retq
0000000100000e28 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax)
使用./otx -d ./kk 2>/dev/null | grep -A26 "^_f1_u32:",这是结果:
_f1_u32:
+0 0000000100000de0 55 pushq %rbp
+1 0000000100000de1 4889e5 movq %rsp, %rbp
+4 0000000100000de4 4883ec10 subq $0x10, %rsp
+8 0000000100000de8 897dfc movl %edi, -0x4(%rbp)
+11 0000000100000deb 837dfc00 cmpl $0x0, -0x4(%rbp)
+15 0000000100000def 0f841b000000 je 0x100000e10
+21 0000000100000df5 8b45fc movl -0x4(%rbp), %eax
+24 0000000100000df8 c1e801 shrl $0x1, %eax
+27 0000000100000dfb 89c7 movl %eax, %edi
+29 0000000100000dfd e8deffffff callq _f1_u32
+34 0000000100000e02 0fb6f8 movzbl %al, %edi
+37 0000000100000e05 83c701 addl $0x1, %edi
+40 0000000100000e08 897df8 movl %edi, -0x8(%rbp)
+43 0000000100000e0b e90a000000 jmp 0x100000e1a Anon4
+48 0000000100000e10 31c0 xorl %eax, %eax
+50 0000000100000e12 8945f8 movl %eax, -0x8(%rbp)
+53 0000000100000e15 e900000000 jmp 0x100000e1a Anon4
Anon4:
+0 0000000100000e1a 8b45f8 movl -0x8(%rbp), %eax
+3 0000000100000e1d 88c1 movb %al, %cl
+5 0000000100000e1f 0fb6c1 movzbl %cl, %eax
+8 0000000100000e22 4883c410 addq $0x10, %rsp
+12 0000000100000e26 5d popq %rbp
+13 0000000100000e27 c3 retq
+14 0000000100000e28 0f1f840000000000 nopl (%rax,%rax)
除了外观上的差异,我们实际上得到(并期望)非常相似的输出。
不知道您的议程,最近我发现自己使用radare2或漏斗GUI 工具,而不是摆弄otool或otx拆卸时。
在 hopper 中,您甚至可以从反汇编中获得一个不错的伪代码(如果& 0xff在这种情况下hopper 将其解释为对无符号变量的提示,可能会更好):
int _f1_u32(int arg0) {
var_4 = arg0;
if (var_4 != 0x0) {
var_8 = (_f1_u32(var_4 >> 0x1) & 0xff) + 0x1;
} else {
var_8 = 0x0;
}
rax = var_8 & 0xff;
return rax;
}