在 iOS 上禁用调试会话 - 这有用吗?
Disabling debug sessions on iOS - is that useful?
我最近浏览了这篇文章 (http://www.splinter.com.au/2014/09/16/storing-secret-keys/),其中讨论了 iOS 上的混淆。
我引用:
To somewhat mitigate the risk of crackers attacking your app with a debugger (LLDB or GDB), you can insert some code in your app that makes it crash as soon as it detects a debugger attached. The iTunes app uses this technique, you can read about it here.
在main()
中调用以下代码实现
#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif // !defined(PT_DENY_ATTACH)
void disable_gdb() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
我知道这些代码行会使调试器在附加到进程时崩溃,但它是如何实现这种行为的?
此外,这是否会以任何方式损害应用程序的稳定性?
关于 OS X 的类似问题似乎已在此处得到解答:Implementing the PT_DENY_ATTACH anti-piracy code。
TL;DR - 正如 Jim Ingham 在评论中指出的那样,这是在浪费时间。
我最近浏览了这篇文章 (http://www.splinter.com.au/2014/09/16/storing-secret-keys/),其中讨论了 iOS 上的混淆。 我引用:
To somewhat mitigate the risk of crackers attacking your app with a debugger (LLDB or GDB), you can insert some code in your app that makes it crash as soon as it detects a debugger attached. The iTunes app uses this technique, you can read about it here.
在main()
#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif // !defined(PT_DENY_ATTACH)
void disable_gdb() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
我知道这些代码行会使调试器在附加到进程时崩溃,但它是如何实现这种行为的?
此外,这是否会以任何方式损害应用程序的稳定性?
关于 OS X 的类似问题似乎已在此处得到解答:Implementing the PT_DENY_ATTACH anti-piracy code。
TL;DR - 正如 Jim Ingham 在评论中指出的那样,这是在浪费时间。