初探iOS逆向工程

何為逆向工程?

逆向工程,指的是通過分析一個程序或系統的功能、結構或行為,將它的技術實現或設計細節推導出來的過程。當我們對一個軟件的功能很感興趣,卻又拿不到它的源代碼時,往往可以通過逆向工程的方式對它進行分析。

推薦的書籍:

推薦的書籍
推薦的書籍

iOS逆向交流論壇:http://iosre.com/

開始嘗試簡單的微信搶紅包

應用脫殼:

準備工作

  1. 一臺已越獄的iPhone5s以上機器(已安裝OpenSSH和Cycript,砸殼用)
  2. 砸殼工具dumpdecrypted.dylib
  3. PP助手(建議安裝,非常方便)

我們知道,App Store里的應用都是加密了的,直接拿上來擼是不正確的,所以在此之前一般會有這么一個砸殼的過程,其中用到的砸殼工具就是dumpdecrypted.dylib。 打開Mac的終端,用ssh進入連上的iPhone(確保iPhone和Mac在同一個網段,筆者iPhone的IP地址為192.168.8.54)。OpenSSH的root密碼默認為alpine。
這里寫圖片描述

接下來就是需要找到微信的Bundle路徑了,可以把iPhone上的所有App都關掉,唯獨保留微信,然后輸入命令 ps -e

這里寫圖片描述

這樣我們就找到了微信的可執行文件Wechat的具體路徑了。接下來我們需要用Cycript找出微信的Documents的路徑,輸入命令cycript -p WeChat


這里寫圖片描述

拷貝dumpdecrypted.dylib到iPhone上,這里我們用到scp命令.
scp 源文件路徑 目標文件路徑 。具體如下(也可以使用PP助手):


這里寫圖片描述

開始砸殼

dumpdecrypted.dylib的具體用法是:DYLD_INSERT_LIBRARIES=/PathFrom/dumpdecrypted.dylib /PathTo


這里寫圖片描述

當前目錄下會生成砸殼后的文件,即WeChat.decrypted。同樣用scp命令把WeChat.decrypted文件拷貝到電腦上,接下來我們要正式的dump微信的可執行文件了。(這邊原文寫的不完善,不過后來用PP助手文件管理器直接就導出來了,非常方便)
電腦端可以通過otool命令再次驗證是否砸殼成功:

> otool -l WeChat.app/WeChat | grep -B 2 crypt
          cmd LC_ENCRYPTION_INFO
      cmdsize 20
     cryptoff 16384
    cryptsize 40534016
      cryptid 0
--
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 16384
    cryptsize 43663360
      cryptid 0

otool可以輸出app的load commands,然后通過查看cryptid這個標志位來判斷app是否被加密。1代表加密了,0代表被解密了

編寫Hook代碼:

新建一個dylib工程,因為Xcode默認不支持生成dylib,所以我們需要下載iOSOpenDev,安裝完成后(Xcode7環境會提示安裝iOSOpenDev失敗,請參考iOSOpenDev安裝問題),重新打開Xcode,在新建項目的選項中即可看到iOSOpenDev選項了。


這里寫圖片描述

編寫代碼(就貼出了部分代碼):

//紅包參數
                NSMutableDictionary *params = [@{} mutableCopy];
                
                [params setObject:parameters[@"msgtype"]?:@"null" forKey:@"msgType"];
                [params setObject:parameters[@"sendid"]?:@"null" forKey:@"sendId"];
                [params setObject:parameters[@"channelid"]?:@"null" forKey:@"channelId"];
                
                id getContactDisplayName = objc_msgSend(selfContact, @selector(getContactDisplayName));
                id m_nsHeadImgUrl = objc_msgSend(selfContact, @selector(m_nsHeadImgUrl));
                
                [params setObject:getContactDisplayName forKey:@"nickName"];
                [params setObject:m_nsHeadImgUrl forKey:@"headImg"];
                [params setObject:[NSString stringWithFormat:@"%@", nativeUrl]?:@"null" forKey:@"nativeUrl"];
                [params setObject:m_nsFromUsr?:@"null" forKey:@"sessionUserName"];
                
                if (kCloseRedEnvPlugin != HBPluginType) {
                    //自動搶紅包
                    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
                    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:[docDir stringByAppendingPathComponent:HBPluginDelaySettingFile]];
                    if (dict){
                        HBPluginDelay = ((NSNumber *)dict[HBPluginDelayKey]).floatValue;
                    }
                    if (HBPluginDelay<0) {
                        HBPluginDelay=0;
                    }
                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(HBPluginDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                        ((void (*)(id, SEL, NSMutableDictionary*))objc_msgSend)(logicMgr, @selector(OpenRedEnvelopesRequest:), params);
                    });

編寫完代碼,直接XCODE運行跑一遍,就可以生成你自己的dylib了。接下來要做的就是讓微信來執行你的dylib。

重新打包微信App

準備工具:

  1. dylib注入神器:yololib
  2. 自動注入打包神器:iInjection.app
  3. 證書!沒有證書什么都白搭。

有了以上3個,那就可以快速進行重新打包了。~!
Warning:打包之前記得刪除微信APP包里的Watch文件夾以及Plugins文件夾里的東西~!

這里寫圖片描述

如圖,這個工具支持的功能很全面。
Tips:如果需要定制個性版的微信(自定義微信圖標,自定義微信APP顯示名字,比如圖標改成網易新聞的圖標,名字改成網易新聞~你想用這個微信來干啥都不會有人懷疑啊)??梢栽诖虬麬PP之前找兩張120120 180180的png格式圖片
這里寫圖片描述

名字改為AppIcon60x60@2x.png和AppIcon60x60@3x.png替換原app文件夾里的圖片即可~改名則是通過上面的APP打包神器更改顯示名字即可。
打包出來的ipa文件直接拖入PP助手就能快速安裝了~

參考鏈接:

一步一步實現iOS微信自動搶紅包(非越獄)
非越獄環境下從應用重簽名到微信上加載Cycript
iOS 破殼 反編譯 黑客技術大揭秘

工具下載:

我的github

進階之路

這邊就簡單介紹幾個工具。。

這里寫圖片描述

一款可以查看你是否注入成功的工具

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

這個厲害了。反編譯APP,能顯示匯編代碼(無奈看不懂。),但是看不懂也沒關系。。他能生成相應的偽代碼。

這里寫圖片描述

這里寫圖片描述

越獄手機 上可以查看 任何APP的UI結構。

class-dump:

可導出APP的所有.h文件。

總結

網上現在教程也挺多,也能搜到很多前人先好的hook代碼,如果真要自己去想實現一個功能從頭到尾自己做還是非常難的!而且最近微信對于搶紅包,多開微信的查處力度也在不斷加強,微信那邊簡簡單單加一句檢測代碼,逆向就可能要分析好久才能找到對應方法。(如果能拿到微信源代碼那該多爽啊!)。
總之逆向非常坎坷,中途總會遇到莫名其妙的錯誤,只能不斷的嘗試當然最后成功的喜悅也是不言而喻的!希望大家都可以嘗試嘗試~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 逆向工程的目的 1)分析競品的最新研究或者產品原型(包括所用的技術,所使用的框架)2)學術/學習目的。3)破解應用...
    90后的思維閱讀 6,983評論 3 14
  • 前言:最近筆者在研究iOS逆向工程,順便拿微信來練手,在非越獄手機上實現了微信自動搶紅包的功能。 題外話:此教程是...
    曾柏超閱讀 1,869評論 0 2
  • 前言:最近筆者在研究iOS逆向工程,順便拿微信來練手,在非越獄手機上實現了微信自動搶紅包的功能。 題外話:此教程是...
    nongjiazhen閱讀 16,897評論 1 0
  • 逆向工具集的安裝和使用 iOS 逆向工程的工具分類 檢查工具如:Reveal(界面分析工具)、tcpdump(抓包...
    Yochi閱讀 5,849評論 1 5
  • 虛擬的娛樂,那是無關的感受,我們渴望的是真正的心靈舒暢,真正的關愛帶來的美妙感受,真實的社交帶來的人與人之間的互動...
    中黃志氣閱讀 361評論 0 1