android逆向奇技淫巧二十三:自己寫app調用x音關鍵so(未完待續)(八)


  之前逆向中,通過ida棧回溯找到了一些函數,但分析起來還是費勁,主要的痛點:

  • 代碼量大:libmetasec_ml的text段從0x7c50開始,0x84170結束;粗略估計代碼超過13萬行(這還不包括init段的代碼);

          ;  嘗試着用CE在內存中找各種加密的magic number、url,然后下內存的讀斷點的方式縮小代碼的分析范圍;這種方法確實能找到一些讀這塊內存區域的代碼,並且隨着我操作x音軟件,比如點贊、上下滑動等,這些代碼的執行次數明顯增加,說明這些代碼確實讀了內存的magic number!然而android下的ce功能有殘缺(當然也有可能是我沒用好,有熟悉的朋友還請多多提示!)無法像windwos下那樣做堆棧回溯和代碼trace(貌似hyperpwn可以,后續要試試),這里只能悻悻作罷!       

  • 混淆嚴重:vmp、加殼;
  • 反IDA的F5,人為改變棧平衡:(1)函數中間增加大量無用的分支,破壞棧平衡 (2)結尾“隱藏”pop代碼;(https://bbs.pediy.com/thread-269072.htm 這里有看雪大佬提供的腳本快速找到函數末尾的pop代碼,親測有用!)   小tips:遇到下面這種無法識別的塊狀數據,建議點擊右鍵,選擇“data”,把代碼塊拆散成單個字節;然后再用c或p識別成匯編;如果ida提示無法識別,可能是thumb或arm模式交叉導致的,建議直接alt+g鍵,選擇thumb還是arm模式;thumb模式是0x1,arm模式是0x0;人為選定好模式后,再用c或p都能正常識別匯編代碼了!
  •  AgentSmith HIDS:字節開源的HIDS工具,采用內核驅動方式進行入侵檢測,可以檢測各種rootkit/bootkit,具有實時,高性能,無感知的優勢;詳細介紹在這里:https://mp.weixin.qq.com/s/rm_hXHb_YBWQqmifgAqfaw,自稱最后的防線(注意這措詞,你品、你細品!); 我之前用frida在模擬器hook,老是提示memory acccess violation,估計就是這貨干的:先改變內存屬性,再hook mprotect,導致我調用mprotect的時候 怎么都沒法把內存改成可寫可執行的! HIDS的核心功能就是hook好些個linux的系統調用或內核函數,和windows下的ssdt hook沒本質區別(早些年非常流行這么干,比如在驅動0環下hook openprocess、createprocess、virtualAlloc等關鍵的系統api來監控自己是不是被調試、被hook了,最著名的例子就是鵝廠的TP保護啦)!windows可以通過內核重載、用原dll替換等方式繞過ssdt hook,linux該怎么操作了(用原廠的libc.so替換手機的libc.so)?熟悉的大佬還請多多賜教!

  • ida調試時彈各種signal的框!原本以為是其他線程為了反調試發送的signal,后來發現不是,因為掛起其他線程后還是會遇到signal彈框! 難道是主線程自己發送的signal?查看了導入表,確實有raise和sigaction函數,比如這里就用了raise發送信號:,  所以干脆一不做二不休,直接把BLX代碼NOP掉不讓發signal!然后把新的so上傳到這個目錄,然后用chgrp system libmetasec_ml.so、chown system libmetasec_ml.so 、chmod 777 libmetasec_ml.so 這3條命令更改我們打過補丁so的屬性;繼續用ida調試,發現更改生效了! 本以為signal反調試該繞過了吧,然而單步時發現還是不行,ida照樣彈signal的框!WTF.......

    想了好多方法,目前看都不奏效,是在沒辦法了,還是自己寫個app調用那幾個關鍵的so吧!x音的關鍵so有4個,分別時metasec_ml,sscronet、ttboringssl、ttcrypto4,加載直接用System.loadLibrary就行了,關鍵是從哪個函數開始調用了?

    之前通過hook registerNative發現:metasec_ml中的0x1094c被ms.bd.c.h.a方法注冊成了native函數,這是metasec_ml唯一的native函數,肯定很重要,就從這里下手唄!這個函數有5個參數,分別都是啥了?hook一下,通過上下滑動、點贊等操作,得到的部分結果如下:

  (1)前面5行就是5個參數(第三個參數3069363984是個大坑,后面會分享),最后一行是返回值(注意:\u003d是等號,打印的時候沒注意);到這里就非常明確了:我點贊的時候,會給第4個string類型的url發送第5行的參數,然后返回5個關鍵字段!

enter================================================================================
50331649
0
3069363984
https://aweme.snssdk.com/aweme/v1/commit/item/digg/?aweme_id=7012190183613271326&type=0&channel_id=0&city=511500&activity=0&os_api=25&device_type=SM-G9750&ssmix=a&manifest_version_code=150901&dpi=280&app_name=aweme&version_name=15.9.0&ts=1633082005&cpu_support64=false&app_type=normal&ac=wifi&appTheme=light&host_abi=armeabi-v7a&channel=douyin_baizhong_and9&update_version_code=15909900&_rticket=1633082005559&device_platform=android&iid=2542488099492919&version_code=150900&cdid=5b43e48d-b149-4c8a-8863-b2d84e650be4&openudid=b83ec6a675adba6a&device_id=4380918606995591&resolution=1080*1920&device_brand=samsung&language=zh&os_version=7.1.2&aid=1128&minor_status=0&mcc_mnc=46000
["accept-encoding","gzip","activity_now_client","1633082006281","cookie","n_mh\u003dB6WRe0yd-1qIuffF6ZWNO-CSGlW1Q-VhC0E79NrqYTg; uid_tt\u003db21518a30e097fbd558cdddf9bcfd3a5; uid_tt_ss\u003db21518a30e097fbd558cdddf9bcfd3a5; sid_tt\u003d5a51412bfb955ee582edae8d48765690; sessionid\u003d5a51412bfb955ee582edae8d48765690; sessionid_ss\u003d5a51412bfb955ee582edae8d48765690; d_ticket\u003d6b7d0d3678f21faa482196c460483d4eed15d; install_id\u003d2542488099492919; ttreq\u003d1$a01a1173c36665a50314924786f4704df6cdeb45; sid_guard\u003d5a51412bfb955ee582edae8d48765690%7C1633073022%7C5184000%7CTue%2C+30-Nov-2021+07%3A23%3A42+GMT; odin_tt\u003dd6830b19108bdcaae41090d9e65ad3759470032f5ccca0d570fd9068245737d04d72f7ebd8f424642c74aef7daa7fe7c17a304e4e90fadce583fbd2f27b62b3dbd220c701a5f855bfbb03f28d9ff1a00","passport-sdk-version","18","sdk-version","2","x-ss-req-ticket","1633082005560","x-tt-dt","AAAWE6B2GUFAXT6334YUXULDQYYJVNUET2U6F65LF4DGP633PKKOW4G5RYQICNRGETWUCJRQXA3KLBYATX3VN5EH53KVHI4OIODKU3QK5WSB4UMPRT3J6KWQMJ2KNYZOH6KVIR4HS3IWTLWOI3XSXLI","x-tt-token","005a51412bfb955ee582edae8d487656900578dbace1e129cdfc145db79a00a679c435f1b944bc01d40440569340d2d807f071e4d421235be08f35642578ff5e0afecb90db9ae98f5e40e594b9c7603c4e79f7d39f26e6c1ce79df4f6be652d82543e-1.0.1","x-vc-bdturing-sdk-version","2.1.0.cn"]
["X-Argus","8sTiPtr788+juhDzIL0jWZPmgIt1f6kaNjxdd2LaNmaR/FrXZqBrMrdLDXSpsTG/0pLJREpqO/LhzMrjtRbdRqsXkLS7WpGWCM1O9l1D1xYEV8FXNSZNWkmtszxRs5+7QnCBJlgD7K62/8pF6pKq1xw915KGoIoz2bTtvb2FBMmTvyVWVXgqG+9yqdRrBLBfAbOhCLTRXDikVZ0KOYM3Gnm88fsYKV/riWChXYq9oGh1JqCz0VG6RrpITW54nA3xjzVRIOair1wu5bvj8Yp2QF0ph+ummGqjH+ZqnOaKJCobCw\u003d\u003d","X-Gorgon","040420a40000559cfe7a35c31f04c7aacf9f1c661cc4dcd753b8","X-Khronos","1633082005","X-Ladon","OzDzLnKqALRcVy3TGY2HtTR6IYSLoy3Hq72URmF7RR5WkVWx","X-Tyhon","2h6mMNrftz3Ox9JX6vPfCdv/hDHM27Qpltiuk0U\u003d"]
leave================================================================================

   事已至此,如果只是想生成這5個字段用來刷單、刷贊等,可以直接hook ms.bd.c.h.a方法,傳入自己特定的參數,拿到返回值即可,沒必要繼續死磕算法細節了!但是站在學習角度,還是有必須要繼續深入的!

       (2)接着上面的分析,在自己的app中調用ms.bd.c.h.a,傳入上面的5個參數;自己寫的app大概是這樣的:整個工程在文章末尾的百度網盤有

   

  本以為一帆風順、能直接看到返回5個關鍵字段了,發現android studio報錯如下:

--------- beginning of crash
2021-10-02 11:15:47.670 4349-4349/com.test.douyin A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4 in tid 4349 (com.test.douyin)

  報錯就算了,app還閃退,根本沒法用ida、frida來hook排查原因!想來想去,最后只能寄希望於ida了!app不是閃退么?通過 adb shell am start -D -n com.test.douyin/com.test.douyin.MainActivity 命令先讓app掛起,然后用ida附加,再執行jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8644即可,結果4個so剛加載完就報異常:

        

   這個還好,代碼還可以繼續運行!還記得前面文章分享的ida trace腳本了?我的思路是這樣的:用ida從metasec_ml的0x1094c開始指令級別的trace,看看我傳入的參數到底是怎么一步一步處理、然后返回得到5個加密字段的;事實再次證明:我想的真美!從metasec_ml的0x1094c開始,前面200來行的指令還算正常,一直在跑,棧上還能看到我傳入的url參數!

        

         直到遇到了 “LDR R0, [R4,#0xC]” 這句指令,執行時一直彈窗報錯,走不下去了,定睛一看,我的個乖乖!R4的值=0xB6F2C710,也就是3069363984L,這特么不是我傳入的第3個參數么?這個數據是hook x音原始app得到的,也就是說x音是直接傳了一個有效的地址進來,這個地址可能存了某些重要數據;我自己構造app傳參時只顧着埋頭“抄作業”,不知道這個字段的含義!

    

  這里又是一個卡點,還要繼續想怎么處理!(個人猜測這也是x音反逆向的手段之一,就是為了防止so被第三方單獨拎出來調用,所以傳遞參數的時候故意傳了一個地址來驗證!)  

  類似的防護方式下x信搶紅包也遇到過:以前是直接調用某個接口、傳入參數就能搶紅包了,現在復雜了一些:需要先調用某接口,讓x信返回一串字符,再用這串字符+其他參數調用新接口搶紅包,增加了逆向難度!   

 

吐槽:

1、構造app時,經常遇到如下錯誤:發現是sscronet注冊了大量的native函數,這些函數都要挨個在java代碼補上,非常痛苦!

2021-10-01 21:00:49.072 5466-5466/com.test.douyin A/chromium: [1001/210049.036672:FATAL:jni_android.cc(141)] Failed to find class com/ttnet/org/chromium/net/X509Util
    #00 0x0c9144bd /data/app/com.test.douyin-2/lib/arm/libsscronet.so+0x001144bd
    #01 0x0c945739 /data/app/com.test.douyin-2/lib/arm/libsscronet.so+0x00145739
    #02 0x0c945799 /data/app/com.test.douyin-2/lib/arm/libsscronet.so+0x00145799
    #03 0x0c8c5b95 /data/app/com.test.douyin-2/lib/arm/libsscronet.so+0x000c5b95
    #04 0x0c8c3f1f /data/app/com.test.douyin-2/lib/arm/libsscronet.so+0x000c3f1f
2021-10-01 21:00:49.072 5466-5466/com.test.douyin A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 5466 (com.test.douyin)

 為了方便大家,我把自己建好的app、hook的腳本、打印的日志、trace的日志都上傳到網盤了:https://pan.baidu.com/s/1VKbcZDC-wp79q_lPE4XGmg  提取碼:jeer ;希望各位大佬幫忙完善一下,感謝!

參考:

1、https://zhuanlan.zhihu.com/p/346722474  SIGSEGV錯誤類型說明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM