一励饵、命令行工具的創(chuàng)建 和 main函數(shù)的處理
-
1.1、我們利用 Xcode創(chuàng)建一個命令行工具滑燃,取名:JKCommandLine曲横,我們利用Xcode 的iOS環(huán)境創(chuàng)建的目的是:讓Xcode 幫我們配置好各種環(huán)境,比如:簽名不瓶、一些權(quán)限 等等
-
1.2禾嫉、刪除無用的文件
提示:main 函數(shù)里面我們返回了:return 0;
就是不需要界面的意思 -
1.3、Command + B 獲取可執(zhí)行文件
-
1.4蚊丐、一般我們要的是發(fā)布版本的可執(zhí)行文件熙参,我們可以修改
-
1.5、我們把可執(zhí)行文件拖到 用戶手機(jī)目錄下的
Device/usr/bin
增加 命令行工具的可執(zhí)行權(quán)限麦备,我們李恩杰設(shè)備后可以執(zhí)行如下命令
chmod +x /usr/bin/JKCommandLine
命令行工具的使用
JKCommandLine
二孽椰、命令行功能分析
-
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)限
- 提示:上面的代碼在讀取的時候會失敗,如下填物,這是因為缺少權(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 文件里面去
- 提示:一個
>
代表覆蓋,兩個>>
代表追加到文件的尾部 - 權(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)限 簽給 其他的可執(zhí)行文件,比如簽給 JKCommandLine 代兵,如下尼酿,我們把
SpringBoard.entitlements
放到 JKCommandLine目錄下cd 進(jìn)入 JKCommandLine 可執(zhí)行文件的路徑 ldid -SSpringBoard.entitlements JKCommandLine
語法:重新簽回權(quán)限:ldid -S可執(zhí)行該文件的名字.entitlements 可執(zhí)行該文件的名字
,這里的簽名僅僅是簽權(quán)限
- 獲取 SpringBoard 可執(zhí)行文件由蘑,在路徑:
-
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