iOS逆向?qū)W習(xí)筆記 - 代碼注入

代碼注入過程

1座舍、新建一個(gè)工程笛臣;
2孤澎、將微信Payload文件夾放入新建的工程中的APP文件夾里面暇唾;

$zip -ry WeChat.ipa Payload

3、在Build Phases里面添加New Run Script phase剿骨,將自動(dòng)化腳本路徑添加進(jìn)去代芜;


1373790-4fb87d482fbc5747.png

4、給自動(dòng)化腳本權(quán)限浓利;

$chmod +x XcodeApp.sh

5挤庇、編譯下工程,能正常通過贷掖;

6嫡秕、在工程中添加一個(gè)target framework并添加一個(gè)ColinHook類;

@implementation ColinHook

+ (void)load {
    NSLog(@"????????????????????????????????????????????????????????");
}

@end

7苹威、將工程target和framework target關(guān)聯(lián)昆咽;

1373790-8ef43855f9bdbc09.png

這時(shí)編譯運(yùn)行是沒問題的,但是沒有不會(huì)打印我們寫的代碼的牙甫。

8掷酗、將注入的framework庫添加到MachO文件里面;

這時(shí)需要用到一個(gè)工具yololib窟哺,并將它放到Mac電腦的/usr/local/bin里面泻轰。

1373790-892f31bef64c1d82.png
$yololib WeChat Frameworks/colinHookFrameWork.framework/colinHookFrameWork

9、用MachOView工具查看WeChat的MachO文件且轨,查看加入的framework路徑浮声;

1373790-85a700eeaac2968c.png

10、將第9步的WeChat的MachO文件放到工程根目錄的APP文件夾/Payload/WeChat.app里面旋奢,執(zhí)行第2步阿蝶,并編譯運(yùn)行工程,到此代碼就注入成功了黄绩;

1373790-cd3791d587ee5c79.png

Dylib庫注入過程

1、新建一個(gè)工程玷过;
2爽丹、將微信Payload文件夾放入新建的工程中的APP文件夾里面筑煮;

$zip -ry WeChat.ipa Payload

3、在Build Phases里面添加New Run Script phase粤蝎,將自動(dòng)化腳本路徑添加進(jìn)去真仲;

1373790-a322202306c0220a.png

4、添加Dylib庫

1373790-190466a2c193f479.png

a初澎、這個(gè)是在Mac里面使用的動(dòng)態(tài)庫

1373790-99177d2735b5c902.png

b秸应、證書也是Mac Developer證書

1373790-88685024aaf3068f.png

c、在Debug模式下Build后碑宴,Dylib動(dòng)態(tài)庫的路徑和App包放的路徑不一樣

1373790-3fc820932b33c3df.png

5软啼、新建的工程和Dylib庫進(jìn)行關(guān)聯(lián)

關(guān)聯(lián)的意義就是為了后續(xù)在工程Build的時(shí)候?qū)ylib庫添加到app里面去。

1373790-9b6ce7e680d20ebd.png

6延柠、修改Build Setting -> Per-configuration Intermediate Build Files Path

1373790-c6a691906623bc9c.png

7祸挪、修改Dylib庫的架構(gòu)配置(Base SDK改成iOS配置即可)

1373790-61ca079b719b555a.png
1373790-fdec4262c8157474.png

8、將Dylib注入到MachO文件

# 7\. 注入我們編寫的動(dòng)態(tài)庫
echo "開始注入"
# 需要注入的動(dòng)態(tài)庫的路徑  這個(gè)路徑我就寫死了!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libColinHook.dylib"
#
## 通過工具實(shí)現(xiàn)注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"

1373790-842f0a6142571012.png

9贞间、在Dylib中寫注入代碼贿条,并編譯運(yùn)行

[圖片上傳中...(1373790-69cc9df55b22e128.png-6787b2-152645511906

Method Swizzle

MethodSwizzleManager.h

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface MethodSwizzleManager : NSObject

+(void)HookClass:(Class)class withOldMethod:(SEL)oldMethod withNewMethod:(SEL)newMethod;

@end

MethodSwizzleManager.m

#import "MethodSwizzleManager.h"

@implementation MethodSwizzleManager

+(void)HookClass:(Class)class withOldMethod:(SEL)oldMethod withNewMethod:(SEL)newMethod {

    Method old = class_getInstanceMethod(class, oldMethod);
    Method new = class_getInstanceMethod(class, newMethod);

    method_exchangeImplementations(old, new);
}

@end

Hook自己工程中交換實(shí)例方法和類方法的實(shí)現(xiàn)

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //交換實(shí)例方法實(shí)現(xiàn)
//    [MethodSwizzleManager HookClass:self.class withOldMethod:@selector(oldMethod) withNewMethod:@selector(newMethod)];

    //交互類方法實(shí)現(xiàn)
    [MethodSwizzleManager HookClass:object_getClass(self.class) withOldMethod:@selector(oldClassMethod) withNewMethod:@selector(newClassMethod)];
}

+ (void)newClassMethod {
    NSLog(@"newClassMethod被調(diào)用");
}

+ (void)oldClassMethod {
    NSLog(@"oldClassMethod被調(diào)用");
}

- (void)newMethod {
    NSLog(@"newMethod被調(diào)用");
}

- (void)oldMethod {
    NSLog(@"oldMethod被調(diào)用");
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    [self oldMethod];
    [ViewController oldClassMethod];
}

Hook微信的注冊(cè)方法

1、使用注入Framework庫的工程來做這份案例

2增热、修改shell腳本整以,將Framework庫添加到MachO文件

# ---------------------------------------------------
# 7\. 注入我們編寫的動(dòng)態(tài)庫
echo "開始注入"
# 需要注入的動(dòng)態(tài)庫的路徑  這個(gè)路徑我就寫死了!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/colinHookFrameWork.framework/colinHookFrameWork"
#INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libColinHook.dylib"
#
## 通過工具實(shí)現(xiàn)注入
# yololib MachO名稱
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"

3、運(yùn)行工程峻仇,查看微信注冊(cè)按鈕

Target <WCAccountLoginControlLogic: 0x104de6930>
Action onFirstViewRegester

4公黑、將微信的頭文件導(dǎo)出,查看WCAccountLoginControlLogic類

class-dump -H WeChat -o /Users/yaoqi/Desktop/Headers

將Headers文件夾拖到Sublime Text工具础浮,使用快捷鍵Cmd+Shift+F查找WCAccountLoginControlLogic帆调,雙擊進(jìn)入WCAccountLoginControlLogic.h文件

5、運(yùn)行工程豆同,Hook微信注冊(cè)方法

自動(dòng)化Shell注入腳本


# ${SRCROOT} 為工程文件所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資源文件夾,放三方APP的
ASSETS_PATH="${SRCROOT}/APP"
#ipa包路徑
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"

#新建Temp文件夾
rm -rf "$TEMP_PATH"
mkdir -p "$TEMP_PATH"

# --------------------------------------
# 1\. 解壓IPA 到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解壓的臨時(shí)APP的路徑
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# 這里顯示打印一下 TEMP_APP_PATH變量
echo "TEMP_APP_PATH: $TEMP_APP_PATH"

# -------------------------------------
# 2\. 把解壓出來的.app拷貝進(jìn)去
#BUILT_PRODUCTS_DIR 工程生成的APP包路徑
#TARGET_NAME target名稱
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "TARGET_APP_PATH: $TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH/"

# -------------------------------------
# 3\. 為了是重簽過程簡化番刊,移走extension和watchAPP. 此外個(gè)人免費(fèi)的證書沒辦法簽extension

echo "Removing AppExtensions"
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"

# -------------------------------------
# 4\. 更新 Info.plist 里的BundleId
#  設(shè)置 "Set :KEY Value" "目標(biāo)文件路徑.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

# 5.給可執(zhí)行文件上權(quán)限
#添加ipa二進(jìn)制的執(zhí)行權(quán)限,否則xcode會(huì)告知無法運(yùn)行
#這個(gè)操作是要找到第三方app包里的可執(zhí)行文件名稱,因?yàn)閕nfo.plist的 'Executable file' key對(duì)應(yīng)的是可執(zhí)行文件的名稱
#我們grep 一下,然后取最后一行, 然后以cut 命令分割影锈,取出想要的關(guān)鍵信息芹务。存到APP_BINARY變量里
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`

#這個(gè)為二進(jìn)制文件加上可執(zhí)行權(quán)限 +X
chmod +x "$TARGET_APP_PATH/$APP_BINARY"

# -------------------------------------
# 6\. 重簽第三方app Frameworks下已存在的動(dòng)態(tài)庫
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
#遍歷出所有動(dòng)態(tài)庫的路徑
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
echo "????????????FRAMEWORK : $FRAMEWORK"
#簽名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi

# ---------------------------------------------------
# 7\. 注入我們編寫的動(dòng)態(tài)庫
echo "開始注入"
# 需要注入的動(dòng)態(tài)庫的路徑  這個(gè)路徑我就寫死了!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/colinHookFrameWork.framework/colinHookFrameWork"
#INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libColinHook.dylib"
#
## 通過工具實(shí)現(xiàn)注入
# yololib MachO名稱
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"

總結(jié)

  • 利用動(dòng)態(tài)庫注入(Framework庫、Dylib庫)
  • 注入進(jìn)APP(工程和動(dòng)態(tài)庫有關(guān)聯(lián)關(guān)系)
  • 修改MachO文件的Load Commands
  • 在注入的動(dòng)態(tài)庫中鸭廷,寫上自己想要注入的代碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枣抱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辆床,更是在濱河造成了極大的恐慌佳晶,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讼载,死亡現(xiàn)場離奇詭異轿秧,居然都是意外死亡中跌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門菇篡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漩符,“玉大人,你說我怎么就攤上這事驱还∈缺” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵议蟆,是天一觀的道長闷沥。 經(jīng)常有香客問我,道長咪鲜,這世上最難降的妖魔是什么狐赡? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮疟丙,結(jié)果婚禮上颖侄,老公的妹妹穿的比我還像新娘。我一直安慰自己享郊,他們只是感情好览祖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炊琉,像睡著了一般展蒂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苔咪,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天锰悼,我揣著相機(jī)與錄音,去河邊找鬼团赏。 笑死箕般,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舔清。 我是一名探鬼主播丝里,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼体谒!你這毒婦竟也來了杯聚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抒痒,失蹤者是張志新(化名)和其女友劉穎幌绍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傀广,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年痢虹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主儡。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惨缆,靈堂內(nèi)的尸體忽然破棺而出糜值,到底是詐尸還是另有隱情,我是刑警寧澤坯墨,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布寂汇,位于F島的核電站,受9級(jí)特大地震影響捣染,放射性物質(zhì)發(fā)生泄漏骄瓣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一耍攘、第九天 我趴在偏房一處隱蔽的房頂上張望榕栏。 院中可真熱鬧,春花似錦蕾各、人聲如沸扒磁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妨托。三九已至,卻和暖如春吝羞,著一層夾襖步出監(jiān)牢的瞬間兰伤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工钧排, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敦腔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓卖氨,卻偏偏與公主長得像会烙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筒捺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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