iOS逆向-day7:iOS 命令行工具開發(fā)

類似Clutch命令行工具的開發(fā)
一励饵、命令行工具的創(chuàng)建 和 main函數(shù)的處理
  • 1.1、我們利用 Xcode創(chuàng)建一個命令行工具滑燃,取名:JKCommandLine曲横,我們利用Xcode 的iOS環(huán)境創(chuàng)建的目的是:讓Xcode 幫我們配置好各種環(huán)境,比如:簽名不瓶、一些權(quán)限 等等


    命令行項目的創(chuàng)建

    命令行項目的創(chuàng)建
  • 1.2禾嫉、刪除無用的文件

    刪除無用的文件

    提示:main 函數(shù)里面我們返回了:return 0; 就是不需要界面的意思

  • 1.3、Command + B 獲取可執(zhí)行文件


    可執(zhí)行文件
  • 1.4蚊丐、一般我們要的是發(fā)布版本的可執(zhí)行文件熙参,我們可以修改


    release環(huán)境的配置
  • 1.5、我們把可執(zhí)行文件拖到 用戶手機(jī)目錄下的 Device/usr/bin

    增加 命令行工具的可執(zhí)行權(quán)限麦备,我們李恩杰設(shè)備后可以執(zhí)行如下命令

    chmod +x /usr/bin/JKCommandLine
    

    命令行工具的使用

    JKCommandLine
    
    命令行工具的使用g
二孽椰、命令行功能分析
  • 2.1、功能分析凛篙,我們要獲取一個 app 的架構(gòu) 和 是否加殼黍匾,主要是根據(jù)頭文件的前四個字節(jié)


  • 2.2、具體的代碼實現(xiàn)

    #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 個字節(jié) (magic number, 魔數(shù)呛梆,用來標(biāo)識文件類型)
            NSData *magicData = [handle readDataOfLength:length];
      
            // 魔數(shù)锐涯,用來標(biāo)識文件類型
            uint32_t magicNumber;
            // 把 magicData 4個字節(jié)的數(shù)據(jù)放到 magicNUmber 內(nèi)存里面
            [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架構(gòu)文件\n");
             } else if (magicNumber == MH_MAGIC_64 || magicNumber == MH_CIGAM_64) {
                  printf("64bit架構(gòu)文件\n");
             } else {
                  printf("讀取失敗");
             }
      
             printf("----0x%x\n", magicNumber);
      
             // 關(guān)閉文件處理器
             [handle closeFile];
      
             // return 0:就是需要界面的意思
             return 0;
      
        }
    }
    
    • 提示:上面的代碼在讀取的時候會失敗,如下填物,這是因為缺少權(quán)限的原因纹腌,后面在 給可執(zhí)文件增加權(quán)限
三霎终、讀取用戶輸入的參數(shù)
  • 3.1、在 main 函數(shù)里面會獲取到參數(shù)

    /// main函數(shù)
    /// @param argc 參數(shù)個數(shù)
    /// @param argv 存放參數(shù)的數(shù)組
    ///  argv [0] 是當(dāng)前可執(zhí)行文件的路徑
    int main(int argc, char * argv[]) {
    
    }
    

    第一個參數(shù)是固定的升薯, argv [0] 是當(dāng)前可執(zhí)行文件的路徑莱褒;當(dāng)有參數(shù)的時候是從第二個參數(shù)開始的

  • 3.2、參數(shù)的設(shè)置
    一般來說涎劈,我們會在參數(shù)的前面會加一個 -广凸,比如:我們常用的 Clutch,查看所有的 加殼的應(yīng)用:Clutch -i

    那么我們也設(shè)置兩個參數(shù):-i-s

    #import <UIKit/UIKit.h>
    #import <mach-o/fat.h>
    #import <mach-o/loader.h>
    
    /// main函數(shù)
    /// @param argc 參數(shù)個數(shù)
    /// @param argv 存放參數(shù)的數(shù)組
    ///  argv [0] 是當(dāng)前可執(zhí)行文件的路徑
    int main(int argc, char * argv[]) {
        @autoreleasepool {
      
           if (argc == 1) {
               printf("-l 查看Macho 信息\n -s 查看Macho 信息\n");
               return 0;
           }
           // 找不到對用的參數(shù)
           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 (權(quán)限)
  • 4.1炮障、查看可執(zhí)行文件的權(quán)限,這里我們使用的 ldid坤候,當(dāng)然也可以使用 codesign胁赢,下面我們以 JKCommandLine 為例,我們導(dǎo)出 JKCommandLine 權(quán)限白筹,如下

    cd 進(jìn)入 JKCommandLine 可執(zhí)行文件的路徑
    // 導(dǎo)出 JKCommandLine 可執(zhí)行文件的權(quán)限
    ldid -e JKCommandLine > JKCommandLine.entitlements
    

    語法:導(dǎo)出權(quán)限:ldid -e 可執(zhí)行文件名字 >> 可執(zhí)行該文件的名字.entitlements智末,代表的意思是:將 可執(zhí)行文件的權(quán)限導(dǎo)入到 可執(zhí)行該文件的名字.entitlements 文件里面去

    查看可執(zhí)行文件的權(quán)限

    我們可以看到 JKCommandLine的權(quán)限很少
    • 提示:一個 > 代表覆蓋,兩個 >> 代表追加到文件的尾部
    • 權(quán)限:entitlements == plist == xml
  • 4.2徒河、我們可以看到普通的一個 可執(zhí)行文件全新啊很低系馆,那么如何增加可執(zhí)行文件的權(quán)限呢?我們可以獲取 SpringBoard 的權(quán)限顽照,然后再賦給我們的可執(zhí)行文件的權(quán)限

    • 獲取 SpringBoard 可執(zhí)行文件由蘑,在路徑:Device/System/Library/CoreServices/SpringBoard.app
    • 獲取 SpringBoard 權(quán)限

      cd 進(jìn)入 SpringBoard 可執(zhí)行文件的路徑
      // 導(dǎo)出 SpringBoard 可執(zhí)行文件的權(quán)限
      ldid -e SpringBoard > SpringBoard.entitlements 
      
      獲取 SpringBoard 權(quán)限
    • 將 SpringBoard 的權(quán)限 簽給 其他的可執(zhí)行文件,比如簽給 JKCommandLine 代兵,如下尼酿,我們把 SpringBoard.entitlements 放到 JKCommandLine目錄下

      cd 進(jìn)入 JKCommandLine 可執(zhí)行文件的路徑
      ldid -SSpringBoard.entitlements JKCommandLine
      


      語法:重新簽回權(quán)限:ldid -S可執(zhí)行該文件的名字.entitlements 可執(zhí)行該文件的名字,這里的簽名僅僅是簽權(quán)限

  • 4.3植影、測試 JKCommandLine 文件的裳擎,我們可以看到我們有了讀取其他app的權(quán)限

五、命令行工具的總結(jié)
  • 5.1思币、命令行工具的本質(zhì)
    本質(zhì):可執(zhí)行文件鹿响,跟app內(nèi)部的可執(zhí)行文件差不多

  • 5.2、測試一下其他app的可執(zhí)行文件谷饿,比如愛奇藝

六惶我、拓展: MJAppTools

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

  • 6.1、下載源碼后博投,執(zhí)行以下兩種的任意一種方式


  • 6.2绸贡、復(fù)制編譯后的生成的文件 MJAppTools 到 越獄手機(jī)的 iFunBox 的 usr/bin 目錄下

  • 6.3、復(fù)制 MJAppTools 到 越獄手機(jī)的 iFunBox 的 usr/bin 目錄下

  • 6.4、讓 MJAppTools 具有執(zhí)行的權(quán)利恃轩,終端鏈接越獄手機(jī)后,執(zhí)行 chmod +x /usr/bin/MJAppTools

  • 6.5黎做、MJAppTools 的使用


  • 6.6叉跛、JKAppTools 后面可以跟上圖的命令,如 : -l <regex> 列出用戶安裝的應(yīng)用

    JKAppTools -l
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒸殿,一起剝皮案震驚了整個濱河市筷厘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宏所,老刑警劉巖酥艳,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爬骤,居然都是意外死亡充石,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門霞玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骤铃,“玉大人,你說我怎么就攤上這事坷剧《枧溃” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵惫企,是天一觀的道長撕瞧。 經(jīng)常有香客問我,道長狞尔,這世上最難降的妖魔是什么丛版? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮偏序,結(jié)果婚禮上硼婿,老公的妹妹穿的比我還像新娘。我一直安慰自己禽车,他們只是感情好寇漫,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殉摔,像睡著了一般州胳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逸月,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天栓撞,我揣著相機(jī)與錄音,去河邊找鬼。 笑死瓤湘,一個胖子當(dāng)著我的面吹牛瓢颅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弛说,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼挽懦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了木人?” 一聲冷哼從身側(cè)響起信柿,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醒第,沒想到半個月后渔嚷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡稠曼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年形病,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霞幅。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窒朋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝗岖,到底是詐尸還是另有隱情侥猩,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布抵赢,位于F島的核電站欺劳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铅鲤。R本人自食惡果不足惜划提,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邢享。 院中可真熱鬧鹏往,春花似錦、人聲如沸骇塘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽款违。三九已至唐瀑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間插爹,已是汗流浹背哄辣。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工请梢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人力穗。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓毅弧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親当窗。 傳聞我的和親對象是個殘疾皇子够坐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353