#从逆向分析入手
- 静态分析
- 字符串加密
- 类名,方法名混淆
- 混淆前 [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做的混淆