逆向分析某App TCP私有协议并实现数据的批量抓取

1.前言

步骤:分析Android全局Java obfuscator,分析TCP私有协议,编写socket脚本实现数据抓取

分析的app在这里

https://wwo.lanzouy.com/ifKPbytn9mh    密码:fhj0

本次分析过程仅限于学习使用,请勿用于非法用途,若读者用于非法用途其造成的一切后果与本人无关

博客所写的所有算法还原均已开源在GitHub,地址

https://github.com/YotaGit/AlgorithmRestore

2.app分析

使用iptables去屏蔽相关IP使其强制走HTTP请求行不通,每一个房间都有其独立的IP,且如果全部IP都走不通的话会直接没有数据显示

2-1 各类检测

该app抓包遇到了和上一篇同样的问题 逆向分析某App其Frida、Xposed、Root检测及protobuf数据解析

后面仔细看了下是appsflyer这一家安全公司出的产品在作怪
公司还是很贴心地告诉了我们需要学习的所有hook技术
《逆向分析某App TCP私有协议并实现数据的批量抓取》

2-2 全局 Java obfuscator

全局代码变量名混淆,看多了就白内障,代码会被混淆成如下图这个叼样,这个库Java obfuscator可以实现这种效果
《逆向分析某App TCP私有协议并实现数据的批量抓取》

3.数据抓包

3-1 Wireshark 抓包分析

今天我们分析的是这个接口,
《逆向分析某App TCP私有协议并实现数据的批量抓取》
这个Gryphon,好像没看过这样的协议呀,莫慌,我们追踪一下tcp流,哦这不就是一个简单的tcp请求吗,难道文章就要到此结束了,这没我们想的那么简单,我们慢慢往下分析
《逆向分析某App TCP私有协议并实现数据的批量抓取》

于是我们尝试创建一个简单的socket去发送TCP报文
《逆向分析某App TCP私有协议并实现数据的批量抓取》
结果显而易见,发送失败了,失败的原因是这个tcp被魔改了,下面我们尝试将该魔改的tcp协议还原一下

3-2定位关键代码

经过objection动态分析,定位关键的Activity
《逆向分析某App TCP私有协议并实现数据的批量抓取》
objection分析完后,结合Frida去Hook相应关键代码
最终你会定位到这里
《逆向分析某App TCP私有协议并实现数据的批量抓取》
然后经过又一轮的分析,发现

 public static byte[] I1I11Il1III1(int i, int i2, byte[] bArr) 

这个方法是加密函数

 public Map<String, byte[]> IIlIIIII1(byte[] bArr) 

这个是解密函数

4.实现代码与结果

4.1 tcp私有协议还原

def system_array_copy(array1, start_index, array2, target_index, copy_num):
    # Java System.arraycopy 改写
    for index, i in enumerate(range(target_index, target_index + copy_num)):
        array2[i] = array1[start_index + index]
        # print(array1[start_index:start_index + index].decode('unicode_escape'))
    return array2


def encode_the_string(i, i2, raw_barr):
    # encode_the_string
    bArr2 = bytearray()
    for i in range(i):
        bArr2.append(ord('0'))
    byte_array2 = ack(i, 0, ff=1)
    byte_array3 = ack(i2, 0)
    system_array_copy(byte_array2, 0, bArr2, 0, 4)
    system_array_copy(byte_array3, 0, bArr2, 4, 4)
    if raw_barr is not None and len(raw_barr) > 0:
        system_array_copy(raw_barr, 0, bArr2, 8, len(raw_barr))
    return bArr2


def decode_will_protocol_data(bArr):
    # decode_will_protocol_data
    data = bArr.split('\x11'.encode())[1].split('\x17'.encode())
    return json.loads(data[0][:data[0].find(b'}}') + 2].decode()), json.loads(
        data[1][:data[1].find(b'}}') + 2].decode())

4.2结果

结果非常的nice
《逆向分析某App TCP私有协议并实现数据的批量抓取》

4.总结

编写socket编程往往是网络爬虫比较少涉及的地方,TCP私有协议后面只会越来越难

本文是最后一篇分析Java层的文章,后续的文章将更多专注于SO层文件的分析,毕竟有了objection和GDA压根就没有写不出来的Java层hook代码

GDA自动生成Frida hook代码
《逆向分析某App TCP私有协议并实现数据的批量抓取》
而Objection 可以生成需要hook函数的模板(除了构造函数)

android hooking generate simple theFuckingClassName
    原文作者:YotaGit
    原文地址: https://blog.csdn.net/zwxlyg/article/details/122333208
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞