1. 程式人生 > >APP逆向分析之釘釘搶紅包外掛的實現-iOS篇

APP逆向分析之釘釘搶紅包外掛的實現-iOS篇

網路上關於微信紅包的分析文章已經非常多了,基本上照著做就可以弄個微信搶紅包外掛出來,不過,隨著阿里巴巴的釘釘在企業中的流行,很多企業現在都採用釘釘來辦公了,順帶著,也就使用釘釘來發紅包了,學習了那麼多逆向的理論後,需要拿一個東西來練練手,剛好,釘釘就符合這個要求,於是,便有了下面的這篇文章.套用騰訊的何兆林在文章 移動App入侵與逆向破解技術-iOS篇說的一段話 
"破解有時候很耗時,和程式開發正好相反,它耗時不是耗在寫程式碼上,而是耗在尋找注入點和逆向工程上,有可能你花了3天時間去找程式的破綻,但是最終的破解程式碼可能就2行,不到一分鐘就搞定了;但是你也需要做好面對失敗的準備,如果路選錯了,有可能你這3天完全是在浪費腦細胞"

本文的原始碼放在我的gitHub上 DingTalkNoJailTweak ,,其ReadMe檔案說明了其中相關的程式碼是起什麼作用的.

當然了,這篇檔案會涉及比較多的逆向的東西,這些理論等前序知識,可以參考網上的,網上的資料比較多了,比如TheOS的開發環境的搭建,Hopper逆向分析軟體的使用,ida Pro等,移動App入侵與逆向破解技術-iOS篇上就有很不錯的前序理論知識的介紹. 
好了,閒話不多說,直接進入正題.

相關工具和環境

一臺越獄的手機,雖然不越獄的手機也可以用來分析,但是,那樣將會大大的減慢整個分析過程,因為非越獄的只能通過注入後打log日誌來分析,耗時耗力,所以,越獄手機是必備

越獄的手機上安裝了

cycript

從cydia中安裝

FlexInjected

從cydia中安裝,在cydia中搜索Flipboard FLEX loader

clutch

https://github.com/KJCracks/Clutch clutch下載 
下載後,按照上面的指示, Clone the repo 
git clone [email protected]:KJCracks/Clutch.git 
cd Clutch 
Build 
xcodebuild -project Clutch.xcodeproj -configuration Release ARCHS="armv7 armv7s arm64" build 
Install 
scp /path/to/Clutch

[email protected]:/usr/bin/ 
ssh [email protected] 
當然你可以使用同步助手,PP助手,iFunBox,iTools Pro來安裝到手機的/usr/bin下 如果不是用SSH從電腦上登陸手機的命令列的話,你可以cydia下載MTerminal,然後使用su切換使用者到root,再使用命令 chmod +x clutch來提升許可權

MTerminal

cydia中下載,可以方便的在你的手機上使用終端命令列.

一臺MAC電腦安裝了

class-dump

class-dump,用來dump出二進位制的標頭檔案.

Theos

Hopper Disassembler v3 或者ida Pro

用來進行彙編分析的

xcode

insert_dylib

iTools Pro

iTools 方便的用來拷貝.瀏覽手機上的所有檔案

砸殼

砸殼,是為了能夠使用class-dump來匯出所有的標頭檔案,有了標頭檔案,我們分析起來才是有可能的. ssh連上你的越獄手機/或者像我一樣直接在手機上的Terminal中操作,呼叫clutch來進行砸殼

YohunlIp6:~ root# clutch  
Usage: clutch [OPTIONS]  
-b --binary-dump <value> Only dump binary files from specified bundleID 
-d --dump <value>        Dump specified bundleID into .ipa file 
-i --print-installed     Print installed applications 
   --clean               Clean /var/tmp/clutch directory 
   --version             Display version and exit 
-? --help                Display this help and exit 
-n --no-color            Print with colors disabled 
-v --verbose             Print verbose messages 

以上是clutch支援的命令 其中的 -b就是 用來砸殼的,需要一個引數是要被砸殼的應用的bundleid,獲取釘釘的bundleid有很多方法,你可以直接使用 clutch -i 輸出手機上所有已經安裝的應用,找到bundleid.釘釘的bundleid是com.laiwang.DingTalk 開始砸殼稍等一會,砸殼完畢,會輸出砸完殼後的存放路徑

使用iTool Pro/PP助手等工具,將砸完殼的釘釘拷貝到電腦上

匯出標頭檔案

在電腦上,將砸殼後的檔案中讀取出標頭檔案, DingTalk是從砸殼後的ipa包中提取出來的釘釘的可執行檔案,這個檔案比較好找,一般都是沒有後綴的,大小最大的那個.

class-dump -H DingTalk -o DingTalkHeaders  

class-dump的簡單使用方式 最簡單的使用方式 class-dump -H DDMMerchant -o yicommonHeaders 
class-dump -H Payload/WeChat.app/WeChat -o wechatHeaders 
還可以加上 -S -s來對生成的方法,類都進行排序 class-dump -S -s -H Payload/WeChat.app/WeChat -o wechatHeaders 
一定要寫 -H,不然,都是在命令列輸出的,不會將內容輸入到資料夾下!!

匯出標頭檔案後,新建一個xcode工程,將所有的標頭檔案都匯出到工程中,為什麼做這一步呢,因為,Xcode的搜尋能力還是不錯的,方便我們去檢視這些標頭檔案.當然,由於一次性匯入xcode工程的檔案量比較大,在匯入的過程中,xcode可能會假死,稍微耐心一點.

開始分析

在這裡,強烈的推薦Flipboard的FLEX,這個簡直就是iOS分析界的神器啊.以前還要用命令才能一步步的將介面所對應的檢視,以及相應的ViewController分析出來,現在有了它,這個過程可以大大加速了.

如果你安裝了FlexInjected,開啟設定那裡FlexInjected中釘釘的開關,這樣,當釘釘啟動的時候,就載入了Flex了,載入了Flex後,會在釘釘中出現Flex的介面,點選介面可以進行相應的操作. 首先,第一步,我們先要找到搶紅包的檢視所對應的物件以及相應的VC,這個事情利用Flex還是很簡單的.

設定中開啟 FlexInjected中的釘釘,這樣,釘釘啟動的時候,就會載入FLex.

開啟釘釘,就會出現Flex的選單了,Flex的基本操作,可以參考FLex官網的.

通過Flex,我們很容易的得到下面的結果 1 聊天頁面的紅包檢視的View是DTMessageBubbleRedEnvelopView 
2 點選後,搶紅包的頁面的檢視是

DTOpenLuckyMoneyView 
----DTOpenLuckyMoneyEntityView

3 所有的聊天的會話的控制器是DTConversationListViewController.

我們已經知道了搶紅包的關鍵檢視是DTOpenLuckyMoneyEntityView 和DTOpenLuckyMoneyView.開啟我們dump出來的所有的標頭檔案,檢視DTOpenLuckyMoneyEntityView標頭檔案定義 
DTOpenLuckyMoneyEntityView的定義(擷取我們需要的關鍵部分)

@interface DTOpenLuckyMoneyEntityView : UIView <DTUserNameLabelDelegate>{
    id <DTOpenLuckyMoneyEntityViewDelegate> _delegate;
    ....
}
@property(nonatomic) __weak id <DTOpenLuckyMoneyEntityViewDelegate> delegate;
- (void)didClickOpenLuckyMoneyBtn:(UIButton *)arg1;
......
@end

DTOpenLuckyMoneyEntityViewDelegate

@protocol DTOpenLuckyMoneyEntityViewDelegate <NSObject>
- (void)didClickViewMore:(DTOpenLuckyMoneyEntityView *)arg1;
- (void)didClickOpenLuckyMoney:(DTOpenLuckyMoneyEntityView *)arg1;
@end

DTOpenLuckyMoneyView的定義(擷取我們需要的關鍵部分)

@interface DTOpenLuckyMoneyView : UIView <DTOpenLuckyMoneyEntityViewDelegate>
//通過此方法,構造出來檢視
+ (void)showLuckyMoneyWithPickingStatus:(DTBizRedEnvelopClusterPickingStatus *)arg1 withController:(DTMessageOTOViewController *)arg2 delegate:(id <DTOpenLuckyMoneyViewDelegate>)arg3;
- (void)didClickOpenLuckyMoney:(DTOpenLuckyMoneyEntityView *)arg1;
@end

通過上面的兩個類和一個協議的方法定義,我們很容易的就可以得出它們之間的關係大概是如下這樣的

當用戶點選了拆紅包按鈕時

DTOpenLuckyMoneyEntityView中的button的響應事件  
- (void)didClickOpenLuckyMoneyBtn:(id)arg1;
    其中  先獲取id <DTOpenLuckyMoneyEntityViewDelegate> _delegate; (取值是 DTOpenLuckyMoneyView (@interface DTOpenLuckyMoneyView : UIView <DTOpenLuckyMoneyEntityViewDelegate>))
    轉給其方法 - (void)didClickViewMore:(DTOpenLuckyMoneyEntityView *)arg1;
也就是  
DTOpenLuckyMoneyEntityView  
- (void)didClickOpenLuckyMoneyBtn:(id)sender {
   [self.delegate didClickOpenLuckyMoney:self];//_delegate; (取值是 DTOpenLuckyMoneyView
}

這只是大概的流程,我們可以進一步細化這個流程,這個時候就要用到Hopper Disassembler或者iDA Pro了,用Hopper開啟釘釘的可執行檔案,等待分析完畢,開啟DTOpenLuckyMoneyView的didClickViewMore實現,(這裡我只截取了部分)
從這個方法的彙編程式碼中,我們大體上可以得到如下的資訊:

DTOpenLuckyMoneyView didClickOpenLuckyMoney:(DTOpenLuckyMoneyEntityView *)arg1;  
   [self statusModel]; //DTBizRedEnvelopClusterPickingStatus *statusModel,其中有一個屬性是DTBizRedEnvelopCluster,包含了紅紅包的相關資訊,看上面的截圖
   [self utOpenRedEnvelop:statusModel]
   [self beginLoading]//其中會呼叫DTOpenLuckyMoneyEntityView的loading方法等
   [DTRedEnvelopServiceFactory defaultServiceIMP]獲取一個 DTRedEnvelopServiceIMP
   self redEnvelopCluster
   serverFormatWithCountryCode:number:
   clusterId
   luckyMoneyEntityView
   //DTRedEnvelopServiceIMP - (void)pickRedEnvelopCluster:(long long)arg1 clusterId:(id)arg2 successBlock:(CDUnknownBlockType)arg3 failureBlock:(CDUnknownBlockType)arg4;
   pickRedEnvelopCluster:clusterId:successBlock:failureBlock:

我們看到其中有 DTRedEnvelopServiceFactory這個類,還有pickRedEnvelopCluster方法,在標頭檔案中搜索pickRedEnvelopCluster,可以得到我們又得到了幾個關聯的類,尤其是其中的DTRedEnvelopService.

到這裡,你可能還是很迷惑,下步該做什麼?

不要緊,TheOS給我們提供了一個logify.pl指令碼(theos/bin/logify),這個指令碼可以將一個類中的所有方法都加上日誌. 大概的使用方式就是

$THEOS/bin/logify.pl ./DTMessageMTMViewController.h  在終端顯示結果
$THEOS/bin/logify.pl ./DTMessageMTMViewController.h > /out/to/DTMessageMTMViewController.xm

我們使用Theos建立一個tweak,這個tweak的作用就是輸出日誌,有關theos的安裝和使用,可以參考我的另外一篇部落格iOS 越獄的Tweak開發,我們將我們覺得可疑的類都加上日誌,編譯一個tweak,安裝到手機上. 你的這個tweak.xm檔案中的內容應該是大致如下

%hook DTOpenLuckyMoneyView
+ (void)showLuckyMoneyWithPickingStatus:(NSObject *)arg1 withController:(id)arg2 delegate:(id)arg3 
{ 
    NSLog(@"WithPickingStatus = %@,className = %@",arg1,NSStringFromClass(arg1.class));
    %log; %orig;
}
+ (void)queryAndOpenPageWithClusterId:(id)arg1 senderId:(long long)arg2 withController:(id)arg3 { %log; %orig; }
........

%end

接著,你在釘釘中,讓別人發一個紅包,然後你點選拆紅包,拆掉紅包,將整個的Log輸出,複製出來,用於分析. 這裡,我將某一次的日誌部分放出來,讓你對這個日誌有個概念

<Warning>: <L_UI> -[DTMessageBubbleTapHandler messageBubbleViewCell:didTappedWithGestureRecognizer:] #81 [INFO] tap msg mid = 12685858885 , msgType = 902  
[m +[<DTRedEnvelopServiceFactory: 0x103303bd8> defaultServiceIMP]
[m -[<DTRedEnvelopServicePersistenceIMP: 0x14de243b0> initWithDbConnection:<OpenDatabase: 0x14f247e00>]
[m  = <DTRedEnvelopServicePersistenceIMP: 0x14de243b0>
[m +[<DTRedEnvelopServiceFactory: 0x103303bd8> createServiceIMPWithPersistence:<DTRedEnvelopServicePersistenceIMP: 0x14de243b0> network:<DTRedEnvelopServiceNetworkIMP: 0x14fa743c0>]
[m -[<DTRedEnvelopServiceIMP: 0x14fec6a70> init]
[m  = <DTRedEnvelopServiceIMP: 0x14fec6a70>
[m -[<DTRedEnvelopServiceIMP: 0x14fec6a70> setPersistenceIMP:<DTRedEnvelopServicePersistenceIMP: 0x14de243b0>]
[m -[<DTRedEnvelopServiceIMP: 0x14fec6a70> setNetworkIMP:<DTRedEnvelopServiceNetworkIMP: 0x14fa743c0>]
[m -[<DTRedEnvelopServiceIMP: 0x14fec6a70> sendInitAlipay]
[m -[<DTRedEnvelopServiceIMP: 0x14fec6a70> getBindAlipaySuccessBlock:(null) failureBlock:(null)]
[m -[<DTRedEnvelopServiceIMP: 0x14fec6a70> networkIMP]
[m  = 0x<DTRedEnvelopServiceNetworkIMP: 0x14fa743c0>
[m -[<DTRedEnvelopServiceNetworkIMP: 0x14fa743c0> getBindAlipaySuccessBlock:<__NSStackBlock__: 0x16fdb5310> failureBlock:<__NSStackBlock__: 0x16fdb52e8>]
[m  = <DTRedEnvelopServiceIMP: 0x14fec6a70>
[m  = <DTRedEnvelopServiceIMP: 0x14fec6a70>
<Notice>: [
            
           

相關推薦

APP逆向分析紅包外掛實現-iOS

網路上關於微信紅包的分析文章已經非常多了,基本上照著做就可以弄個微信搶紅包外掛出來,不過,隨著阿里巴巴的釘釘在企業中的流行,很多企業現在都採用釘釘來辦公了,順帶著,也就使用釘釘來發紅包了,學習了那麼多逆向的理論後,需要拿一個東西來練練手,剛好,釘釘就符合這個要

APP案例分析華為瀏覽器

logs es2017 感覺 尋找 nbsp 5.1 是否 華為 分析 第一部分 對華為瀏覽器的調研,評測 1、對華為瀏覽器的第一次上手體驗   我會使用華為瀏覽器呢,是因為我買的手機是華為nova,該瀏覽器也是手機裏面預裝的。剛開始用的時候也沒太註意,感覺跟以前用的其他

一文了解安卓APP逆向分析與保護機制

dex 也不會 時也 也有 包含 啟動 RM 操作 混亂 “知物由學”是網易雲易盾打造的一個品牌欄目,詞語出自漢·王充《論衡·實知》。人,能力有高下之分,學習才知道事物的道理,而後才有智慧,不去求問就不會知道。“知物由學”希望通過一篇篇技術幹貨、趨勢解讀、人物思考和沈澱給你

1.逆向分析殼內找註冊碼

逆向先看看特點有:估計註冊碼是通過不同電腦與用戶名自動生成的 註意關鍵字符串 這裏就從字符串下手 查殼 (有殼)載入od斷下來了由於有殼所以先f9運行運行起來了就不管你怎麽加密 最後都要解密加載定位到 代碼段 (ctrl+g) 輸入0x401000搜索字符串(一般用智能搜索)搜索 未購買(怎麽就搜那個

Java紅包程式碼實現及二倍均值法分析

二倍均值法 剩餘紅包金額為M,剩餘人數為N,那麼有如下公式: 每次搶到的金額 = 隨機區間 (0, M / N X 2) 這個公式,保證了每次隨機金額的平均值是相等的,不會因為搶紅包的先後順序而造成不公平。 舉個栗子: 假設有10個人,紅包總額100元。 100/

linux逆向分析ELF檔案詳解

前言 首先如果大家遇到ELF二進位制檔案的逆向首先考慮的可能就是通過IDA進行靜態逆向分析演算法,那麼我們首先就要了解ELF(Executable and Linking Format)的檔案格式。 ELF檔案格式主要分為以下幾類: 1. 可重定位檔案(Relocatable File),這類檔

Android逆向分析dex2jar和jd-gui使用

從大三伊始到大四落幕,從剛開始接觸Android到辭掉第一份實習工作,我接觸Android應用層開發也快接近兩年了。越來越發覺Android的應用層已經沒什麼挑戰性了,想當初剛開始學習Android的時候,弄了一個Activity出來顯示在手機的那份喜悅,真是~哈哈~,應用

Android逆向分析Xposed的hook技術

轉載自:http://blog.csdn.net/qq_18870023/article/details/51753587 Android逆向工程裡常用到的工具除了的dex2jar,jd-gui,  Apktool之外還有一個Xposed。 這個工具是一個在不修改AP

逆向分析花指令1

一、 概述 花指令是對抗反彙編的有效手段之一,正常程式碼添加了花指令之後,可以破壞靜態反彙編的過程,使反彙編的結果出現錯誤。錯誤的反彙編結果會造成破解者的分析工作大量增加,進而使之不能理解程式的結構和演算法,也就很難破解程式,從而達到病毒或軟體保護的目的。 二、花指令分

010 Editor算法逆向分析編寫註冊機

brush register while 很好 bfd dword 拷貝 0x13 0x7a 將程序拖入OD,通過字符串搜索定位到核心代碼,經過分析,主要是如下圖所示的兩個關鍵函數,返回正確的值,才算是註冊成功。 1 開始分析,我們點擊register按鈕,彈出來窗

Ijkplayer播放器源碼分析音視頻輸出(二)——音頻

andro c中 table 播放器 handle att mut wake 判斷 Ijkplayer播放器源碼分析之音視頻輸出(二)——音頻篇 這篇文章的ijkplayer音頻源碼研究我們還是選擇Android平臺,它的音頻解碼是不支持硬解的,音頻播放使用的API是Ope

微信紅包外掛與Android輔助功能

      逢年過節大家都少不了發微信紅包,通過微信紅包來表達祝福。同時,微信還有拼手氣群紅包。各種群好友群,親戚群,工作群逢年過節常常會有紅包可搶。搶紅包的口訣是:“網速要好,手速要快”。搶到紅包固然欣喜,搶不到紅包的失落和遺憾的感覺卻讓人非常不爽。有時等紅包

Android中微信紅包外掛原理解析和開發實現

一、前言自從去年中微信新增搶紅包的功能,微信的電商之旅算是正式開始正式火爆起來。但是作為Android開發者來說,我們在搶紅包的同時意識到了很多問題,就是手動去搶紅包的速度慢了,當然這些有很多原因導致了。或許是網路的原因,而且這個也是最大的原因。但是其他的不可忽略的因素也是要

【我的區塊鏈路】- golang原始碼分析協程排程器底層實現( G、M、P)

本人的原始碼是基於go 1.9.7 版本的哦! 緊接著之前寫的 【我的區塊鏈之路】- golang原始碼分析之select的底層實現 和 【我的區塊鏈之路】- golang原始碼分析之channel的底層實現 我們這一次需要對go的排程器做一番剖析。

安卓微信自動紅包外掛優化和實現

轉載請註明作者AndroidMSky和連結http://blog.csdn.net/AndroidMsky/article/details/53490459 又是興趣系列 網上有很多自動強紅包的例子和程式碼,筆者也是做了一些優化。 先說說自己的兩個個優勢

AccessibilityService2016終極解決方案包括(微信紅包外掛原理解析和開發實現

一、前言 自從去年中微信新增搶紅包的功能,微信的電商之旅算是正式開始正式火爆起來。但是作為Android開發者來說,我們在搶紅包的同時意識到了很多問題,就是手動去搶紅包的速度慢了,當然這些有很多原因導致了。或許是網路的原因,而且這個也是最大的原因。但是其他的不可忽略的因

XGBoost原始碼分析單機多執行緒的實現

上篇文章主要通過論文閱讀、數學推導,基本掌握了XGBoost的原理。於是開始閱讀XGBoost原始碼,並總結了幾處自己認為比較重要的方面。如有錯誤,請指正: 1. 總體框架: cli_main.cc 是程式的入口,main函式所在的檔案。除了有main函式以外,還有訓練

Android進階——學習AccessibilityService實現微信紅包外掛

前言 在你的手機更多設定或者高階設定中,我們會發現有個無障礙的功能,很多人不知道這個功能具體是幹嘛的,其實這個功能是為了增強使用者介面以幫助殘障人士,或者可能暫時無法與裝置充分互動的人們 它的具體實現是通過AccessibilityService服務執行

原始碼探索系列0---微信紅包外掛原理解析

好程式設計師,序號都是從0開始的。哈哈 微信搶紅包外掛 不知道你們還記不記得小米釋出會的時候,把不服跑個分改成搶紅包了,同時演示了一遍。 現在這個是基於他的修改版本,地址在這裡 ,如果你想看下小米搶紅包的原始碼,就點選這裡 接下來講解其中一種實現 ,但

spark 原始碼分析十四 -- broadcast 是如何實現的?

本篇文章主要剖析broadcast 的實現機制。   BroadcastManager初始化  BroadcastManager初始化方法原始碼如下:   TorrentBroadcastFactory的繼承關係如下:   BroadcastFac