iOS逆向工程(2)逆向工具介紹

繼續(xù)上一篇文章的內(nèi)容,工具介紹篇:


目錄

  • Theos
  • class-dump

一剑刑、Theos越獄開發(fā)工具包

簡介
Theos:是一個(gè)越獄開發(fā)工具包,由iOS越獄界知名人士Dustin Howett(@DHowett)開發(fā)并分享到 GitHub 上媳纬。

iOSOpenDev:是整合在 Xcode里的越獄開發(fā)工具, 熟悉Xcode 的朋友可能會(huì)對它更感興趣。但逆向工程接觸底層知識較多,很多東西無法自動(dòng)化,因此推薦使用整合度并不算高的 Theos,當(dāng)你手動(dòng)完成一個(gè)又一個(gè)練習(xí)時(shí),對逆向工程的理解一定會(huì)更深施掏。

(1) Theos的安裝:
1钮惠,設(shè)置xcode
假設(shè)安裝了3 個(gè) Xcode,并將它們分別命名為 Xcode1.app、Xcode2.app 和 Xcode3.app, 要指定 Xcode3 為活動(dòng) Xcode,則運(yùn)行如下命令 :

sudo xcode-select -s /Applications/Xcode3.app/Contents/Developer

2七芭, Theos下載
從 GitHub 上下載Theos, 操作如下:(在終端中執(zhí)行)

export THEOS=/opt/theos 
sudo git clone --recursive https://github.com/theos/theos.git $THEOS

小問題:git 克隆下來的theos素挽,make packget install 如果提示提示缺少 _Prefix/NullabilityCompat.h 等文件,需要我們?nèi)?a target="_blank">https://github.com/theos/headers 把這個(gè)頭文件放到/opt/theos/include目錄中就行了狸驳。(可直接克隆到目錄中去)

sudo git clone https://github.com/theos/headers /opt/theos/include/

3预明,配置ldid
ldid 是專門用來 名 iOS 可執(zhí)行文件的工具,用以在越獄 iOS 中代替Xcode 自帶的codesign。

  • 第一種方法:
    brew install ldid

  • 第二種方法:
    http://joedj.net/ldid 下 ldid,把它放在“ /opt/theos/bin/ ”下,然后用以下命令賦予它可執(zhí)行權(quán)限:

sudo chmod 777 /opt/theos/bin/ldid

4耙箍,dpkg-deb
deb 是越獄開發(fā)安裝包的標(biāo)準(zhǔn)格式,dpkg-deb 是一個(gè)用于操作 deb 文件的工具,有了這個(gè)工具,Theos 才能正確地把工程打包成為 deb 文件撰糠。
https://raw.githubusercontent.com/DHowett/dm.pl/master/dm.pldm.pl,將其重命名為 dpkg-deb 后,放到“/opt/theos/bin/”目錄下,然后用以下命令賦予其可執(zhí)行權(quán)限:

sudo chmod 777 /opt/theos/bin/dpkg-deb

Theos操作這些移動(dòng)文件設(shè)置權(quán)限這些步驟很啰嗦。
鑒于這些究西,我自己這邊已經(jīng)封裝了一個(gè)集成好的Theos窗慎,附帶一個(gè)自動(dòng)下載的小腳本TheosScript.sh,不需要手動(dòng)添加ldid、libsubstrate卤材、dpkg-deb等遮斥。
腳本下載地址:https://github.com/bigsen/Theos-Script

進(jìn)行簡單演示:


進(jìn)行簡單演示

(2) Theos的用法介紹:
1,更改工作目錄
更改工作目錄至常用的 iOS 工程目錄(如 “ /Users/zhangdasen/Code/”)
注:為何要做這一步呢扇丛,因?yàn)槭褂肨heos創(chuàng)建的工程术吗,是你在哪個(gè)目錄執(zhí)行的nic.pl啟動(dòng)的,就會(huì)在創(chuàng)建完成后在這個(gè)目錄生成創(chuàng)建的Theos項(xiàng)目帆精。

2较屿,創(chuàng)建工程
終端輸入“/opt/theos/bin/nic.pl”,啟動(dòng) NIC(New Instance Creator),下面進(jìn)行簡單演示:


3卓练,簡單說明
上面創(chuàng)建工程輸入了一大堆東西隘蝎,下面用一張圖來說明:


4,工程文件說明
創(chuàng)建好工程就會(huì)生成四個(gè)文件:
Makefile襟企、Tweak.xm嘱么、control、iOSREProject.plist 下面進(jìn)行簡單說明顽悼。

(1) Makefile
Makefile 文件指定工程用到的文件曼振、框架几迄、庫等信息,將整個(gè)過程自動(dòng)化,下圖為里面內(nèi)容說明冰评。
下圖是我自己修改過后的Makefile文件映胁。


補(bǔ)充:
1,導(dǎo)入 private framework

 iOSREProject_PRIVATE_FRAMEWORKS = private framework name

2甲雅,鏈接 Mach-O 對象(Mach-O object)

 iOSREProject_LDFLAGS = -lz –lsqlite3.0 –dylib1.o

(2) Tweak.xm
用 Theos 創(chuàng)建 tweak 工程, 認(rèn)生成的源文件是 Tweak.xm解孙。
如果后綴名是單獨(dú)一個(gè)“ x”,說明源文件支持 Logos 和 C 語法;
如果后綴名是“ xm ”,說明源文件支持 Logos 和 C/C++ 語法,與“ m ”和“ mm ”的區(qū)別類似。
Tweak.xm 語法眾多抛人,在這里簡單介紹一些妆距,詳細(xì)語法大家可以去看書籍。
● %hook
指定需要 hook 的 class, 必須以 %end 結(jié)尾

%hook SpringBoard 
- (void)_menuButtonDown:(id)down {
     NSLog(@"You've pressed home button.");
     %orig; // call the original _menuButtonDown: 
}
%end

● %orig該指 在 %hook 內(nèi)部使用,執(zhí)行被 (hook)的 數(shù)的原始代碼,如下:

 %hook SpringBoard 
- (void)_menuButtonDown:(id)down {
       NSLog(@"You've pressed home button.");
       %orig; // call the original _menuButtonDown: }
%end

還可以利用 %orig 更改原始 數(shù)的參數(shù),例如:

 %hook SBLockScreenDateViewController 
- (void)setCustomSubtitleText:(id)arg1 withColor:(id)arg2 {
         %orig(@"iOS 8 App Reverse Engineering", arg2); }
%end
這樣一來, 鎖屏界面原本顯示日期的地方就變成了如圖的樣子函匕。

● %group
該指 用于將 %hook 分組,便于代碼管理及按條件初始化分組(含義 后有 細(xì)解 ),必須以 %end 結(jié) ;一個(gè) %group可以包含多個(gè) %hook,所有不 于某個(gè)自定義 group 的 %hook會(huì)被隱式歸類到 %group _ungrouped 中。
用法:

%group iOS7Hook
%hook iOS7Class 
- (id)iOS7Method {
     id result = %orig; 
     NSLog(@"This class & method only exist in iOS 7."); 
     return result;
 } %end 
%end // iOS7Hook

%group iOS8Hook 
%hook iOS8Class 
- (id)iOS8Method {
   id result = %orig; 
   NSLog(@"This class & method only exist in iOS 8."); return result;
 }
%end
%end // iOS8Hook

● %init
該指令用于初始化某個(gè) %group,必須在 %hook 或 %ctor 內(nèi)調(diào)用;如果帶參數(shù),則初始化指定的 group,如果不帶參數(shù),則初始化 _ungrouped,如下:

#ifndef kCFCoreFoundationVersionNumber_iOS_8_0 
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.10 #endif
%hook SpringBoard 
- (void)applicationDidFinishLaunching:(id)application {
 %orig; 
%init; // Equals to %init(_ungrouped)
 if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0 && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_8_0)
      %init(iOS7Hook);
 if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0)
      %init(iOS8Hook);
}%end
只有調(diào)用了 %init,對應(yīng)的 %group 才能起作用,切 切 !

● %new
在 %hook 內(nèi)部使用,給一個(gè)現(xiàn)有 class 加新函數(shù),功能與 class_addMethod 相同蚪黑。它的用法如下:

%hook SpringBoard %new 
- (void)namespaceNewMethod {
     NSLog(@"We've added a new method to SpringBoard."); 
}
%end

● %ctor
tweak的constructor,完成初始化工作;如果不顯式定義,Theos會(huì)自動(dòng)生成一個(gè)%ctor,并在其中調(diào)用 %init(_ungrouped)盅惜。因此,
%hook SpringBoard - (void)reboot {
NSLog(@"If rebooting doesn't work then I'm screwed.");
%orig;
}
%end
可以成功生效,因?yàn)?Theos 隱式定義了如下內(nèi)容:%ctor

{
    %init(_ungrouped);
}

%hook SpringBoard
- (void)reboot{
     NSLog(@"If rebooting doesn't work then I'm screwed.");
    %orig;
}
%end

里的 %hook無法生效,因?yàn)檫@里顯式定義了%ctor,卻沒有顯式調(diào)用 %init,
%group(_ungrouped) 不起作用。
%ctor 一般可以用來初始化 %group,以及進(jìn)行 MSHookFunction 等操作,如下:

#ifndef kCFCoreFoundationVersionNumber_iOS_8_0 
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.10 #endif
%ctor{
%init;
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0 && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_8_0)
   %init(iOS7Hook);
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0) 
   %init(iOS8Hook);
MSHookFunction((void *)&AudioServicesPlaySystemSound, (void *)&replaced_AudioServicesPlaySystemSound, (void **)&original_AudioServicesPlaySystemSound);
}

注意,%ctor 不需要以 %end 結(jié) 忌穿。

● %c
該指 的作用等同于 objc_getClass 或 NSClassFromString,即動(dòng)態(tài)獲 一個(gè)類的定義,在 %hook 或 %ctor 內(nèi)使用抒寂。

(3) control文件
control文件 錄了deb包管理系統(tǒng)所需的基本信息,會(huì)被打包進(jìn)deb包里。
iOSREProject 里 control 文件的內(nèi)容如下:


control 文件中可以自定義的字段還有很多,但上面這些信息就已經(jīng)足夠了掠剑。更全面的
說明可以參閱 debian 的官方網(wǎng)站(http://www.debian.org/doc/debian-policy/ch-controlfields.html)

(3)iOSREProject.plist文件
簡單來說就是里面描述了tweak 的作用范圍屈芜,也就是需要作用的APP的bundle identifier。
也就是在創(chuàng)建項(xiàng)目的時(shí)候填寫的這個(gè)地方:

二朴译、class-dump

簡介:顧名思義井佑,就是用來導(dǎo)出目標(biāo)對象的class信息的工具,私有方法聲明也能導(dǎo)出來。

原理:利用 Objective-C語言的 runtime 特性,將存 在Mach-O 文件中的頭文件信息提 出來,并生成對應(yīng)的 .h 文件眠寿。

使用方法:
1躬翁,下載然后將class-dump 復(fù)制到“ /usr/bin”目錄下。
2盯拱,執(zhí)行sudo chmod 777 /usr/bin/class-dump”命令賦予其執(zhí)行權(quán)限盒发。
3,class-dump執(zhí)行:

class-dump -S -s -H /Applications/Calculator.app -o 
/Users/zhangdasen/Desktop/test

4狡逢,上面一段代碼就是導(dǎo)出Mac下計(jì)算器app的頭文件宁舰,到桌面test文件夾,并且排序奢浑,class-dump的一些參數(shù)蛮艰,大家可以自己在命令行輸入class-dump然后回車就有相關(guān)說明。

使用注意
從 AppStore 下 的 App 都是經(jīng)過加密的,可執(zhí)行文件被加上了一層"殼"殷费。
class-dump 應(yīng)付不了這樣的文件印荔,此時(shí)使用 class-dump 看上去會(huì)“失效”低葫。還得先用別的工具把殼砸開才行,這個(gè)后面會(huì)說到仍律。

class-dump下載地址:http://stevenygard.com/projects/class-dump


待續(xù)嘿悬。。水泉。善涨。。草则。


下個(gè)文章繼續(xù)更新內(nèi)容 ---- 手動(dòng)HOOK一個(gè)自己的APP钢拧,和剩余越獄開發(fā)工具簡單介紹。

iOS逆向知識炕横,千變?nèi)f化源内,無窮無盡,需要學(xué)習(xí)的太多了份殿,國內(nèi)文章知識還是比較少膜钓,逆向的書籍也是比較少,逆向開發(fā)方面的進(jìn)步也需要我們國人也要努力卿嘲。

參考書籍: <iOS應(yīng)用逆向工程-第2版> 沙梓社 吳航 * 著
感謝作者颂斜。

下一篇:iOS逆向工程(3)手動(dòng)HOOK自己編寫的APP

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拾枣,隨后出現(xiàn)的幾起案子沃疮,更是在濱河造成了極大的恐慌,老刑警劉巖梅肤,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件司蔬,死亡現(xiàn)場離奇詭異,居然都是意外死亡姨蝴,警方通過查閱死者的電腦和手機(jī)葱她,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似扔,“玉大人吨些,你說我怎么就攤上這事〕椿裕” “怎么了豪墅?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黔寇。 經(jīng)常有香客問我偶器,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任屏轰,我火速辦了婚禮颊郎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霎苗。我一直安慰自己姆吭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布唁盏。 她就那樣靜靜地躺著内狸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厘擂。 梳的紋絲不亂的頭發(fā)上昆淡,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音刽严,去河邊找鬼昂灵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舞萄,可吹牛的內(nèi)容都是我干的倔既。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鹏氧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佩谣?” 一聲冷哼從身側(cè)響起把还,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茸俭,沒想到半個(gè)月后吊履,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡调鬓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年艇炎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾窝。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缀踪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虹脯,到底是詐尸還是另有隱情驴娃,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布循集,位于F島的核電站唇敞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疆柔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一咒精、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旷档,春花似錦模叙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谐区,卻和暖如春湖蜕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宋列。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工昭抒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炼杖。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓灭返,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坤邪。 傳聞我的和親對象是個(gè)殘疾皇子熙含,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容