iOS逆向 11:代碼注入(上)

iOS 底層原理 + 逆向 文章匯總

本文主要講解代碼注入的兩種方式:FrameWork注入、dylib注入

代碼注入

一般修改原始的程序,是利用代碼注入的方式,注入代碼就會選擇利用FrameWork或者Dylib等三方庫的方式注入。

查看Mach-O文件

在了解注入前,我們首先需要了解ipa包中的靜態(tài)庫是如何注入的,有以下兩種方式查看Mach-O可執(zhí)行文件

  • 1、終端命令:otool -l WeChat
  • 2、MachOView 二進(jìn)制文件分析工具(注:分析時可能出現(xiàn)無法分析的情況,可以通過 CMD + o 打開)

Mach-O文件中主要看load Commands(即加載命令集),從這里可以看出動態(tài)庫的加載等。其中大部分格式為:LC_LOAD_DYLIB(xxx),是在指定路徑下加載xxx,如下所示

動態(tài)庫注入方式

所以,綜上所述,如果需要注入代碼,是以動態(tài)庫的形式注入

方式1:Framework手動注入

第一步:動態(tài)庫進(jìn)入App包,即Framework注入

  • 1、創(chuàng)建一個Framework,命名為 CJLHook(創(chuàng)建位置:target -> + -> ios -> Framework)

    手動注入-01

  • 2、在CJLHook中創(chuàng)建inject文件,在生命周期方法load函數(shù)中寫注入代碼

+(void)load{
    NSLog(@"CJLHook ------ 注入成功");
}
  • 3、編譯工程(注:這里的工程依然需要重簽名),然后查看工程的可執(zhí)行文件Wechat,查找其中的Frameworks,從這里可以看到CJLHook,但是此時并不會執(zhí)行其中的load函數(shù)
    手動注入-03

    load不會執(zhí)行的原因:查看此時的Mach-O文件中的Load Commands,并沒有發(fā)現(xiàn)CJLHook,所以此時是不會執(zhí)行其中的load函數(shù)的

第二步:yololib手動注入,修改Mach-O字段

  • 4、通過yololib工具修改Mach-O字段:./yololib WeChat Frameworks/CJLHook.framework/CJLHook(注:需要將WeChat可執(zhí)行文件拷貝過來)

    手動注入-04

    • 第一個參數(shù):目標(biāo)可執(zhí)行文件

    • 第二個參數(shù):CJLHook的路徑

  • 5、查看Mach-O可執(zhí)行文件,可以看到已經(jīng)加進(jìn)來了


    手動注入-05
  • 6、重新打包,過程如下:

    • 解壓微信-7.0.8.ipa

    • 替換Payload中的可執(zhí)行文件為上一步的Mach-O文件

    • 重新打包:zip -ry WeChat.ipa Payload/

    • 然后替換ipa包

  • 7、運(yùn)行程序,可以看到成功執(zhí)行了 CJLHook中的load


    手動注入-07

方式2:dylib注入

準(zhǔn)備工作:創(chuàng)建一個空工程,并進(jìn)行WeChat的重簽名,可以參考這篇文章iOS逆向 10:應(yīng)用重簽名(下)

dylib注入

  • 1、選擇target -> + -> mac os -> Library,命名為CJLHook

    dylib注入-01

  • 2、在Build Setting中配置CJLHook

    • 1)Base SDK 改為 ios

    • 2)Code Signing identify 改為 iOS Developer

  • 3、當(dāng)前工程中拷貝lib


    dylib注入-03
    • 1)、Build Phase -> + -> New Copy File...
    • 2)、然后選擇拷貝到的目標(biāo)文件:Frameworks
    • 3)、添加dylib
  • 4、在CJLHook.m文件中重寫load函數(shù)

#import "CJLHook.h"

@implementation CJLHook
+(void)load{
    NSLog(@"CJLHook ---- 注入成功");
}
@end
  • 5、腳本注入dylib,將yololib拷貝至根目錄,在appSign.sh末尾添加以下命令
#注入
./yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libCJLHook.dylib"
  • 6、編譯工程,查看Mach-O文件中的Frameworks文件,已經(jīng)包含了CJLHook的dylib


    dylib注入-06
  • 7、運(yùn)行程序,從日志可以看出執(zhí)行了CJLHook中的load


    dylib注入-07

總結(jié)

  • 代碼注入:一般會選擇利用FrameWork或者Dylib等三方庫的方式注入

  • Framwork手動注入流程:

    • 1、通過Xcode新建Framwork,將庫安裝進(jìn)入APP包

    • 2、通過yololib注入Framwork庫路徑。命令:$yololib(空格)MachO文件路徑(空格)庫路徑

    • 3、所有的Framwork加載都是由DYLD加載進(jìn)入內(nèi)存被執(zhí)行的

    • 4、注入成功的庫路徑會寫入到MachO文件的LC_LOAD_DYLIB字段中

  • Dylib注入流程:

    • 1、通過Xcode新建Dylib庫(注意:Dylib屬于MacOS所以需要修改相關(guān)屬性配置)

    • 2、添加Target依賴,讓Xcode將自定義Dylib文件打包進(jìn)入APP包。

    • 3、利用yololib進(jìn)行注入。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容