是否有最新的 otx 分支?

逆向工程 操作系统
2021-06-26 16:55:10

otx 是用于在 OS X 10.0-10.4 上反汇编 Mach-O 二进制文件的工具。它是 otool 之上的增强功能,可向其反汇编输出添加额外的符号信息。

主站点和 SVN 存储库 ( http://otx.osxninja.com/ ) 似乎早已不复存在。我在 GitHub 上看到了一些存储库,但有没有人维护或更新 otx 以在现代版本的 Mac OS 上工作?

1个回答

我发现的最新叉子otxCai 的. 我已经在 macOS 10.11.6 上尝试了他的v1.7 : Build 566版本的 CLI 界面,它在基本反汇编中运行良好,尽管调用它-o来“检查可执行文件的混淆”对我编写的一些测试代码,它终止于

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[X8664Processor verifyNops:numFound:]: 无法识别的选择器发送到实例 0x7fb7e5806200”

在我看来,如今有更适合的工具可用于在 OSX 上反汇编二进制文件,其中otoolotx临时反汇编相比,即使是现在,它似乎也不缺乏功能

让我们通过反汇编读取代码部分(本质上是 的 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 工具,而不是摆弄otoolotx拆卸时。

在 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;
}