当前位置:  开发笔记 > 运维 > 正文

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

如何解决《检测Cycript/Substrate或gdb是否附加到iOS应用程序的进程?》经验,为你挑选了1个好方法。

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

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

有没有办法检测是否有某些东西(无论是Cycript,gdb,还是任何可用于破解流程的类似工具)附加到流程中,而不是被App Store拒绝?

编辑:这不是检测iOS应用程序是否在调试器中运行的重复.该问题与输出更相关,它检查输出流以确定是否有输出流附加到记录器,而我的问题与此无关(并且该检查不包括我的条件).



1> Petesh..:

gdb检测可以通过链接的stackoverflow问题来实现 - 它使用kstat来确定进程是否正在被调试.这将检测调试器当前是否附加到进程.

还有一段代码 - 在iOS应用程序中使用宏SEC_IS_BEING_DEBUGGED_RETURN_NIL - 它允许您在代码中的各个位置(它是C/Objective-C)引入一个执行调试器附加检查的宏.

至于检测Cycript,当它针对一个进程运行时,它会在进程中注入一个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或其他一些反汇编程序,那么您就不会受到保护.

将调试器检查作为宏实现的原因是您将代码放在代码中的各个位置,因此有人试图修复它必须在各种地方修补应用程序.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有