0x1 反注入原理
防止别人的动态库注入到我们自己程序的进程的内存空间,在正向开发中可以在编译的时候加上
-WI,-sectcreate,__RESTRICT,__restrict,/dev/null 选项在可执行文件增加一个__RESTRICT节,忽略掉环境变量的注入,也就是说别人的动态库无法注入(可以在dyld源码中有体现),有这个节后dyld会忽略掉环境变量。
dyld-210.2.3源码:
但是在dyld-210.2.3之后的dyld源码(比如dyld-195)(ios10版本以上)就把相应的检测去掉了
虽然编译的Macho有__RESTRICT,__restrict节,但是没有用了,因为dyld源码已经不支持了。
0x2 反注入实现
在原理里面讲了,在ios10以下的可以在Xcode编译的时候在other link flags加上-WI,-sectcreate,__RESTRICT,__restrict,/dev/null标志,那么还有一种方法检测加载动态库的路径是否有DynamicLibraries,如果有就说明他加载了越狱手机的动态库,就说明了有动态库注入。
#import <mach-o/dyld.h>
BOOL isInjected0(){
int count = _dyld_image_count();//获取加载image的数量
if (count > 0) {
for (int i = 0; i < count; i++) {//遍历所有的image_name。判断是否有DynamicLibraries
const char * dyld = _dyld_get_image_name(i);
if (strstr(dyld, "DynamicLibraries")) {
return YES;
}
}
}
return NO;
}
BOOL isInjected1(){//检测环境变量是否有DYLD_INSERT_LIBRARIES
char* env = getenv("DYLD_INSERT_LIBRARIES");
if(env){
return YES;
}
return NO;
}
int main(int argc, char * argv[]){
@autoreleasepool {
//disable_lldb();//可以注释此语句运行对比没有反调试的区别
//syscall(26,31,0,0,0);//26是代表Kernel SysCall 中ptrace的序号
if(isDebuggerPresent()){
NSLog(@"检测到被调试。。。");
}
// //dbCheckBlock block=^{NSLog(@"检测到被调试。。。")};
// dbgCheck(^{
// NSLog(@"检测到被调试。。。");
// });
if(isInjected0()){
NSLog(@"检测到被注入。。。isInjected0");
}
if(isInjected1()){
NSLog(@"检测到被注入。。。isInjected1");
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
结果:检测到之后开发者可以做一些处理。
其他的反注入的方法有待发现,留个空位。。。。。。
0x3 反反注入
反反注入可以对应反注入的几个方法,通过__RESTRICT节反注入的话,可以通过MachOView、010修改这个节的相对位置,修改成其他的符号,程序加载的时候找不到这个符号这个节就会失效,然后替换原来的macho,重新重签名,之后安装就OK了。