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;
- }
相关推荐
本文将深入探讨iOS代码混淆技术,这是提高应用程序安全性的关键手段之一。代码混淆能够使原始代码变得难以理解,从而降低被恶意分析或破解的风险。 首先,我们需要了解什么是代码混淆。代码混淆是一种软件保护技术...
在"eXploit-main"这个文件夹中,可能包含了源代码示例、漏洞分析文档、PPT演示文稿、教程视频等内容,用于深入学习Objective-C的安全攻防。通过学习这些资料,开发者不仅可以了解如何避免在自己的代码中引入漏洞,还...
开源::hot_springs:分享GitHub优秀的开源项目和主流开发使用的网站,解决问题方案收集以及学习网站或资料,涵盖了iOS,macOS X,Blockchain,Flutter,Weex,H5,游戏,C ++,脚本等多方面的内容,其中iOS大致包涵...
它支持多种语言,包括Objective-C,使得与苹果的生态系统无缝对接。Cocos2d-iPhone的核心特性包括:场景管理、精灵动画、物理引擎、粒子系统、定时器、触摸事件处理等,这些都为游戏开发者提供了极大的便利。 ...
ZXHookDetection 越狱检测 1.使用NSFileManager通过检测一些越狱后的关键文件/路径是否可以访问来判断是否越狱 常见的文件/路径有 static char *JailbrokenPathArr[] = {"/Applications/Cydia.app","/usr/sbin/sshd...
由于JSC是用Objective-C编写,因此,理解和利用JSC的漏洞需要掌握Objective-C语言和iOS/MacOS平台的特性。JSC的漏洞可能包括类型错误、内存管理问题或是与WebKit(Safari的渲染引擎)交互过程中的安全漏洞。攻击者...
在iOS应用开发中,我们通常使用Objective-C(简称OC)语言来实现这种效果。"跑马灯.xcodeproj_OC_"这个项目文件是用Xcode创建的一个iOS工程,专门用于实现跑马灯功能。 在iOS开发中,跑马灯效果可以通过多种方式...
2. **移动应用开发**:涵盖iOS和Android平台的开发技术,包括Swift、Objective-C、Java、Kotlin等语言的应用,以及跨平台开发框架如React Native和Flutter的介绍。 3. **云计算**:深入解析AWS、Azure、Google ...
需要了解数据分析工具如Hadoop、Spark,以及安全攻防策略。 10. **大数据系统工程师**:处理大量数据的存储、处理和分析,需精通Hadoop、Hive、Spark等大数据技术,以及C/C++编程。 11. **语音合成与识别技术研发*...