一、检测调试
当一个应用被调试的时候,会给进程设置一个标识(P_TRACED),我们可以通过检测该进程是否有设置这个标识来检测进程是否正在被调试以保护好我们的应用。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <sys/types.h>
#include <sys/sysctl.h> static int check_debugger( ) __attribute__((always_inline)); int check_debugger( ) { size_t size = sizeof(struct kinfo_proc); struct kinfo_proc info; int ret,name[4]; memset(&info, 0, sizeof(struct kinfo_proc)); name[0] = CTL_KERN; name[1] = KERN_PROC; name[2] = KERN_PROC_PID; name[3] = getpid(); if((ret = (sysctl(name, 4, &info, &size, NULL, 0)))){ return ret; //sysctl() failed for some reason } return (info.kp_proc.p_flag & P_TRACED) ? 1 : 0; } |
为了让这个函数以inline方式编译,需要设置编译器的优化选项,-0z(函数以inline方式编译),-fast(加快编译速度)。
如果你不确信产生的目标代码以inline的方式编译该函数,你也可以将其转化成宏的方式。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#define DEBUGGER_CHECK { \
size_t size = sizeof(struct kinfo_proc); \ struct kinfo_proc info; \ int ret,name[4]; \ \ memset(&info, 0, sizeof(struct kinfo_proc)); \ \ name[0] = CTL_KERN; \ name[1] = KERN_PROC; \ name[2] = KERN_PROC_PID; \ name[3] = getpid(); \ \ if(ret = (sysctl(name, 4, &info, &size, NULL, 0))){ \ return (EXIT_FAILURE); \ } \ \ if(info.kp_proc.p_flag & P_TRACED){ \ /* Code to react to debugging goes here */ \ } \ } |
当前该方法只能检测debugger或dtrace的调试,而不能阻止非法代码注入或者cycript依附。
二、阻止调试
调用ptrace设置参数PT_DENY_ATTACH,如果有调试器依附,则会产生错误并退出。关于PT_DENY_ATTACH的说明如下:
这时再使用gdb attach的话会产生错误:
Segmentation fault: 11
或者使用gdb run该应用也会产生错误:
Program exited with code 055.
Mac OS X系统中,可以这样使用:
1
2 3 4 5 |
#include <sys/ptrace.h>
int main( ) { ptrace(PT_DENY_ATTACH, 0, 0, 0); ... } |
但是在IPhone中,<sys/ptrace>是不可用的,所以我们可以用下面的方式来代替:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
#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); } |
当然该方法也会被调试者下断点的方式来动态绕过或者使用IDA等反汇编工具打补丁绕过,所以我们应该在程序的多处地方调用该方式。
相关推荐
总的来说,Hopper是一款功能强大的iOS反编译工具,对于iOS开发者、安全研究员以及那些希望深入了解iOS应用工作原理的人来说,它是一个不可或缺的工具。然而,使用这类工具需谨慎,因为它可能涉及软件知识产权和法律...
Reveal是Mac os平台上的一款开发者调试IOS应用的Mac开发软件,reveal Mac版它能够在运行时调试和修改iOS应用程序。Reveal能连接到应用程序,并允许开发者编辑各种用户界面参数,这反过来会立即反应在程序的UI上。
因此,反调试技术旨在检测和阻止调试器的使用,以保护应用的隐私和安全性。 在Objective-C中,反调试技术主要包括以下几个方面: 1. **检查调试标志**: iOS设备在运行时会设置一个调试标志,如果检测到这个标志...
iOS与Mac反调试, 反逆向工具
本文将深入探讨ptrace反调试技术以及汇编调用系统方法,这些都是iOS开发者和安全研究人员必备的知识。 首先,ptrace是一个系统调用,允许一个进程监视和控制另一个进程。在iOS环境中,它被广泛用于调试工具,如lldb...
在iOS应用开发中,内存管理和软件调试是两个至关重要的环节,它们直接影响到应用程序的性能、稳定性和用户体验。本文将深入探讨这两个主题,并提供一些实用的技巧和方法。 首先,我们来谈谈iOS内存管理。iOS系统...
10. **安全考虑**:iOS应用的源码应考虑数据安全、隐私保护、反逆向工程等,防止恶意攻击或信息泄露。 总之,"IOS应用源码——商业授权.zip"包含的内容不仅涉及iOS应用的开发技术,还涵盖与商业授权相关的法律和...
结合重签名防护和sysctl反调试,开发者可以构建更强大的安全层,使得iOS应用更加难以被逆向工程或非法修改。然而,这些技术并不能完全阻止熟练的攻击者,因此,配合其他安全措施,如代码混淆、数据加密、动态沙盒...
iOS逆向其实有很多技巧跟途径,本书对于研究系统...都是需要重点保护的,于是,开发人员通过反调试、 数据加密、代码混淆等各种手段重重保护自己App, 为的就是增加逆向工程的难度,避免类似的安全问题 影响用户体验。
8. **反调试技术**:为了防止被苹果或第三方检测到,越狱工具可能使用各种反调试技术。源码中可能会包含这些技术的实现。 通过深入研究GreenPois0n的源代码,开发者不仅可以了解iOS系统的工作原理,还可以学习逆向...
1.2.1 与安全相关的iOS 逆向工程 4 1.2.2 与开发相关的iOS 逆向工程 5 1.3 iOS 软件逆向工程的一般过程 6 1.3.1 系统分析 7 1.3.2 代码分析 7 1.4 iOS 软件逆向工程用到的工具 8 1.4.1 监测工具 8 ...
打个比喻,iOS逆向工程就像一杆长矛,专门刺 ...都是需要重点保护的,于是,开发人员通过反调试、 数据加密、代码混淆等各种手段重重保护自己App, 为的就是增加逆向工程的难度,避免类似的安全问题 影响用户体验。
需要注意的是,在iOS设备上直接运行jd-gui可能受限于Apple的沙箱机制和安全政策,因此通常是在Mac电脑上进行反编译操作,然后再将结果应用到iOS项目中。 标签中的"java"指的是Java编程语言,它是跨平台的,由Sun ...
一个典型的iOS应用通常包含多个组成部分,如Storyboard(故事板)用于UI设计,Swift或Objective-C的源代码文件用于业务逻辑,以及Info.plist文件用于配置应用信息。在这个“密码”应用中,我们可能会看到类似...
本文将深入探讨iOS代码混淆的技术细节、手动加固与自动加固的区别以及实际应用案例,帮助开发者理解并实施这一关键的安全策略。 一、iOS代码混淆的基本概念 代码混淆,简单来说,就是通过一系列的转换过程,使原始...
iOS应用逆向工程(第2版) 第一部分 概 念 篇 第1章 iOS逆向工程简介 3 1.1 iOS逆向工程的要求 3 1.2 iOS应用逆向工程的作用 4 1.2.1 安全相关的iOS逆向工程 5 1.2.2 开发相关的iOS逆向工程 6 1.3 iOS应用...
本篇将深入探讨一个基于C++的iOS内核级别的反调试示例——"cpp-DemoAntiAntiDebuginiOSKernel",通过此项目,我们可以学习到如何在iOS内核层面对调试器进行检测和防御。 一、反调试基础概念 反调试(Anti-Anti-...
Xamarin是微软公司提供的一种开源框架,它允许开发者使用C#语言和.NET框架来创建iOS、Android以及Windows应用,而且能够实现接近原生应用的性能。 在Xamarin iOS开发中,有几个关键知识点值得深入探讨: 1. **...
iOS13.0真机调试包。 放置到xcode包里目录下的/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 然后重启xcode即可。
通过本书,开发者能够深入理解如何在实际项目中运用Apple的Swift语言和iOS SDK来构建高效、稳定且安全的企业级应用。以下是基于提供的章节名称的详细知识点介绍: 第13章:可能涵盖了“数据存储与持久化”。这一...