尝试对 iOS 应用程序进行逆向工程时出现“dyld`__abort_with_payload”错误和退出代码 45

Posted

技术标签:

【中文标题】尝试对 iOS 应用程序进行逆向工程时出现“dyld`__abort_with_payload”错误和退出代码 45【英文标题】:"dyld`__abort_with_payload" error and exit code 45 on attempted reverse engineering of iOS app 【发布时间】:2019-12-30 06:29:49 【问题描述】:

我正在尝试对 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?谷歌搜索没有太大帮助,但根据osstatus.com,它可能意味着ENOTSUP 或“不支持操作”。 “不支持操作”是什么意思?

【问题讨论】:

【参考方案1】:

它是PT_DENY_ATTACH

许多 SO 答案已经在某种程度上涵盖了它,以便给你一个想法:here & here。甚至在 Alexander O'mara 的博文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

代码 sn-p 来自 OP,无关紧要。重要的是ip(即指令指针寄存器)指向ptrace 调用之后的下一个 汇编指令。因此,要查看发生了什么,我们必须反汇编前面的汇编代码。每条 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 问题 here。

因此,将您最喜欢的十六进制编辑器中的 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 仍然没有)。

最后的评论:

如果您确实修改了二进制文件,则可能存在一些额外的保护机制,例如校验和和其他自我完整性检查。这绝对超出了这个问题的范围。

【讨论】:

感谢您的详细回复,这真的很有帮助。我只想删除 ptrace 部分。我对 asm 不是很好,但我没有看到像你展示的那样。你能指出我要搜索什么的正确方向吗?这是 lldb 的日志:paste.bingner.com/paste/ve4as 是的,确实如此。感谢所有的帮助。

以上是关于尝试对 iOS 应用程序进行逆向工程时出现“dyld`__abort_with_payload”错误和退出代码 45的主要内容,如果未能解决你的问题,请参考以下文章

无法找到最新的可用模拟器运行时 - 在 iOS 上构建 RN 应用程序时出现 Image.xcassets

尝试在 iOS 7 下使用 SwiftyJSON 解析 JSON 数据时出现未知类型

Xcode:尝试在iOS模拟器中运行应用程序时出现无效的符号链接错误

尝试在 Heroku 上部署 Node.js/Express/Socket.io 应用程序时出现应用程序错误

尝试对链表进行排序时出现左值错误

当我尝试对文件IO使用nextint()时出现不匹配异常错误