[ios]安全攻防之代码混淆的一个小工具
2014-08-08 14:38
591 查看
看了“念茜”的这篇文章:
http://blog.csdn.net/yiyaaixuexi/article/details/29201699
觉得非常好,不过里面提到一个func.list的文件。
规则:
创建函数名列表func.list,写入待混淆的函数名,如:
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;
就这样写:
sample
seg1
seg2
所以我用c语言写了以下的代码,专门用来生成func.list文件。
代码的功能是遍历你的工程,把里面的.h和.m文件找出来。并且把里面的类名,方法名,参数名等按上面的规则列出来。
注:因为一般.m和.h是配对的,比如test.m就有test.h,不过有时也只有config.h,而没有对应的.m文件。所以里面有一个小逻辑是如果有m文件,就不处理h文件,怕重复类名方法名等。
代码是c语言实现的
http://blog.csdn.net/yiyaaixuexi/article/details/29201699
觉得非常好,不过里面提到一个func.list的文件。
规则:
创建函数名列表func.list,写入待混淆的函数名,如:
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;
就这样写:
sample
seg1
seg2
所以我用c语言写了以下的代码,专门用来生成func.list文件。
代码的功能是遍历你的工程,把里面的.h和.m文件找出来。并且把里面的类名,方法名,参数名等按上面的规则列出来。
注:因为一般.m和.h是配对的,比如test.m就有test.h,不过有时也只有config.h,而没有对应的.m文件。所以里面有一个小逻辑是如果有m文件,就不处理h文件,怕重复类名方法名等。
#include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> //编译方法, //gcc file.c -o file //运行方法 //./file //然后就会输出你工程里的类名方法名,就可以把这里组装成一个需要混淆的配置文件了。 //缺限 //1.输出名字没有做重复处理。 //2.判断方法时只是处理了两种情况,如果空格多于2个没有处理。 #if 0//放开调试 #define Printf_info(x,y) printf(x,y); #else #define Printf_info(x,y) #endif int Mydir(const char *filepath); int checkFile(const char *filepath); int findNum = 0; int main(int argc, char *argv[]) { //此代码的功能是遍历ios的项目的所有。h和。m的文件,把里面的类名,方法名,参数名等都提取出来, //方便用CSDN博主“念茜”的方法来混淆自己的代码用。 Mydir("/myProject");//填写自己的工程的根目录路径。 return 0; } void Print_fileName(const char * filename) { int a = strlen(filename); for(int i=0;i<a - 2; i++){ printf("%c",filename[i]); } printf("\n"); } int Mydir(const char *filepath) { char *fullpath,*filetype,*tmp; struct stat statbuf; DIR *dr; struct dirent *drt; if((dr=opendir(filepath))==NULL) return 2; while((drt=readdir(dr))!=NULL) { if(strcmp(drt->d_name,".")==0||strcmp(drt->d_name,"..")==0||strcmp(drt->d_name,".DS_Store")==0) continue; fullpath=strdup(filepath); fullpath=strcat(fullpath,"/"); fullpath=strcat(fullpath,drt->d_name); Printf_info("%s\n",fullpath); if(stat(fullpath,&statbuf)<0) continue; if (S_ISREG(statbuf.st_mode)) { filetype="reguler"; int a = strlen(drt->d_name); char *pp = drt->d_name; //printf("---- %c %c" , pp[a - 2], pp[a - 1]); if(pp[a - 2] == '.' && pp[a - 1] == 'm') { Print_fileName(drt->d_name); checkFile(fullpath); } #if 0 else if(pp[a - 2] == '.' && pp[a - 1] == 'h') { char *mPath = strdup(fullpath); //printf("\nmpath: %s\n",mPath); char *ppp = mPath;//drt->d_name; int a = strlen(ppp); ppp[a - 1] = 'm';//检查m文件是否存在。 //printf("\nmpath: %s\n",mPath); if((access(mPath,F_OK))==0){ continue; } Print_fileName(drt->d_name); checkFile(fullpath); } #endif } else if(S_ISDIR(statbuf.st_mode)) { filetype="directory"; //fullpath=strcat(fullpath,"/"); //printf("%s,%s\n",fullpath,filetype); tmp=strdup(fullpath); Mydir(tmp); } else { filetype="invalid"; printf("%s,%s\n",fullpath,filetype); } //printf("%s,%s\n",fullpath,filetype); bzero(fullpath,strlen(fullpath)); } return 0; } int print_Method(char *text) { char *p = text; char c; int start = 0; while((c = *p++) !='\n'){//Method if(c == ':' || c == '{' || c == ';'){ start = 0; break; } if(start == 1){ printf("%c", c); } if(c == ')') start = 1; } printf("\n"); #if 0 start = 0; while((c = *p++) !='\n'){//arge if(c == ':'){ start = 0; printf("\n"); } if(start == 2 && c != '{'){ printf("%c", c); } if(c == ' ' && start == 1) start = 2; if(c == ')') start = 1; } //printf("\n"); #endif return 0; } int findMethod(char *text) { char *p = text; char c; while((c = *p++) !='\n'){ if(c == '-' && ((*p == ' ' && *(p + 1) == '(') || *p == '(' )){ if( text[0] == '-' ) { //printf("%d %s\n", findNum++, text); print_Method(text); } //else // printf("%d %s\n", findNum++, text); } if(c == '+' && ((*p == ' ' && *(p + 1) == '(') || *p == '(' )){ if( text[0] == '+' ) { //printf("%d %s\n", findNum++, text); print_Method(text); } //else // printf("%d %s\n", findNum++, text); } } return 0; } int checkFile(const char *filepath) { //printf("====%s\n", filepath); FILE *fp1;//定义文件流指针,用于打开读取的文件 char text[40961];//定义一个字符串数组,用于存储读取的字符 fp1 = fopen(filepath,"r");//只读方式打开文件a.txt while(fgets(text,40960,fp1)!=NULL)//逐行读取fp1所指向文件中的内容到text中 { //puts(text);//输出到屏幕 findMethod(text); } fclose(fp1);//关闭文件a.txt,有打开就要有关闭 return 0; }
代码是c语言实现的
相关文章推荐
- iOS安全攻防(二十三):Objective-C代码混淆
- iOS安全攻防(二十三):Objective-C代码混淆
- iOS安全攻防(二十三):Objective-C代码混淆
- iOS安全攻防(二十三):Objective-C代码混淆
- iOS安全攻防:static和被裁的符号表,Objective-C代码混淆,敏感逻辑的保护方案(1)
- iOS安全攻防(二十三):Objective-C代码混淆
- iOS安全–浅谈关于iOS加固的几种方法,代码混淆,类名方法名混淆等
- 推荐一个js代码混淆工具的网址
- iOS安全攻防(一):Hack必备的命令与工具
- iOS 一个在UDP/TCP通信时,对16进制、10进制、NSData等数据之间的转换发送等处理的工具类库,一行代码将16进制字符串轻松转换成UDP需要的指令数据
- iOS安全攻防(一):Hack必备的命令与工具
- 迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试
- iOS应用安全之代码混淆设计篇
- 想做一个整合开源安全代码扫描工具的代码安全分析平台
- 安全攻防——Objective-C代码混淆
- iOS安全攻防:越狱后Hack必备的命令与工具
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
- iOS安全攻防 工具链及获取途径
- iOS安全攻防(一):Hack必备的命令与工具