sana
8月8日发布 /正在检测是否收录...

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
    特此记录,希望帮助更多的人
© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消