1. 程式人生 > >(九)將iOS應用注入dylib和hook後,重新簽名並打包

(九)將iOS應用注入dylib和hook後,重新簽名並打包

iOS攻防 - (九)將iOS應用hook和注入dylib後,重新簽名並打包

1.下載微信,並解密WeChat.ipa

2.檢視解密後的微信的基本資訊

通過cd命令到解密後微信的目錄,名稱com.tencent.xin-iOS7.0-(Clutch-2.0.4)是利用Clutch解密後生成的ipa,並解壓壓縮包的目錄

$ cd com.tencent.xin-iOS7.0-(Clutch-2.0.4)/Payload/WeChat.app/

$ file WeChat

得到微信編譯使用的架構:

WeChat: Mach-O universal binary with 2 architectures: [arm_v7: Mach-O executable arm_v7] [arm64]
WeChat (for architecture armv7): Mach-O executable arm_v7
WeChat (for architecture arm64): Mach-O 64-bit executable arm64

然後檢視微信是否解密成功,利用otool工具,安裝過xcode就表明已經安裝過otool

$ otool -l WeChat | grep crypt

得到如下資訊,cryptid 等於1表示加密,0表示解密

cryptoff 16384
cryptsize 52756480
cryptid 0
cryptoff 16384
cryptsize 56770560
cryptid 0

3.安裝iOSOpenDev

3.1 先安裝MacPorts,選擇你的MacBook相應的版本安裝
3.2 重啟啟動終端,輸入如下,也就是更新MacPorts

sudo port -v selfupdate

3.3 安裝DPKG,安裝過程中有一個提示,輸入Y即可

sudo port -f install dpkg

3.6 去瀏覽器開啟以下地址,下載必須要用的openssl和Specifications

解壓後,把Specifications目錄下的,

3.6.1 iPhone.Simulator開頭的四個檔案拷貝到/Applications/Xcode/Content/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications 如果Specifications目錄不存在,則建立一個

3.6.2 將iPhoneOS開頭的四個檔案拷貝到/Applications/Xcode/Content/Developer/Platforms/IphoneOS.platform/Developer/Library/Xcode/Specifications 如果Specifications目錄不存在,則建立一個

這裡寫圖片描述

4.建立hook工程專案

4.1 建立一個Xcode工程,選擇iOSOpenDev模板裡的CaptainHook Tweak,給專案命名為hook
這裡寫圖片描述



4.2 替換hook.mm檔案的內容如下:

attribute((constructor)) static void entry() {
NSLog(@”hello, world!”);
}

這裡寫圖片描述



4.3 Edit Scheme = Debug, 然後編譯專案command + B,在專案的目錄LatestBuild下找到hook.dylib, 並把hook.dylib拷貝到WeChat.app/目錄下



4.4 下載yololib , 編譯後,把yololib可執行檔案拷貝到com.tencent.xin-iOS7.0-\(Clutch-2.0.4\) 同級目錄,並執行如下命令,其實意思就是向WeChat可執行檔案裡注入hook.dylib庫

./yololib com.tencent.xin-iOS7.0-(Clutch-2.0.4)/Payload/WeChat.app/WeChat hook.dylib

會輸出如下所示

[email protected]:~/Desktop/apps/WeChat$ ./yololib com.tencent.xin-iOS7.0-\(Clutch-2.0.4\)/Payload/WeChat.app/WeChat hook.dylib 
2017-05-28 13:13:22.001 yololib[1079:122842] dylib path @executable_path/hook.dylib
2017-05-28 13:13:22.002 yololib[1079:122842] dylib path @executable_path/hook.dylib
Reading binary: com.tencent.xin-iOS7.0-(Clutch-2.0.4)/Payload/WeChat.app/WeChat

2017-05-28 13:13:22.003 yololib[1079:122842] FAT binary!
2017-05-28 13:13:22.003 yololib[1079:122842] Injecting to arch 9
2017-05-28 13:13:22.003 yololib[1079:122842] Patching mach_header..
2017-05-28 13:13:22.003 yololib[1079:122842] Attaching dylib..

2017-05-28 13:13:22.003 yololib[1079:122842] Injecting to arch 0
2017-05-28 13:13:22.003 yololib[1079:122842] 64bit arch wow
2017-05-28 13:13:22.003 yololib[1079:122842] dylib size wow 56
2017-05-28 13:13:22.003 yololib[1079:122842] mach.ncmds 77
2017-05-28 13:13:22.003 yololib[1079:122842] mach.ncmds 78
2017-05-28 13:13:22.003 yololib[1079:122842] Patching mach_header..
2017-05-28 13:13:22.004 yololib[1079:122842] Attaching dylib..

2017-05-28 13:13:22.004 yololib[1079:122842] size 51
2017-05-28 13:13:22.004 yololib[1079:122842] complete!



4.5 拷貝hook.dylib到WeChat.app/目錄下

cp hook.dylib WeChat.app/



4.6 建立一個專案,bundle identifier可以取為com.tencent.xin2 ,當然你取什麼都可以,然後在https://developer.apple.com 建立它的App ID和Provisioning Profile證書(distribution版),並且打一個release包,把這個包裡面包含的 embedded.mobileprovision 檔案拷貝到 WeChat.app/



4.7 在 https://developer.apple.com 查詢到證書的對應的AppID=com.tencent.xin2的provisioning profile證書,下載下來,通過如下命令可以看到.mobileprovision 的內容

security cms -D -i example.mobileprovision



4.8 通過簽名命令可以得到如下Entitlements的配置資訊,

codesign -d –entitlements - WeChat.app

並建立一個Entitlements.plist檔案,貼上上面命令輸出的內容,檔案基本內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
  <key>application-identifier</key>
  <string>BA7DZZ39KJ.com.domain.projectname</string>
  <key>com.apple.developer.team-identifier</key>
  <string>BA7DZZ39KJ</string>
  <key>get-task-allow</key>
  <true/>
  <key>keychain-access-groups</key>
  <array>
      <string>BA7DZZ39KJ.*</string>
  </array>
 </dict>
</plist>

4.9 檢視所有可用於簽名的證書

security find-identity -v -p codesigning



4.10 對hook.dylib動態庫進行簽名,並驗證,其中B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9是證書的一個字串,可以從4.9的步驟檢視到,驗證無報錯資訊,則表示通過

codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 WeChat.app/hook.dylib
codesign –verify WeChat.app/hook.dylib



4.11 先把WeChat.app/_CodeSignature 目錄刪除掉,然後把WeChat.app裡的Info.plist檔案裡的BundleID改成com.tencent.xin2,接著對WeChat.app進行簽名,驗證

codesign -f -s B3C14FC452E835C09B70D5C24961EBAFC0A2C4B9 WeChat.app
codesign –verify WeChat.app



4.12 檢視WeChat.app可執行檔案簽名狀態的資訊,這些資訊在出現不明錯誤時會提供巨大的幫助:

codesign -vv -d WeChat.app

這裡寫圖片描述



4.13 ipa打包

xcrun -sdk iphoneos PackageApplication -v WeChat.app -o $(pwd)/WeChat2.ipa

但是,自從Xcode 8.3.2 後,PackageApplication 就不可用了,先google找找問題吧,解決方案如下:

我把Xcode 8.3.2之前的PackageApplication指令碼複製到了/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin目錄下,然後使用 chmod 777 PackageApplication 給這個指令碼執行許可權,最後可以正常打包了,下載地址

我們知道正常打包的流程如下
1.清除快取

xcodebuild clean

2.編譯專案,編譯後,當前專案目錄會出現 `build/Release-iphoneos/TodaysAppForReSign.app’ 檔案

xcodebuild -sdk iphoneos10.3 -target TodaysAppForReSign -configuration Release -arch arm64 -arch armv7 CODE_SIGN_IDENTITY=”iPhone Distribution: victor zhang (BBBBAAAACCCC888899)”

3.生成ipa包

xcrun -sdk iphoneos PackageApplication -v build/Release-iphoneos/TodaysAppForReSign.app -o $(pwd)/TodaysAppForReSign.ipa

在這裡,我們只需要使用第三步即可



未完待續。。。

相關推薦

iOS應用注入dylibhook重新簽名打包

iOS攻防 - (九)將iOS應用hook和注入dylib後,重新簽名並打包 1.下載微信,並解密WeChat.ipa 2.檢視解密後的微信的基本資訊 通過cd命令到解密後微信的目錄,名稱com.tencent.xin-iOS7.0-(Clut

JavaWeb學習HttpServletRequest基本應用——客戶端提交表單到伺服器2

一、獲得客戶機請求引數(客戶端提交的資料) getParameter(String)方法(常用) getParameterValues(String name)方法(常用) getParameterNames()方法(不常用) getParameterMap()方法(編寫

C#實戰小技巧:List<string>string[]的相互轉換

List是string型別列表,string[]是string型別陣列,二者可以互相轉換。 1.string[]轉List string[] strArray = {"a", "ab", "abc"}; List<string> strList = new List<s

ionic學習:ionic3引入echarts及線上測試複製到專案內

參考這裡:https://blog.csdn.net/weixin_36593033/article/details/78087329 步驟 1.安裝 安裝命令: npm install echarts --save//下載ECharts npm install @types/echa

【linux】Valgrind工具集詳解:Memcheck檢查的內容方法

一、值的有效性 1、什麼是值的有效性? 英文原文是Valid-value (V) bits,直譯過來就是有效值(V)位。 我將它理解為值的有效性,就是判斷在記憶體或CPU的實體地址中儲存的資料是否有效,比如在記憶體中變數(int i)代表的物理位置(不是地址),沒有初始化,就去使用它

MapReduce自定義檔案讀取輸出元件

作用 自定義檔案讀取 讀取檔案時,預設是使用讀取器 LineRecoredReader<行首偏移量,每行內容>,每讀取一次,把key和value傳給 開發者開發的Mapper元件。現在自定義檔案讀取器,可以自定義讀取檔案的方法,這樣就可以調整傳遞給Mapper元件的

Java基礎:logback實現日誌按天大小切分

【前言】        專案中每天會列印很多日誌,有時候進行排錯開啟一個大的日誌檔案(我們有一個系統的線上日誌檔案大小已經超過20G)是一件很可怕的事情;對日誌進行按天的切分是一件非常有必要的事情。 【日誌按天切分】          一、在application.pr

75000 行原生 iOS 應用程式移植到 Flutter 結果太驚訝!

【CSDN編者按】很少有文章,介紹如何將大型應用,移植到Flutter。而本文的作者——一位來自

Java服務化系統線上應急技術攻關你必須擁有的那些應用層指令碼Java虛擬機器命令

原文部落格:https://www.jianshu.com/p/46a120f9e5a3無論是技術開發人員還是架構設計人員都是在實踐中成長起來的,他們通過實踐進行總結,總結後把經驗昇華並再次應用到實踐中去,進一步提供生產效率。 本文介紹筆者在網際網路公司裡線上應急和技術攻關過程中積累的應用層指令碼和Java虛

Python網路爬蟲:爬取頂點小說網站全部小說存入MongoDB

前言:本篇部落格將爬取頂點小說網站全部小說、涉及到的問題有:Scrapy架構、斷點續傳問題、Mongodb資料庫相關操作。 背景: Python版本:Anaconda3 執行平臺:Windows IDE:PyCharm 資料庫:MongoDB 瀏

C/C++學習迴圈雙鏈表的操作之建立插入、刪除

雙向連結串列 迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是O(n)。如果希望從表中快速確定某一個結點的前驅,另一個解決方法就是在單鏈表的每個結點裡再增加一個指向其

Ionic3學習筆記關於 Android 端軟鍵盤彈出介面被壓縮的問題

本文為原創文章,轉載請標明出處 今天做了一個如下圖所示的頁面。 iOS 端毫無 bug,Android 端卻出現了問題。當軟鍵盤彈出後,Android 端的 tabs 移到了軟鍵盤的上面,再仔細一看,整個介面都被壓扁了,輸入框也不知道去哪兒了。 於是去

Spring:Spring&Struts2&Hibernate整合實現查詢Employee信息

view event last .html ssh tla url 配置文件 hid 背景:   基於之前兩篇文章《Spring(三):Spring整合Hibernate》、《Spring(四):Spring整合Hibernate,之後整合Struts2》,了解了

seleniumHeadless Chrome/Firefox--PhantomJS停止支持使用無界面模式。

phantomjs alt 頁面 gradient isp lease isa display 功能 簡介: 以前都用PhantomJS來進行無界面模式的自動化測試,或者爬取某些動態頁面。 但是最近selenium更新以後,‘Selenium support for

當同時安裝Python2Python3如何相容切換使用詳解比如pip使用

由於歷史原因,Python有兩個大的版本分支,Python2和Python3,又由於一些庫只支援某個版本分支,所以需要在電腦上同時安裝Python2和Python3,因此如何讓兩個版本的Python相容,如何讓指令碼在對應的Python版本上執行,這個是值得總結的。對於Ubu

Spring Boot 揭秘與實戰 應用監控篇 - HTTP 健康監控

don 此外 final 監控 blog jms 例如 簡單的 3.0 文章目錄 1. 內置 HealthIndicator 監控檢測 2. 自定義 HealthIndicator 監控檢測 3. 源代碼 Health 信息是從 ApplicationContext

用ASP.NET Core MVC EF Core 構建Web應用

fix pro school time lap namespace 繼承映射 數據庫表 eas 在上一節中,已經處理了並發異常。 本節將演示如何在數據模型中實現繼承。 在面向對象的編程中,可以使用繼承以便於重用代碼。 在本教程中,將更改 Instructor和 Studen

JavaWeb高階程式設計—— 使用過濾器改進應用程式

一、瞭解過濾器         過濾器是可以攔截訪問資源的請求、資源的響應或者同時攔截兩者的應用元件,它們將以某種方式作用於這些請求或響應。過濾器可以檢測和修改請求或響應,它們甚至可以拒絕、重定向或轉發請求。如同Servlet一樣,過濾器可以在部署描述

斷言NSAssertIOS中的應用

NSAssert()是一個巨集,用於開發階段除錯程式中的Bug,通過為NSAssert()傳遞條件表示式來斷定是否屬於Bug,滿足條件返回真值,程式繼續執行,如果返回假值,則丟擲異常,並且可以自定義異常描述。 檢視原始碼我們可以看到NSAssert是這樣定義的,NSAssert(condit

【蜂口 | AI人工智慧】人臉風格化——龍鵬 深度學習與人臉影象應用連載

本次我們接著上一節內容繼續分享,今天的分享內容是人臉風格化這個主題。同樣我們將從以下幾個方面給大家進行分享: 首先,我們會對風格化做一個簡單的介紹。風格化到底是一個什麼樣的課題?在我們這裡實際上包含了兩層內容,即通用的風格化問題和與人臉有關的風格化問題。 其次,我們將會對風格化中的核