ios反注入与反反注入

0x1 反注入原理

防止别人的动态库注入到我们自己程序的进程的内存空间,在正向开发中可以在编译的时候加上

-WI,-sectcreate,__RESTRICT,__restrict,/dev/null   选项在可执行文件增加一个__RESTRICT节,忽略掉环境变量的注入,也就是说别人的动态库无法注入(可以在dyld源码中有体现),有这个节后dyld会忽略掉环境变量。

dyld-210.2.3源码:

ios反注入与反反注入_第1张图片

但是在dyld-210.2.3之后的dyld源码(比如dyld-195)(ios10版本以上)就把相应的检测去掉了

ios反注入与反反注入_第2张图片

虽然编译的Macho有__RESTRICT,__restrict节,但是没有用了,因为dyld源码已经不支持了。

0x2 反注入实现

在原理里面讲了,在ios10以下的可以在Xcode编译的时候在other link flags加上-WI,-sectcreate,__RESTRICT,__restrict,/dev/null标志,那么还有一种方法检测加载动态库的路径是否有DynamicLibraries,如果有就说明他加载了越狱手机的动态库,就说明了有动态库注入。

#import 
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]));
    }
}

结果:检测到之后开发者可以做一些处理。

ios反注入与反反注入_第3张图片

其他的反注入的方法有待发现,留个空位。。。。。。

0x3 反反注入

反反注入可以对应反注入的几个方法,通过__RESTRICT节反注入的话,可以通过MachOView、010修改这个节的相对位置,修改成其他的符号,程序加载的时候找不到这个符号这个节就会失效,然后替换原来的macho,重新重签名,之后安装就OK了。

你可能感兴趣的:(IOS)