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

這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰ios

iOS 底層原理 + 逆向 文章彙總微信

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

代碼注入

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

查看Mach-O文件ide

在瞭解注入前,咱們首先須要瞭解ipa包中的靜態庫是如何注入的,有如下兩種方式查看Mach-O可執行文件函數

  • 一、終端命令:otool -l WeChat
  • 二、MachOView 二進制文件分析工具(注:分析時可能出現沒法分析的狀況,能夠經過 CMD + o 打開)

Mach-O文件中主要看load Commands(即加載命令集),從這裏能夠看出動態庫的加載等。其中大部分格式爲:LC_LOAD_DYLIB(xxx),是在指定路徑下加載xxx,以下所示 動態庫注入方式工具

因此,綜上所述,若是須要注入代碼,是以動態庫的形式注入oop

方式1:Framework手動注入

第一步:動態庫進入App包,即Framework注入post

  • 一、建立一個Framework,命名爲 CJLHook(建立位置:target -> + -> ios -> Framework)

手動注入-01

  • 二、在CJLHook中建立inject文件,在生命週期方法load函數中寫注入代碼
+(void)load{
    NSLog(@"CJLHook ------ 注入成功");
}
複製代碼
  • 三、編譯工程(注:這裏的工程依然須要重簽名),而後查看工程的可執行文件Wechat,查找其中的Frameworks,從這裏能夠看到CJLHook,可是此時並不會執行其中的load函數

手動注入-03 load不會執行的緣由:查看此時的Mach-O文件中的Load Commands,並無發現CJLHook,因此此時是不會執行其中的load函數的ui

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

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

手動注入-04 - 第一個參數:目標可執行文件

- 第二個參數:CJLHook的路徑
複製代碼
  • 五、查看Mach-O可執行文件,能夠看到已經加進來了

手動注入-05

  • 六、從新打包,過程以下:

    • 解壓微信-7.0.8.ipa

    • 替換Payload中的可執行文件爲上一步的Mach-O文件

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

    • 而後替換ipa包

  • 七、運行程序,能夠看到成功執行了 CJLHook中的load

手動注入-07

方式2:dylib注入

準備工做:建立一個空工程,並進行WeChat的重簽名,能夠參考這篇文章iOS逆向 10:應用重簽名(下)

dylib注入

  • 一、選擇target -> + -> mac os -> Library,命名爲CJLHook

dylib注入-01

  • 二、在Build Setting中配置CJLHook
    • 1)Base SDK 改成 ios

    • 2)Code Signing identify 改成 iOS Developer

  • 三、當前工程中拷貝lib

dylib注入-03 - 1)、Build Phase -> + -> New Copy File... - 2)、而後選擇拷貝到的目標文件:Frameworks - 3)、添加dylib

  • 四、在CJLHook.m文件中重寫load函數
#import "CJLHook.h"

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

dylib注入-06

  • 七、運行程序,從日誌能夠看出執行了CJLHook中的load

dylib注入-07

總結

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

  • Framwork手動注入流程:

    • 一、經過Xcode新建Framwork,將庫安裝進入APP包

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

    • 三、全部的Framwork加載都是由DYLD加載進入內存被執行的

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

  • Dylib注入流程:

    • 一、經過Xcode新建Dylib庫(注意:Dylib屬於MacOS因此須要修改相關屬性配置)

    • 二、添加Target依賴,讓Xcode將自定義Dylib文件打包進入APP包。

    • 三、利用yololib進行注入。

相關文章
相關標籤/搜索