1. trace汇编数量
分类:unidbg
String traceFile = "yourpath"; PrintStream traceStream = new PrintStream(new FileOutputStream(traceFile), true); emulator.traceCode(module.base, module.base+module.size).setRedirect(traceStream);
- 使用Unidbg做算法还原前,先traceCode看一下对手多少行汇编是一个不错的选择;
2. 补系统相关
分类:unidbg
android/os/SystemProperties->get(Ljava/lang/String;)Ljava/lang/String; adb shell getprop 属性名 即可; 比如 adb shell getprop ro.build.id
3. AES魔改点
- 分类:密码学
- AES 的魔改主要集中两大部分,1是密钥编排部分,主要形式有两种,一是修改密钥编排算法中i=4时的流程,二是修改轮密钥的使用顺序;2是主体运算部分,包括修改S盒、加解密流程颠倒等形式。对AES 的魔改其实并不多,主体运算部分很多开发人员不敢动,怕影响算法的安全性,密钥编排部分修改起来就随意多了,比如小红书的魔改AES就是此列,修改了Rcon。
4. Socket 抓包
- 分类:抓包
- 当我们在使用Charles进行抓包的时候,会发现针对某些IP的数据传输一直显示CONNECT,无法Complete,显示Sending request body,并且数据包大小持续增长,这时候说明我们遇到了Socket端口通信;
5. 获取linker首地址
分类:工具
// 干净卫生的 获得linker起始地址的代码 char line[1024]; int *start; int *end; int n = 1; FILE *fp = fopen("/proc/self/maps", "r"); while (fgets(line, sizeof(line), fp)) { if (strstr(line, "linker64")) { __android_log_print(6, "r0ysue", "%s", line); if (n == 1) { start = reinterpret_cast<int *>(strtoul(strtok(line, "-"), NULL, 16)); end = reinterpret_cast<int *>(strtoul(strtok(NULL, " "), NULL, 16)); } else { strtok(line, "-"); end = reinterpret_cast<int *>(strtoul(strtok(NULL, " "), NULL, 16)); } n++; } }
6. trace分析手段
1 搜索,4字节的直接搜,单字节的搜要注意上下文,找计算生成结果的,不要找赋值的;
2 打印一些关键函数的日志,比如memcpy;
3 traceWrite;
4 SearchData插件;
7.Unidbg典型的methodid问题
解决步骤:
1.看看JNI的上下文,对应的jmethodId是对应在哪个类的哪个方法;
2.抛异常的地方打断点,查看是哪个dvmClass;
3.补全继承关系;
8.获取so基址
static uintptr_t so_base = 0;
int callback(struct dl_phdr_info *info, size_t size, void *data) {
if (strstr(info->dlpi_name, "libnative-lib.so")) {
so_base = info->dlpi_addr;
return 1; // 停止迭代
}
return 0;
}
void hook() {
dl_iterate_phdr(callback, NULL);
if (!so_base) {
__android_log_print(6, "sanaTag", "SO not found via dl_iterate_phdr");
return;
}
// 拿到so基址
__android_log_print(6, "sanaTag", "Success! Base address: 0x%x", so_base);
*(void **) (so_base + 0x59940) = reinterpret_cast<void *>(reinterpret_cast<long>(myr1));
}
9. 白盒aes逆向思路
- 找轮
- 找时机,即具体第几轮做故障注入
- 找state
10. 常见算法特征
- CRC32:四个字节的int;
- MD5:返回结果是32位的数据,这里是十六进制的,或者是0x10大小的buffer;
- SHA1:返回结果是40位的数据,或者是0x14大小的buffer;
- SHA256:返回结果是64位的数据,或者是0x20大小的buffer;
- 对称加密:AES、DES等对称加密,模式不同结果是不同的,用的比较多的就是cbc和ecb模式,第一个有iv,第二个没有;
- XOR是一个最简单的对称算法,他会逐位和key进行异或,有时候会自己写几个xor来作为算法;
- 国密SM系列:SM4是对称算法,对标的是AES;
- 非对称加密系列:RSA、ECC,RSA特征主要是公钥和私钥,公钥加密&私钥解密;一般会把aes的key用RSA加密之后再传过去;ECC和RSA是类似的,也有公钥和私钥;
压缩算法系列:
- gzip压缩,hex特征是1f 8b 08,b64特征是H4sl;
- zlib压缩,hex特征:78 9c,还有78 01也比较常见,b64特征是:ejwr,zlib有等级的区别,这个特征是指默认的等级;
- Zip压缩,比较常见,特征是PK前缀,这里是utf8形式,16进制就是50 4b;
- 7zip,会有7z字样,16进制:37 7a;
11. unidbg固定随机数连招
大家可以在更多的 Unidbg 项目上测试这套固定结果的思路;
- 检查 JNI 补环境里是否有随机干扰,比如时间戳、UUID
- 检查 clock_gettime 和 gettimeofday 这两个系统调用
- 检查 /dev/urandom 和 getrandom
- 检查 SimpleFileIO 和 ByteArrayFileIO 的文件属性时间戳
- 检查 PID
- 应该说,绝大多数样本都可以被这套连招固定住;
12. charles证书相关
- 解决 chls.pro/ssl 无法进入问题
使用charles的xdm不知道有没有遇到这样的问题;手机上访问 chls.pro/ssl 就始终进不去了…
各种检查,ip地址、证书,ssl设置等等都正常,就是进不去; - 在一位好心人的提醒下得到了一个解决办法。那就是换一个地址
最新地址是:
charlesproxy.com/getssl
当你访问 chls.pro/ssl 进不去的时候,请尝试 charlesproxy.com/getssl
特此记录,希望帮助更多的人