ios - 检测 Cycript/Substrate 或 gdb 是否附加到 iOS 应用程序的进程?

标签 ios reverse-engineering cycript process-injection

我正在构建一个将敏感数据传输到我的服务器的 iOS 应用程序,并且我正在签署我的 API 请求作为附加措施。我想让逆向工程尽可能难,并且使用 Cycript 找到一些真实世界应用程序的签名 key ,我知道通过附加到进程来找到这些 key 并不难。我完全清楚,如果某人真的很熟练并且足够努力,他们最终利用,但我正在努力让它尽可能地努力,同时仍然是方便我自己和用户。

我可以检查越狱状态并采取额外措施,或者我可以进行 SSL 固定,但两者仍然很容易通过附加到进程和修改内存来绕过。

有什么方法可以检测东西(无论是 Cycript、gdb 还是任何可用于破解进程的类似工具)是否附加到进程,同时又不被拒绝应用商店?

编辑:这不是 Detecting if iOS app is run in debugger 的副本.这个问题与输出更相关,它检查输出流以确定是否有输出流附加到记录器,而我的问题与此无关(并且该检查不涵盖我的情况)。

最佳答案

gdb 检测是可行的 via the linked stackoverflow question - 它使用 kstat 来确定进程是否正在被调试。这将检测当前是否有调试器附加到进程。

还有一段代码-Using the Macro SEC_IS_BEING_DEBUGGED_RETURN_NIL in iOS app - 它允许您在代码的各个位置(它是 C/Objective-C)中插入一个执行调试器附加检查的宏。

至于检测 Cycript,当它针对一个进程运行时,它会在进程中注入(inject)一个 dylib 来处理 cycript 命令行和进程之间的通信——这个库的部分名称看起来像 cynject。该名称看起来与典型 iOS 应用程序中存在的任何库都不相似。这应该可以通过类似 (C) 的小循环检测到:

BOOL hasCynject() {
    int max = _dyld_image_count();
    for (int i = 0; i < max; i++) {
        const char *name = _dyld_get_image_name(i);
        if (name != NULL) {
            if (strstr(name, "cynject") == 0) return YES;
        }
    }
}

同样,给它一个比这更好的名字是可取的,同时混淆你正在测试的字符串。

这些只是可以采用的方法 - 不幸的是,这些方法只能在运行时以某些方式保护您,如果有人选择将 IDA 或其他反汇编程序指向它,那么您将不会受到保护。

将调试器检查作为宏实现的原因是您会将代码放置在代码中的不同位置,因此试图修复它的人将不得不对应用程序进行各种修补的地方。

关于ios - 检测 Cycript/Substrate 或 gdb 是否附加到 iOS 应用程序的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34131835/

相关文章:

android - 无法将没有 CSS 节点的子节点添加到没有测量功能的节点

Linux ELF/LSB 二进制调试器

linux-kernel - 从 RAM 快照解码页表和描述符表的工具

javascript - 选择Pinterest上的所有图像以移至另一 block 板

security - Swift 能抵抗 hook 吗?

ios - React Native Firebase 存储上传失败并出现未知错误

ios - 如何创建没有矩形边界的自定义 View ,并启用手势识别

ios - Objective-C block 参数问题 : This block declaration is not a prototype