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错误类型说明

posted @ 2021-10-02 23:09  第七子007  阅读(4908)  评论(4编辑  收藏  举报