提示:只需要有个印象即可。
1.1 加密技巧
1.1.1 隐藏字符串
// 显式
TreeMap map = new TreeMap();
map.put("sign", x);
// 隐式
String a = new String(new byte[]{
-26, -83, -90, -26, -78, -101, -23, -67, -112});
TreeMap map = new TreeMap();
map.put(a, x);
// hook机制,找到TreeMap中的put方法,替换成自己的某个方法
function newPut(key, value){
console.log(key, value);
}
隐藏关键字 salt
String salt = "xxssasdfasdfadsf";
提醒:MD5加密盐、AES加密key、iv
示例:
// java字节:有符号 -128 ~ 127 ,对于java中负号的字节,+256后变成python中对应的字节
// python:无符号 0 ~ 255
byte_list = [-26, -83, -90, -26, -78, -101, -23, -67, -112]
bs = bytearray() # python字节数组
for item in byte_list:
if item < 0:
item = item + 256
bs.append(item)
str_data = bs.decode('utf-8')
print(str_data)
# 类似于Java中的字节数组
data = "张三懵逼了"
data_bytes = data.encode('utf-8') # encode后变成了二进制数据
data_list = bytearray()
for item in data_bytes:
data_list.append(item)
res = data_list.decode('utf-8')
print(res)
当搜索不到关键字的位置时:
- 搜索关键字的字节数组,如
sign
的字节数组为 {-26, -83, -90, -26, -78, -101, -23, -67, -112} - 利用Hook机制,改写关键方法
如何获取sign
在Java中的字节数组是什么?
data_bytes = "sign".encode('utf-8')
data_list = []
for item in data_bytes:
if item > 127:
item = item - 256
data_list.append(item)
print(data_list)
1.1.2 uuid
抖音udid
java实现:
import java.util.UUID;
public class Hello {
public static void main(String[] args){
String uid = UUID.randomUUID().toString();
System.out.println(uid);
}
}
python实现:
import uuid
uid = str(uuid.uuid4())
print(uid)
29cd5f50-4b4c-457b-9a59-33a12e3edd10
发现uuid,可以随机生成一个进行尝试
1.第一类使用uuid
抓包发现,每次请求值不一样:d7cb3695-5105-4aaa-b0a8-8188e0977143
2.第一次运行生成UUID
- 刚开始运行:调用uuid算法生成一个值
- 写入XML文件
- 再使用
- 优先去XML文件中找
- uuid算法
此时测试:
- 清除app数据
- 必须卸载app,重新安装
3.卸载app后,重新安装,uuid还是不变,uuid可能是根据手机的指纹信息(CPU,硬盘,各种ID,各种信息)生成的,换一部手机则uuid会发生变化
4.也有写死的情况
1.1.3 随机值
抖音:openudid
java实现:
import java.math.BigInteger;
import java.security.SecureRandom;
public class Hello {
public static void main(String[] args) {
// 随机生成80位,也就是10个字节
BigInteger v4 = new BigInteger(80, new SecureRandom());
// 让字节以16进制展示
String res = v4.toString(16);
System.out.println(res); // db1224a36463085502c3
}
}
python实现:
import random
data = random.randbytes(10) # python3.9及以上版本支持
# b'\xff\xe0\xe8\xa6\x03\xb2\x1e\xbb\xf1{'
print([item for item in data])
# [54, 184, 19, 18, 24, 40, 3, 71, 37, 85]
print([hex(item) for item in data]