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
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