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技术
2-2 全局 Java obfuscator
全局代码变量名混淆,看多了就白内障,代码会被混淆成如下图这个叼样,这个库Java obfuscator可以实现这种效果
3.数据抓包
3-1 Wireshark 抓包分析
今天我们分析的是这个接口,
这个Gryphon,好像没看过这样的协议呀,莫慌,我们追踪一下tcp流,哦这不就是一个简单的tcp请求吗,难道文章就要到此结束了,这没我们想的那么简单,我们慢慢往下分析
于是我们尝试创建一个简单的socket去发送TCP报文
结果显而易见,发送失败了,失败的原因是这个tcp被魔改了,下面我们尝试将该魔改的tcp协议还原一下
3-2定位关键代码
经过objection动态分析,定位关键的Activity
objection分析完后,结合Frida去Hook相应关键代码
最终你会定位到这里
然后经过又一轮的分析,发现
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
4.总结
编写socket编程往往是网络爬虫比较少涉及的地方,TCP私有协议后面只会越来越难
本文是最后一篇分析Java层的文章,后续的文章将更多专注于SO层文件的分析,毕竟有了objection和GDA压根就没有写不出来的Java层hook代码
GDA自动生成Frida hook代码
而Objection 可以生成需要hook函数的模板(除了构造函数)
android hooking generate simple theFuckingClassName