Skip to content

Latest commit

 

History

History
140 lines (119 loc) · 3.95 KB

09_代码防护.md

File metadata and controls

140 lines (119 loc) · 3.95 KB

#从逆向分析入手

  • 静态分析
    • 字符串加密
    • 类名,方法名混淆
      • 混淆前 [LZAlertView addText]
      • 混淆后 [m1m34355 addText]
    • 代码混淆 (加入没有意义的控制流程 ,打断程序代码片段。)
  • 调式 -> 反调试
  • 注入 -> 反注入
  • 中间人攻击
    • https
    • 证书

#数据加密

  • 字符串加密,把程序里的明文字符串进行加密
  • 存储加密,存在本地的数据是一种加密的状态
  • 网络加密,密文传输

#反调试,检测调试状态,拒绝调试器附加

  • ptrace。让程序不能被调试器附加
    #import </usr/include/sys/ptrace.h>
    #import <dlfcn.h>
    
    int main(int argc, char * argv[]){
        <!-- ptrace(int _request, pid_t _pid, caddr_t _addr, int _data) -->
        //_request = 31时,是防止调试器附加
        //第一种方式
        ptrace(PT_DENY_ATTACH,0,0,0);
    
        //第二种 动态拿 ptrace符号
        //定义函数句柄
        void *handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
        ptrace_ptr_t ptrace_ptr = (ptrace_ptr_t)dlsym(handle, "ptrace");
        ptrace_ptr(PT_DENY_ATTACH,0,0,0);
        
        syscall(26,31,0,0,0);
    }
    
  • sysctl。通过一个指令,判断是否被附加
    #import <sys/sysctl.h>
    
    int myGetPid(){
        int err = 0;
        struct kinfo_proc* proc_list = NULL;
        size_t length = 0;
        
    }
    
    BOOL isDebuggerPresernt(){
        int name[4];
    
        struct kinfo_proc info;
        size_t info_size = sizeof(inof);
    
        info.kp_groc.p_flag = 0;
    
        name[0] = CTL_;
        name[1] = x;
        name[2] = x;
        name[3] = y;
    
        if(sysctl(name, 4, &info, &info_size, NULL, 0) == -1){
            NSLog(@"sysctl error...");
            return NO;
        }
    
        retrun ((info.kp_proc.p_flag $ O_TRACC0) != 0);
    }
    int main(int argc, char * argv[]){
        if(isDebuggerPresernt()){
            NSLog(@"sysctl success...");
        }
    }
    
  • syscall。

#反注入

  • 防止动态库注入 target->Build Settings->Other Linker Flags->添加下面环境变量
-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
  • 检测加载动态库路径中是否有DynamicLibraries 遍历所有加载的Image,看是否含有这个字符串 或者检测是否存在环境变量 DYLD_INSERT_LIBRARIES
#import <mach-o/dyld.h>

BOOL isInjected0(){
    int count = _dyld_image_count();

    if (count > 0) {
        for(int i = 0; i<count; i++){
            const char * dyld = _dyld_get_image_name(i);
            if (strstr(dyld, "DynamicLibraries")){
                return true;
            }
        }
    }

    return false;
}

BOOL isInjected1(){
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    if (env) {
        return true;
    }
    return false;
}

#反反调试

  • Hook ptrace
  • Hook dlsym
  • Hook syscall
  • Hook sysctl

#反反注入

  • 反注入的原理:去加载Mach-o时,发现里面有一个特殊的section[Loda Commands->LC_SEGMENT(_RESTRICT)->Section Heasder(__restrict)],就会覆盖掉环境变量. 修改Macho->section改一下
  • 工具MachOView 010 Editor

#代码混淆

  • 类名方法名混淆
    • 宏定义替换 ios-class-guard
    $brew install ios-class-guard
    $ios-class-guard --sdk-root sdkpatch -X ./targert  ./目标文件 -O 输出头文件,然后Copy to pch file
    $ios-class-guard --sdk-root  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk ./asmuserlogin -O symbols.h
    
    • 直接替换MachO文件
      • 修改 __objc_classname
      • 修改 __objc_methodname
      • 重签名
  • ollvm 混淆(编译器混淆)
    • 基于LLVM Pass的混淆
    • Pass就是LLVM系统转化和优化的工作的一个节点,每个节点做一些工作,这些工作加起来就构成了LLVM整个系统的优化和转化。
    • ollvm,也是基于Pass做的混淆