通过Mach-O获取方法名类名

未完待续....
下面的代码还是有问题的, 只能找非fat类型的 Mach-O , 正在写 fat类型的
uint64_t FilegetSize(const char *file_path){
    struct stat buf;
    if ( stat(file_path,&buf) < 0 )
    {
        perror(file_path);
        exit(1);
    }
    return buf.st_size;
}


void loadMachO()
{
    filePath = [[[NSBundle mainBundle] pathForResource:@"ZhaNiao_pjf-mobile" ofType:@""] UTF8String];
    
    FILE *fp_open = fopen(filePath,"r");
    uint64_t file_size = FilegetSize(filePath);
    if(!fp_open){
        printf("file isn't exist\n");
        exit(1);
    }
    printf("file size is 0x%llx\n\n",file_size);
    void *file_buf = malloc(file_size);
    if(fread(file_buf,1,file_size,fp_open)!=file_size){
        printf("fread error\n");
        exit(1);
    }
    fclose(fp_open);
    
    //检查是否为Fat头
    struct fat_header* fileStartAsFat = (struct fat_header*)file_buf;
    if(fileStartAsFat->magic==FAT_CIGAM||fileStartAsFat->magic==FAT_MAGIC){
        printf("is fat\n");
        //        exit(1);
    }
    
    //检查mach-o文件最前面几个字节的内容.
    struct mach_header *mh = (struct mach_header*)file_buf;
    int is32 = 1;
    
    if(mh->magic==MH_MAGIC||mh->magic==MH_CIGAM){
        is32 = 1;
    }
    else if(mh->magic==MH_MAGIC_64||mh->magic==MH_CIGAM_64){
        is32 = 0;
    }
    
    const uint32_t cmd_count = mh->ncmds;
    
    const struct load_command* const startCmds    = (struct load_command*)(((uint8_t*)mh) + sizeof(struct mach_header));
    //获取command段结束的地址,endCmds = mach-o地址 + mach-o头部长度 + cmds所用的长度
    const struct load_command* cmd = startCmds;
    
    for (uint32_t i = 0; i < cmd_count; ++i) {
     
        uint32_t cmdLength = cmd->cmdsize;
        
        struct segment_command * segCmd;
        
        const struct load_command* const nextCmd = (const struct load_command*)(((char*)cmd)+cmdLength);
        
        switch (cmd->cmd) {
            case LC_SEGMENT:
            {
                segCmd = (struct segment_command *)cmd;
                NSLog(@"segname = %s",segCmd->segname);
                

             
                if (strcmp(segCmd->segname, "__TEXT") == 0) {
                    
                    
                    struct section * sectionsStart = NULL;
                    struct section * nextSection = NULL;
                    for (int i = 0; i < segCmd->nsects; i++) {
                        
                        if (i == 0) {
                            sectionsStart = (struct section *)((char *)cmd + sizeof(struct segment_command));
                            nextSection = sectionsStart;

                        }else
                        {
                            nextSection = (struct section *)((char *)nextSection + sizeof(struct section));
                        }
                        
                        if (strncmp(nextSection->sectname, "__objc_methname", strlen("__objc_methname"))==0) {
                            NSLog(@"***** 修改方法名 ****");
                            
                            
                            
                        }
                        if (strncmp(nextSection->sectname, "__objc_classname", strlen("__objc_classname"))==0) {
                            NSLog(@"***** 修改类名 *****");
                         
                        }
                  
                        NSLog(@"sectionName = %s , segName = %s",nextSection->sectname,nextSection->segname);
                        
                        
                        
                    }

                    
                }
                
                
                
                
            }
                break;
                
            default:
                break;
        }
        cmd = nextCmd;
    }

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这篇文章算是对前面那篇动态注入 dylib 到 Mac 应用的一个细节补充, 主要针对使用的开源库yololib和...
    MD5Ryan阅读 8,749评论 2 3
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,699评论 0 4
  • Mach-O 概述 和 部分命令介绍 我们知道Windows下的文件都是PE文件,同样在OS X和iOS中可执行文...
    青花瓷的平方阅读 15,219评论 2 52
  • 推开吱呀的木门,抬头就看到烧火灶在靠左手边那面墙的中心位置,静静立着。灶头的瓷砖永远那么白,灶具整整齐齐放在一...
    离洛殊阅读 1,378评论 0 1
  • 从双廊回来一段时间了,心犹在,身归来。一直想着要说点什么,嘿嘿,说了是“伪”攻略来的,我不会说去哪里怎么便宜、有哪...
    火水相生阅读 1,490评论 0 1

友情链接更多精彩内容