ios反注入与反反注入

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了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值