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));
}
[热词系列_张三]