我正在构建一个将敏感数据传输到我的服务器的iOS应用程序,我正在签署我的API请求作为额外措施.我想尽可能地进行逆向工程,并且使用Cycript查找某些真实应用程序的签名密钥,我知道通过附加到流程来找到这些密钥并不困难.我完全清楚,如果有人真的很熟练并且努力尝试,他们最终会利用,但我想尽可能地努力,同时仍然方便自己和用户.
我可以检查越狱状态并采取其他措施,或者我可以执行SSL固定,但通过附加到进程并修改内存,两者仍然很容易绕过.
有没有办法检测是否有某些东西(无论是Cycript,gdb,还是任何可用于破解流程的类似工具)附加到流程中,而不是被App Store拒绝?
编辑:这不是检测iOS应用程序是否在调试器中运行的重复.该问题与输出更相关,它检查输出流以确定是否有输出流附加到记录器,而我的问题与此无关(并且该检查不包括我的条件).
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或其他一些反汇编程序,那么您就不会受到保护.
将调试器检查作为宏实现的原因是您将代码放在代码中的各个位置,因此有人试图修复它必须在各种地方修补应用程序.