关于TikTok逆向中方法定位的问题

环境: macOS11.6

之前做过一些Web端以及android的逆向,但是到了ios中发现学起来还是有许多疑问,也多亏发现了IOSRE这个社区,通过一些前辈和朋友的经验,也快速建立了一个IOS逆向的逻辑

抱着学习的目的,正在做tiktok的逆向学习,首先对tiktok砸壳以及头文件导出,惊喜的发现有2万多头文件, :joy: 这实在太多了

操作步骤:
接下来通过工具抓包,分析TikTok的协议

发现了下面这个有意思的链接,开始分析


https://log-va.tiktokv.com/service/2/device_register/?device_id=7045140610143045126&is_activated=1&aid=1233&tt_data=a&residence=CN&device_id=7045140610143045126&os_version=14.4&iid=7056750119333529350&app_name=musical_ly&locale=zh-Hans&ac=WIFI&sys_region=US&js_sdk_version=1.77.0.2&version_code=21.1.0&channel=App%20Store&op_region=US&tma_jssdk_version=1.77.0.2&os_api=18&idfa=7E5D5F01-FB0C-4EF1-BD55-577702F5C4D4&idfv=7E5D5F01-FB0C-4EF1-BD55-577702F5C4D4&device_platform=iphone&device_type=iPhone13,4&openudid=d1ee6abb2b2451505a6012d88632ed978fd142ec&account_region=&tz_name=Asia/Shanghai&tz_offset=28800&app_language=zh&carrier_region=US&current_region=PL&aid=1233&mcc_mnc=26001&screen_width=1284&content_language=&build_number=211023&language=zh&cdid=34629298-77BE-4CF0-818E-CED343196E46&uoo=1&app_version=21.1.0

Request:


POST /service/2/device_register/?device_id=7045140610143045126&is_activated=1&aid=1233&tt_data=a&residence=CN&device_id=7045140610143045126&os_version=14.4&iid=7056750119333529350&app_name=musical_ly&locale=zh-Hans&ac=WIFI&sys_region=US&js_sdk_version=1.77.0.2&version_code=21.1.0&channel=App%20Store&op_region=US&tma_jssdk_version=1.77.0.2&os_api=18&idfa=7E5D5F01-FB0C-4EF1-BD55-577702F5C4D4&idfv=7E5D5F01-FB0C-4EF1-BD55-577702F5C4D4&device_platform=iphone&device_type=iPhone13,4&openudid=d1ee6abb2b2451505a6012d88632ed978fd142ec&account_region=&tz_name=Asia/Shanghai&tz_offset=28800&app_language=zh&carrier_region=US&current_region=PL&aid=1233&mcc_mnc=26001&screen_width=1284&content_language=&build_number=211023&language=zh&cdid=34629298-77BE-4CF0-818E-CED343196E46&uoo=1&app_version=21.1.0 HTTP/1.1

Host: log-va.tiktokv.com

Connection: keep-alive

Content-Length: 854

aid: 1233

X-SS-Cookie: msToken=MEZeHnnHvf0JB6ImvyUDHjSrs8hqC7-7Pd3XtkS__OsW6FPPJF_1xzgtPxFgAg0QMqFklXs3eJP5Myj8WLAHQuiKXw==; install_id=7056750119333529350; ttreq=1$531e073446baf1b2848aeb9ddcb22ba858b6d5cb; reg-store-region=US; store-country-code=tw; store-idc=useast2a; passport_csrf_token=985d5bc65bb7713fa98382742fac54c6; passport_csrf_token_default=985d5bc65bb7713fa98382742fac54c6; odin_tt=078823e42b2a1bce6f4b4e23760c622030ea2ed0402aa7e8cb58a4bfc1e3ee4ceaa730016ec9ef69950eb911f163d6662a2e02122fbaa079f54c7e4888e02d5a3e6fec3251743cf8085fcdf6d9cd7fa2

sdk-version: 2

Content-Type: application/octet-stream;tt-data=a

User-Agent: TikTok 21.1.0 rv:211023 (iPhone; iOS 14.4; zh_CN) Cronet

x-vc-bdturing-sdk-version: 2.2.0-rc.3

tt-request-time: 1644301413065

Cookie: odin_tt=078823e42b2a1bce6f4b4e23760c622030ea2ed0402aa7e8cb58a4bfc1e3ee4ceaa730016ec9ef69950eb911f163d6662a2e02122fbaa079f54c7e4888e02d5a3e6fec3251743cf8085fcdf6d9cd7fa2; passport_csrf_token=985d5bc65bb7713fa98382742fac54c6; passport_csrf_token_default=985d5bc65bb7713fa98382742fac54c6; store-country-code=tw; store-idc=useast2a; reg-store-region=US; install_id=7056750119333529350; ttreq=1$531e073446baf1b2848aeb9ddcb22ba858b6d5cb; msToken=MEZeHnnHvf0JB6ImvyUDHjSrs8hqC7-7Pd3XtkS__OsW6FPPJF_1xzgtPxFgAg0QMqFklXs3eJP5Myj8WLAHQuiKXw==

x-tt-dm-status: login=0;ct=1

passport-sdk-version: 5.12.1

Accept: application/json

x-tt-request-tag: t=0;n=0

X-SS-STUB: 5962F29A40C61D1AA45829C7A0DC8D97

x-tt-store-idc: useast2a

x-tt-store-region: tw

x-tt-trace-id: 00-d8006c481061c55e0ee44146061d04d1-d8006c481061c55e-01

Accept-Encoding: gzip, deflate

X-Ladon: WMYLWIKVfVJoynmaflD+ErdjdjYWar8WPv6kAGln4W8ZCB56

X-Khronos: 1644301413

X-Argus: ajILHYxQJT7Qhmj3MtwpWYoup7b6oa6RPRClaNOYkxxxUp5QVv31jCYtVerkIT6uDZ7HENSDgIQKcJVtJm+T+HBhKh9Mdvd8v3iu0m/vfBL4bP2rlfFwd2quaADLiHxWwAlGAFmtwqvYRiI02buymqUHstw8NhP5UcCJsDhoxNjSgP23r9eIgOKKyoCivRZgtRQ8A1C9MbpppWV8zSa+XY239N57kOIrC5LqWNIB1Qq/Iw==

X-Gorgon: 840400870000d382dcd5bcb8c896adce30d1756065e1fd92385e

Response


{

"server_time": 1644301416,

"device_id": 7045140610143045126,

"install_id": 7056750119333529350,

"device_id_str": "7045140610143045126",

"install_id_str": "7056750119333529350",

"new_user": 0

}

通过上面的链接,请求与返回,以及接口名称来说,这个接口应该是进行设备注册,当打开TikTok之后就会给你的设备进行一个标记并且发送给TikTok的服务端

那么我的学习目标就是通过逆向,获取到组成这个链接的参数的方法,以及一些协议头的加密方法.

目前正在找device_id的生成方法

device_id=7045140610143045126

根据我的理解,首先先要拿到关于这个deviceid这个变量的方法,但是我从头文件中发现包含这个deviceid方法的文件大概有8000左右,随便挑选了几个进行hook 使用frida-trace和cycript进行跟踪调试,发现并不是想要的结果.

于是我产生了一个思路就是,我能否实时监测tiktok从启动开始,在内存中变量的值,当发现这个值出现得时候像frida-trace一样返回他的方法名与类名

我尝试了很多工具基本上都是只能在知道类名和方法名或者模糊情况下,一点点的筛选,并没有这样的工具,所以我正打算尝试看看是否能够通过 结合 frida-trace或者cycript这样的工具 ,写一个上面思路那样的小工具

只是不知道我这个思路是否有问题,又或者有前辈和朋友有更好的经验来解决这个问题,因为我本身也才接触不久,所以很希望能够得到你们的指点。如果可以那将会是我的荣幸!

1 个赞

我从来没有逆向过任何字节系的App, 所以我很可能错的离谱。

但对于你的需求, 我的思路是:

  • 这玩意是请求的参数, 那么封装好的下面的网络库里肯定有个函数负责set这个参数, 类似字典的set操作
  • 我能不能通过特征匹配开源网络库的方式找到TikTok App使用的网络库对应功能的函数地址
  • Hook相关函数
4 个赞

感谢你的回复,你的思路逻辑上来说可以节省不少时间,但是往上推到的过程所需要耗费的精力以及遇到的问题,我只能在尝试之后在分享了,不过我会尝试的,谢谢你的思路

device_id是设备指纹,服务端生成的,不用在客户端找了。

1 个赞

内存监测,那是 遍历内存…
少量内存遍历,很快的,多了的话…直接卡成翔。可以参考ce <前人大做>

回头说下,你需要监测的东西,可能存在哪里?
1:堆里,通过malloc 或者 rmalloc…new 等 分配的内存…
2,栈中…随时要扫描 栈里的信息…

然后就是出发点了,也就是切入点…是谁来做这个监测的事情?
代码?那就需要一直遍历那些内存
cpu?那么需要cpu每执行一句汇编代码,就检测一次…

然后来考虑下,内存断点,硬件断点的原理…
调试器,能下内存断点,也能下硬件断点,那么内存断点怎么实现的,硬件断点又怎样实现的呢?

找了下内存断点的原理:

内存读写断点的实现,是把相关内存页属性设置为PAGE_NOACCESS,这样当此页内内存被读写的时候会有异常传给调试器。

当异常传给调试器时候,debugee进程被挂起,调试器把内存页属性重新修改回去,同时设置一个单步调试断点。这样debugee进程才可以正常执行过去,否则会一直被挂起。因为被设置了单步调试断点,所以执行一个指令就再次挂起,交给调试器去处理。

这时候调试器把页面属性重新修改为PAGE_NOACCESS就可以了。

硬件断点

X86系统提供8个调试寄存器(DR0~DR7)和2个MSR用于硬件调试。其中前四个DR0~DR3是硬件断点寄存器,可以放入内存地址或者IO地址,还可以设置为执行、修改等条件。CPU在执行的到这里并满足条件会自动停下来。

硬件断点十分强大,但缺点是只有四个,这也是为什么所有调试器的硬件断点只能设置4个原因。我们在调试不能修改的ROM时,只能选择这个,所以要省着点用,在一般情况下还是尽量选择软件断点。

总之,先需要调试器挂上,然后呢,特别消耗资源。 iOS上差别应该不太大,毕竟都是cpu在干活

2 个赞

看了你的回答之后,我重新进行了获取了一次协议,并且多次的排查了之后,我也认为是服务器生成并返回的,但就像我发在上面的链接。是我所抓包的全部数据中,第一次出现服务器返回数据中携带deviceid这个值的响应链接与返回值内容,我的疑问在于这个post请求目前来看是第一次返回deviceid。但却在请求的url 参数中已经携带了deviceid。所以按照你的说法,我的理解可能是我的抓包数据是不完整,或者他从服务器返回这个deviceid的数据并非json 而是加盐加密的字节数据。需要通过获取客户端的解密方法 才能看到的。我会尝试寻找一下

十分感谢你能够回复

是的,大量的内存遍历确实会造成卡顿并且在frida中进行内存扫描都会出现,我今天尝试用自己的思路去做的时候出现了闪退崩溃的情况,硬件断点,我不是很了解,通过你的回答我也相应地学习了一下,十分感谢:pray:

设备指纹是加密返回的(也有可能隐写在图片里),搜不到明文。
另外有些请求不是用的http和https,可能是用的socket或者自研协议,你用http的抓包工具是抓不到的。

1 个赞

嗯,我确实看到有的协议是通过其他请求方式,还没有来得及去研究那几个,目前看来并不是在图片里返回,我已经找到了他的参数组成,还是相当感谢你的提醒

是由本地计算出来值,然后提交到服务器,服务器运算后返回的。
中间还会有好几次交互。

1 个赞

是的,这位兄弟一看就是学习过 :grin:

楼主你好,我刚开始学习逆向,想问下您是如何抓包到tiktokv.com的呢?我现在发现用charles抓包tiktokv.com,都显示unknown,其他的https请求是正常的

SSL Pinning

1 个赞

我要怎么搜索教程呢?可以再请教一下吗?

这是技术方向的关键词, 字节用的是自己的实现, 论坛里有别人造好的轮子

1 个赞