"dyld`__abort_with_payload" 尝试对 iOS 应用进行逆向工程时出现错误和退出代码 45
"dyld`__abort_with_payload" error and exit code 45 on attempted reverse engineering of iOS app
我正在尝试对 iOS 应用程序进行逆向工程以移除越狱检测。使用 lldb 时,我得到了这个输出:
* thread #1: tid = 0xe26e, 0x00000001012322f8 dyld`__abort_with_payload + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
我查了一下 __abort_with_payload
与嵌入式二进制文件或代码签名或其他东西有关,这让我有理由相信它与 mobilesubstrate 将 dylib 注入应用程序的方式有关。
我尝试禁用 mobilesubstrate,并再次 运行 lldb。这次,它给出了一个不同的问题:
Process 16662 resuming
Process 16662 exited with status = 45 (0x0000002d)
退出代码 45 是什么? Google 搜索没有多大帮助,但根据 osstatus.com,它可能意味着 ENOTSUP
或 "Operation not supported"。 "Operation not supported" 是什么意思?
是PT_DENY_ATTACH
。
许多 SO 答案已经在一定程度上涵盖了它,以便您了解:here & . Even in more details covered in Alexander O'mara 's blog post here
要在可执行文件运行之前在 lldb 中反击它,请输入:
b ptrace
你应该看到这样的东西:
Breakpoint 5: where = libsystem_kernel.dylib`__ptrace, address = 0x00000001c2b17140
为您指明实际处理的位置。
当你命中 ptrace 断点 类型:
th r
即thread return
的简化语法
它会强制退出 ptrace 函数而不实际执行拒绝部分。
在th r
之后你可能会看到这样的东西
-> 0x100daa548 <+140>: str w0, [sp, #392]
0x100daa54c <+144>: bl 0x100b01cb8 ; ___lldb_unnamed_function1756$$prodx
0x100daa550 <+148>: bl 0x100b02538 ; ___lldb_unnamed_function1760$$prodx
0x100daa554 <+152>: bl 0x100daa470 ; ___lldb_unnamed_function29542$$prodx
代码片段来自 OP,无关紧要。重要的是 ip
(即指令指针寄存器)在 ptrace
调用之后指向 next 汇编指令。因此,要查看发生了什么,我们必须反汇编前面的汇编代码。每条 arm64 汇编指令都是 4 个字节,因此我们键入:
di -s 0x100daa544
这很可能会产生:
0x100daa544 bl <some address> ; aka ptrace(PT_DENY_ATTACH, ...)
所以现在你可以只检查操作码的实际字节^:
x 0x100daa544 -c 4
这些是要用下面提到的 nop 替换的字节。
然而它可能会发生 ptrace 是直接而不是 通过像这样的系统调用(这就是 libsystem_kernel.dylib`__ptrace:实际上在内部做):
mov x0, #0x1f ; this is PT_DENY_ATTACH 31 syscall argument
mov x16, #0x1a ; x0,x16 can be set in numerous ways so I skip the opcodes
01 10 00 D4 svc #0x80
这是 AARCH64(又名 arm64)程序集,所以我假设您的设备是 iPhone5s 或更新版本。为了进一步混淆它,指令可能会被一些不相关的指令分开。如果您需要遵循此路径,请检查 SO 问题 .
所以用
替换你最喜欢的十六进制编辑器中的 01 10 00 D4
1f 20 03 d5 nop
应该让你继续。
不使用 svc
中的 0x80
系统调用
可能会发疯
01 00 00 d4 svc #0
21 00 00 d4 svc #1
01 02 00 d4 svc #0x10
e1 1f 00 d4 svc #0xff
它们中的每一个都会碰巧工作,但它可能会在任何时候中断(从 iOS7 到现在 iOS 13 仍然没有)。
最后备注:
如果您实际修改二进制文件,可能会存在一些额外的保护机制,例如校验和和其他自完整性检查。这绝对超出了这个问题的范围。
我正在尝试对 iOS 应用程序进行逆向工程以移除越狱检测。使用 lldb 时,我得到了这个输出:
* thread #1: tid = 0xe26e, 0x00000001012322f8 dyld`__abort_with_payload + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
我查了一下 __abort_with_payload
与嵌入式二进制文件或代码签名或其他东西有关,这让我有理由相信它与 mobilesubstrate 将 dylib 注入应用程序的方式有关。
我尝试禁用 mobilesubstrate,并再次 运行 lldb。这次,它给出了一个不同的问题:
Process 16662 resuming
Process 16662 exited with status = 45 (0x0000002d)
退出代码 45 是什么? Google 搜索没有多大帮助,但根据 osstatus.com,它可能意味着 ENOTSUP
或 "Operation not supported"。 "Operation not supported" 是什么意思?
是PT_DENY_ATTACH
。
许多 SO 答案已经在一定程度上涵盖了它,以便您了解:here &
要在可执行文件运行之前在 lldb 中反击它,请输入:
b ptrace
你应该看到这样的东西:
Breakpoint 5: where = libsystem_kernel.dylib`__ptrace, address = 0x00000001c2b17140
为您指明实际处理的位置。
当你命中 ptrace 断点 类型:
th r
即thread return
它会强制退出 ptrace 函数而不实际执行拒绝部分。
在th r
之后你可能会看到这样的东西
-> 0x100daa548 <+140>: str w0, [sp, #392]
0x100daa54c <+144>: bl 0x100b01cb8 ; ___lldb_unnamed_function1756$$prodx
0x100daa550 <+148>: bl 0x100b02538 ; ___lldb_unnamed_function1760$$prodx
0x100daa554 <+152>: bl 0x100daa470 ; ___lldb_unnamed_function29542$$prodx
代码片段来自 OP,无关紧要。重要的是 ip
(即指令指针寄存器)在 ptrace
调用之后指向 next 汇编指令。因此,要查看发生了什么,我们必须反汇编前面的汇编代码。每条 arm64 汇编指令都是 4 个字节,因此我们键入:
di -s 0x100daa544
这很可能会产生:
0x100daa544 bl <some address> ; aka ptrace(PT_DENY_ATTACH, ...)
所以现在你可以只检查操作码的实际字节^:
x 0x100daa544 -c 4
这些是要用下面提到的 nop 替换的字节。
然而它可能会发生 ptrace 是直接而不是 通过像这样的系统调用(这就是 libsystem_kernel.dylib`__ptrace:实际上在内部做):
mov x0, #0x1f ; this is PT_DENY_ATTACH 31 syscall argument
mov x16, #0x1a ; x0,x16 can be set in numerous ways so I skip the opcodes
01 10 00 D4 svc #0x80
这是 AARCH64(又名 arm64)程序集,所以我假设您的设备是 iPhone5s 或更新版本。为了进一步混淆它,指令可能会被一些不相关的指令分开。如果您需要遵循此路径,请检查 SO 问题
所以用
替换你最喜欢的十六进制编辑器中的01 10 00 D4
1f 20 03 d5 nop
应该让你继续。
不使用 svc
中的 0x80
系统调用
01 00 00 d4 svc #0
21 00 00 d4 svc #1
01 02 00 d4 svc #0x10
e1 1f 00 d4 svc #0xff
它们中的每一个都会碰巧工作,但它可能会在任何时候中断(从 iOS7 到现在 iOS 13 仍然没有)。
最后备注:
如果您实际修改二进制文件,可能会存在一些额外的保护机制,例如校验和和其他自完整性检查。这绝对超出了这个问题的范围。