iOS逆向-day7:iOS 命令行工具开发

类似Clutch命令行工具的开发
一、命令行工具的创建 和 main函数的处理
  • 1.1、我们利用 Xcode创建一个命令行工具,取名:JKCommandLine,我们利用Xcode 的iOS环境创建的目的是:让Xcode 帮我们配置好各种环境,比如:签名、一些权限 等等


    命令行项目的创建

    命令行项目的创建
  • 1.2、删除无用的文件

    删除无用的文件

    提示:main 函数里面我们返回了:return 0; 就是不需要界面的意思

  • 1.3、Command + B 获取可执行文件


    可执行文件
  • 1.4、一般我们要的是发布版本的可执行文件,我们可以修改


    release环境的配置
  • 1.5、我们把可执行文件拖到 用户手机目录下的 Device/usr/bin

    增加 命令行工具的可执行权限,我们李恩杰设备后可以执行如下命令

    chmod +x /usr/bin/JKCommandLine
    

    命令行工具的使用

    JKCommandLine
    
    命令行工具的使用g
二、命令行功能分析
  • 2.1、功能分析,我们要获取一个 app 的架构 和 是否加壳,主要是根据头文件的前四个字节


  • 2.2、具体的代码实现

    #import <UIKit/UIKit.h>
    #import <mach-o/fat.h>
    #import <mach-o/loader.h>
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            printf("JKCommandLine-------");
      
            NSString *appPath = @"/private/var/mobile/Containers/Bundle/Application/4BB74232-94B6-4465-87E7-AFE4F6E5C91D/WebToon.app/WebToon";
            NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:appPath];
      
            int length = sizeof(uint32_t);
            // 读取最前面额 4 个字节 (magic number, 魔数,用来标识文件类型)
            NSData *magicData = [handle readDataOfLength:length];
      
            // 魔数,用来标识文件类型
            uint32_t magicNumber;
            // 把 magicData 4个字节的数据放到 magicNUmber 内存里面
            [magicData getBytes:&magicNumber length:length];
      
            if (magicNumber == FAT_CIGAM || magicNumber == FAT_MAGIC) {
                  printf("FAT文件\n");
             } else if (magicNumber == MH_MAGIC || magicNumber == MH_CIGAM) {
                  printf("非64bit架构文件\n");
             } else if (magicNumber == MH_MAGIC_64 || magicNumber == MH_CIGAM_64) {
                  printf("64bit架构文件\n");
             } else {
                  printf("读取失败");
             }
      
             printf("----0x%x\n", magicNumber);
      
             // 关闭文件处理器
             [handle closeFile];
      
             // return 0:就是需要界面的意思
             return 0;
      
        }
    }
    
    • 提示:上面的代码在读取的时候会失败,如下,这是因为缺少权限的原因,后面在 给可执文件增加权限
三、读取用户输入的参数
  • 3.1、在 main 函数里面会获取到参数

    /// main函数
    /// @param argc 参数个数
    /// @param argv 存放参数的数组
    ///  argv [0] 是当前可执行文件的路径
    int main(int argc, char * argv[]) {
    
    }
    

    第一个参数是固定的, argv [0] 是当前可执行文件的路径;当有参数的时候是从第二个参数开始的

  • 3.2、参数的设置
    一般来说,我们会在参数的前面会加一个 -,比如:我们常用的 Clutch,查看所有的 加壳的应用:Clutch -i

    那么我们也设置两个参数:-i-s

    #import <UIKit/UIKit.h>
    #import <mach-o/fat.h>
    #import <mach-o/loader.h>
    
    /// main函数
    /// @param argc 参数个数
    /// @param argv 存放参数的数组
    ///  argv [0] 是当前可执行文件的路径
    int main(int argc, char * argv[]) {
        @autoreleasepool {
      
           if (argc == 1) {
               printf("-l 查看Macho 信息\n -s 查看Macho 信息\n");
               return 0;
           }
           // 找不到对用的参数
           if (strcmp(argv[1], "-l") != 0 || strcmp(argv[1], "-s") != 0) {
               printf("-l 查看Macho 信息\n -s 查看Macho 信息\n");
               return 0;
           }
    
           // return 0:就是需要界面的意思
           return 0;
      
        }
    }
    
四、给 Mach-0 文件增加 entitlements (权限)
  • 4.1、查看可执行文件的权限,这里我们使用的 ldid,当然也可以使用 codesign,下面我们以 JKCommandLine 为例,我们导出 JKCommandLine 权限,如下

    cd 进入 JKCommandLine 可执行文件的路径
    // 导出 JKCommandLine 可执行文件的权限
    ldid -e JKCommandLine > JKCommandLine.entitlements
    

    语法:导出权限:ldid -e 可执行文件名字 >> 可执行该文件的名字.entitlements,代表的意思是:将 可执行文件的权限导入到 可执行该文件的名字.entitlements 文件里面去

    查看可执行文件的权限

    我们可以看到 JKCommandLine的权限很少
    • 提示:一个 > 代表覆盖,两个 >> 代表追加到文件的尾部
    • 权限:entitlements == plist == xml
  • 4.2、我们可以看到普通的一个 可执行文件全新啊很低,那么如何增加可执行文件的权限呢?我们可以获取 SpringBoard 的权限,然后再赋给我们的可执行文件的权限

    • 获取 SpringBoard 可执行文件,在路径:Device/System/Library/CoreServices/SpringBoard.app
    • 获取 SpringBoard 权限

      cd 进入 SpringBoard 可执行文件的路径
      // 导出 SpringBoard 可执行文件的权限
      ldid -e SpringBoard > SpringBoard.entitlements 
      
      获取 SpringBoard 权限
    • 将 SpringBoard 的权限 签给 其他的可执行文件,比如签给 JKCommandLine ,如下,我们把 SpringBoard.entitlements 放到 JKCommandLine目录下

      cd 进入 JKCommandLine 可执行文件的路径
      ldid -SSpringBoard.entitlements JKCommandLine
      


      语法:重新签回权限:ldid -S可执行该文件的名字.entitlements 可执行该文件的名字,这里的签名仅仅是签权限

  • 4.3、测试 JKCommandLine 文件的,我们可以看到我们有了读取其他app的权限

五、命令行工具的总结
  • 5.1、命令行工具的本质
    本质:可执行文件,跟app内部的可执行文件差不多

  • 5.2、测试一下其他app的可执行文件,比如爱奇艺

六、拓展: MJAppTools

源码地址:https://github.com/CoderMJLee/MJAppTools

  • 6.1、下载源码后,执行以下两种的任意一种方式


  • 6.2、复制编译后的生成的文件 MJAppTools 到 越狱手机的 iFunBox 的 usr/bin 目录下

  • 6.3、复制 MJAppTools 到 越狱手机的 iFunBox 的 usr/bin 目录下

  • 6.4、让 MJAppTools 具有执行的权利,终端链接越狱手机后,执行 chmod +x /usr/bin/MJAppTools

  • 6.5、MJAppTools 的使用


  • 6.6、JKAppTools 后面可以跟上图的命令,如 : -l <regex> 列出用户安装的应用

    JKAppTools -l
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343