iOS逆向-手把手教你寫支付寶螞蟻森林收集能量助手

原文:?iOS逆向-支付寶螞蟻森林

前言

發現iOS支付寶逆向的分析并不多,螞蟻森林基于H5應用 套著UIWebView 基本也沒這類JS和原生交互分析的帖子,就拿此練手吧 作技術分享

去掉 ptrace 和 __RESTRICT section 兩個保護

脫殼和dump頭文件

分析和調試

編寫Tweak

總結

環境

MacBook,iPhone6,iOS 9.3.3越獄, iOS支付寶10.1.5

工具

theos

Tweak制作工具

xcode

用lldb來附加調試

class-dump

導出頭文件

dumpdecrypted

脫appstore的殼

iHex

二進制編輯器

去掉 __RESTRICT section 和 ptrace 兩個保護

去掉 __RESTRICT section 步驟

ssh到手機 執行命令ps -e

找到/var/containers/Bundle/Application/DD6D8BA3-95F2-4C6D-BFD7-0E20420A6E9C/AlipayWallet.app/AlipayWallet

切換到mac電腦 使用scp命令 把執行文件拷到電腦上scp root@192.168.2.2:/var/containers/Bundle/Application/C6F2DD99-6450-4838-98B8-2899E8EBC1A4/AlipayWallet.app/AlipayWallet /Users/hack/Desktop/wz

打開iHex 查找command+f 把 __RESTRICT和__restrict替換為其他值(比如:__RRRRRRRR和__rrrrrrrr。保證長度不變就行啦)看圖1

拷貝文件回去scp /Users/hack/Desktop/wz/AlipayWallet root@192.168.2.2:/var/containers/Bundle/Application/C6F2DD99-6450-4838-98B8-2899E8EBC1A4/AlipayWallet.app/AlipayWallet

如果打開閃退 請Cydia中安裝 AppSync

去除ptrace保護

使用theos 創建Tweak 代碼如下 安裝到手機就可以

#import#importstaticint(*orig_ptrace) (intrequest, pid_t pid, caddr_t addr,intdata);staticintmy_ptrace (intrequest, pid_t pid, caddr_t addr,intdata){if(request ==31){NSLog(@"[AntiAntiDebug] - ptrace request is PT_DENY_ATTACH");return0;? ? }returnorig_ptrace(request,pid,addr,data);}%ctor{? MSHookFunction((void*)MSFindSymbol(NULL,"_ptrace"),(void*)my_ptrace,(void**)&orig_ptrace);NSLog(@"[AntiAntiDebug] Module loaded!!!");}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

脫殼和dump頭文件

執行命令cycript -p AlipayWallet注入支付寶進程

執行命令[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

看到返回/var/mobile/Containers/Data/Application/5E744C4A-5B05-4280-A21C-9E6EFE8EF51D/Documents/

執行命令cd /var/mobile/Containers/Data/Application/5E744C4A-5B05-4280-A21C-9E6EFE8EF51D/Documents/

把 dumpdecrypted.dylib拷貝進去scp /Users/cardlan/Downloads/dumpdecrypted-master/dumpdecrypted.dylib root@192.168.2.2:/var/mobile/Containers/Data/Application/5E744C4A-5B05-4280-A21C-9E6EFE8EF51D/Documents/

執行命令DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/DD6D8BA3-95F2-4C6D-BFD7-0E20420A6E9C/AlipayWallet.app/AlipayWallet

如果發現提示Killed: 9 切換su mobile再試 提示成功如下

DISCLAIMER: This toolisonly meantforsecurity research purposes,notforapplicationcrackers.[+] detected64bit ARM binaryinmemory.[+]offsettocryptid found: @0x100034d90(from0x100034000) = d90[+] Found encrypted dataataddress00004000oflength56786944bytes - type1.[+] Opening /private/var/containers/Bundle/Application/C6F2DD99-6450-4838-98B8-2899E8EBC1A4/AlipayWallet.app/AlipayWalletforreading.[+] Reading header[+] Detecting header type[+] Executableisa plain MACH-O image[+] Opening AlipayWallet.decryptedforwriting.[+] Copyingthenotencrypted startofthefile[+] Dumpingthedecrypted dataintothefile[+] Copyingthenotencrypted remainderofthefile[+] SettingtheLC_ENCRYPTION_INFO->cryptidto0atoffsetd90[+] Closing originalfile[+] Closing dumpfile

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

執行ls找到 AlipayWallet.decrypted scp拷貝到電腦就可以

接下來使用 class-dump 導出頭文件到當前文件夾

class-dump -H AlipayWallet.decrypted -o ./

分析和調試

打開支付寶到螞蟻森林界面 cycript -p AlipayWallet

我們從UI入手 執行[[UIApp keyWindow]recursiveDescription]看到

我們返回上面找控制器[#0x1386dc970 nextResponder]看到

我們去之前導出的頭文件翻翻 找到這個控制器 看看有什么敏感的方法和屬性,我們的目要找到關鍵的點擊事件或者相關的邏輯

我們使用choose(H5WebViewController)拿到實例 測試一下頭文件的方法看看

看了一大圈真沒什么什么進展,url 無法直接打開的 再想想UIWebView和原生交互的方法,如下代碼獲取個Html源碼來看看

類似于WebViewJavascriptBridge 咱們找下callback方法或者send方法試試

[#0x136a28400 lastMainRequest]" { URL: https://60000002.h5app.alipay.com/app/src/home.html?__webview_options__=transparentTitle%3Dauto%26canPullDown%3DNO}"[#0x136a28400 h5WebView]#">"[#0x136a28400 stringByEvaluatingJavaScriptFromString:"document.documentElement.innerHTML"]

1

2

3

4

5

6

7

8

我們來使用THEOS 自帶的logify.pl 生成H5WebViewController的全部方法調用和參數日志

/opt/theos/bin/logify.plH5WebViewController.h>Tweak.xm

1

編譯 Tweak.xm 注意:有編譯出錯 有些類和代理block是不認識的 出錯的刪掉就可以

CDUnknownBlockType 作參數的可以替換成 id 繼承于 DTViewController 替換成

安裝之后 手機連上我們電腦 打開xcode -菜單Window-Devices-Simulators

我們點擊那個能量按鈕收取別人的能量看看

接下來我們使用xcode 自帶的lldb來調試支付寶(默認xcode無法調試第三方應用)我們接下來給app加個權限

沒權限提示

Ensure“AlipayWallet”isnotalready running,andcardlan_yuhuajunhaspermissiontodebug it.

1

注意:要使用脫殼之后的AlipayWallet執行下面的命令,也就是AlipayWallet.decrypted 重命名為AlipayWallet(否則閃退)

將應用程序從設備上拷貝到本地利用 ldid 將應用程序的 code sign 導出:ldid-eAlipayWallet>>AlipayWallet.xml在 AlipayWallet.xml文件中添加 get-task-allow權限get-task-allow利用 ldid 對應用進行重簽名 ldid-SAlipayWallet.xml./AlipayWallet將應用拷回設備,將設置可執行權限 chmod755AlipayWallet完成

1

2

3

4

5

6

7

8

(圖3)

ps:如果如上操作還閃退 請重啟iphone

然后我們連上手機 xcode 隨便弄個工程 選擇iphone 看圖來開始附加AlipayWallet(圖4) 點到森林界面點擊xcode自帶的看界面工具 然后再xcode 右下角自帶的lldb 下斷點

我們先試著下斷函數

b-[H5WebViewController reportClickTime]

1

提示找不到no locations 我們隨便找個地址 看看堆棧信息

po[H5WebViewController _shortMethodDescription]

1

找一個地址

b 0x1057daab0

1

重開頁面 觸發斷點 ,點開xcode的堆棧窗口如(圖5)

發現很多地址是沒函數名的 當然也無法直接對函數名下斷點 我們借用大神寫的工具來恢復這些信息 文章鏈接如下

http://www.lxweimin.com/p/967b6631756c

之后 再附加一下

下這個斷點

b-[H5WebViewController reportClickTime]

1

發現是可以成功下斷了 繼續查看堆棧信息 現在函數名全部全了

(圖6)

往上回溯 思路 因為我們想找到是js過來的參數和調用原生方法是哪里過來的

畢竟 reportClickTime 不是我們要分析的

看到PSDJsBride 調用了很多次 而且看參數和函數名 很有可能 中轉了消息和參數 為了驗證我們的猜想 ,我們使用logify.pl 來生成tweak 打印他全部的調用日志

安裝到手機之后,我們取消斷電 打開xcode的日志看打印 有沒有敏感的信息調用

brdelete

1

點擊好友的那個能量收取 把日志全部copy 到Sublime text

看圖(7)

我們看到這個英文單詞 收集的意思 我們猜想這個就是收集能量的命令,看參數體有friedID 確定性90%了

- 證實猜想 我們用cycript 來試試 拿到PSDJsBridge 的實例 可以用choose也可以用日志打印那個

[#0x14a0bed80 _doFlushMessageQueue:@"把參數拷貝過來(自己處理轉義 里面有/"號)" url:@"第二個參數"];

提供下我日志的

_doFlushMessageQueue:[{"handlerName":"remoteLog","data":{"seedId":"ANTFOREST-BEHAVIOR-CLICK-COLLECT","param1":"shareBiz=none^bubbleId=26219984^actionUserId=2088322012980000^type=behavior^currentTimestamp=1510797618289","param2":"monitor_type=clicked^remoteType=info^pageName=home.html^pageState=friend2088322012980000_enterhomeOff","bizType":"antForest"},"callbackId":"remoteLog_15107976182890.5985529306344688"},{"handlerName":"rpc","data":{"operationType":"alipay.antmember.forest.h5.collectEnergy","requestData":[{"userId":2088322012987680,"bubbleIds":[26219984],"av":"5","ct":"ios"}],"disableLimitView":true},"callbackId":"rpc_15107976182910.0005478465463966131"}] url:https://60000002.h5app.alipay.com/app/src/home.html?userId=2088322012980000]

1

2

3

我們執行 看看日志打印 有日志輸出 看recv這些參數 和剛剛是有點差別 但是大致一樣(這個能量只能收一次)來看bubbleId 這個猜一下是能量的ID

來找怎么獲取的能量ID 我們打開一個有能量的好友,看日志 有獲取的調用沒

由于日志比較多 我們就是著重找有返回bubbleId和friedID 的列表,找到之后往上找調用著參數

[m -[ transformResponseData:{? ? ? ? bizNo ="092c5f8c-ee77-49ad-a3a2-dd3c059ee579-1510798661871";? ? ? ? bubbles =? ? (? ? ? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? business =? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? bigIconDisplayName ="\U884c\U8d70";? ? ? ? ? ? ? ? ? ? bizType = xingzou;? ? ? ? ? ? ? ? ? ? dayIconUrl ="https://zos.alipayobjects.com/rmsportal/xxx.png";id=9;? ? ? ? ? ? ? ? ? ? nightIconUrl ="https://zos.alipayobjects.com/rmsportal/xxx.png";? ? ? ? ? ? ? ? ? ? smallIconDisplayName ="\U884c\U8d70";? ? ? ? ? ? ? ? };? ? ? ? ? ? ? ? collectStatus = AVAILABLE;? ? ? ? ? ? ? ? fullEnergy =92;id=26343893;? ? ? ? ? ? ? ? produceTime =1510788093000;? ? ? ? ? ? ? ? remainEnergy =72;? ? ? ? ? ? ? ? userId =208890214255xxxx;? ? ? ? ? ? }? ? ? ? );? ? ? ? needGuide =0;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

結果有了 找調用

_doFlushMessageQueue:[{"handlerName":"remoteLog","data":{"seedId":"ANTFOREST-PAGE-READY-home","param1":"shareBiz=none^type=behavior^currentTimestamp=1510798661779","param2":"monitor_type=openPage^remoteType=info","bizType":"antForest"},"callbackId":"remoteLog_15107986617880.34833956067450345"},{"handlerName":"getSystemInfo","data":{},"callbackId":"getSystemInfo_15107986617920.08668778464198112"},{"handlerName":"hideOptionMenu","data":{},"callbackId":"hideOptionMenu_15107986617920.562577509554103"},{"handlerName":"setToolbarMenu","data":{"menus":[],"override":true},"callbackId":"setToolbarMenu_15107986617920.03417412145063281"},{"handlerName":"setGestureBack","data":{"val":true},"callbackId":"setGestureBack_15107986617920.6238974309526384"},{"handlerName":"remoteLog","data":{"seedId":"ANTFOREST-H5_PAGE_SET_PAGE_NAME","param1":"shareBiz=none^type=behavior^currentTimestamp=1510798661796","param2":"monitor_type=clicked^remoteType=info^pageName=home.html","bizType":"antForest"},"callbackId":"remoteLog_15107986617960.3546153837814927"},{"handlerName":"addNotifyListener","data":{"name":"NEBULANOTIFY_AFRefresh"},"callbackId":"addNotifyListener_15107986617960.04098325059749186"},{"handlerName":"rpc","data":{"operationType":"alipay.antmember.forest.h5.queryNextAction","requestData":[{"userId":"208890214255xxxx","av":"5","ct":"ios"}],"disableLimitView":true},"callbackId":"rpc_15107986617970.8864813686814159"}]url:https://60000002.h5app.alipay.com/app/src/home.html?userId=208890214255xxxx]

1

2

用cycript 測試這個方法 。結果如我們所愿 日志返回了我們需要的能量ID和好友ID 可以構造第一個找到那個方法 實現收一個好友的能量

- 由于這個方法需要好友ID的參數 我們需要拿到全部好友的ID 這樣才能實現我們的一鍵全部收取

- 這里我偷個懶 不去往下折騰 點擊頁面在PSDJsBridge transformResponseData

取top 10的好友ID(打開頁面他本身執行了 friendRanking系列方法 )

編寫Tweak

整理下流程,進頁面 他自身調用Top10的好友列表 我們拿到這10個用戶的UID

拿到UID之后執行上面分析的第二個方法 拿到指定用戶可以收的能量 collectStatus=AVAILABLE 返回參數中有 我們看字段就能猜到

拿到UID和能量ID 我們就可以執行收能量的功能了

具體的代碼不一一分析 下面會提供代碼下載地址

看成功圖8

總結

UIWebView的應用不同于原生的應用 有正向開發經驗能通過UI層能輕易找到觸發事件

其實很多時候都在試錯和猜想 ,逐步的去驗證自己的猜想 直到找到答案

這個Tweak只作技術分析,并沒有完善 Top10用戶收取還不夠用 大家可以試著動手 獲取下一頁好友 和全部好友 看日志找到字段是可以輕易實現的 還有其他功能比如 每天定時啟動收取啥的

這是代碼GitHub地址

https://github.com/hackxhj/alipayForestTweak.git

歡迎star

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容