去混淆-不透明谓词

所谓不透明谓词,就是代码的编写者知道是真是假是什么,但是攻击者难以从字面获悉,最典型的就是导致IDA无法识别,因而出现一大堆垃圾代码,一连串分支

比如:

if ((x * x + x) % 2 == 0) {
    ...
}
else {
    ...
}

对于公式x平方加x,等价于(x+1)*x,偶数乘奇数等于偶数,所以该判断必然成立,所以else分支永远不会走。

今天找了一个样本,简单记录一下去混淆的方法:

先IDA打开样本,发现没有JNI_Onload,猜测应该是在init_array中解密,去init_array中看看

进去后发现,所有的函数中都有一些分支在影响判断:

分析发现这些分支的判断条件都源于一些变量,这些变量的地址在bss段

bss段是在程序中用于存储未初始化的全局变量和静态变量的内存区域。它是静态内存分配的一部分,通常在程序开始执行之前会被自动清零,而通过查找引用发现这部分内存始终未被赋值,这意味着他将永远为0,((0 - 1)* 0&1)!= 0 && 0 > 9 结果为false, 所以这些分支的走向其实是固定的。

但是由于bss段是可读写的,要想让IDA将其识别为0,且能重新分析优化,要做两件事:1 修改这一段内存的属性为只读  2 修改内存值为0

通过脚本来修改:

看一下效果:

无用分支都被优化掉了

相关推荐

  1. html css背景图片透明文字透明

    2024-01-24 15:02:01       37 阅读
  2. css实现鼠标放上透明光片划过效果

    2024-01-24 15:02:01       16 阅读
  3. QT 设置窗口透明度

    2024-01-24 15:02:01       12 阅读
  4. HIVE:谓词下推

    2024-01-24 15:02:01       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-24 15:02:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-24 15:02:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-24 15:02:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-24 15:02:01       20 阅读

热门阅读

  1. 进制转换(C++)(简易)(字符串)

    2024-01-24 15:02:01       33 阅读
  2. 旅游MR混合现实情景实训教学系统教学

    2024-01-24 15:02:01       37 阅读
  3. Redis的持久化!!!

    2024-01-24 15:02:01       30 阅读
  4. Relay Arm® 计算库集成

    2024-01-24 15:02:01       29 阅读
  5. 【Qt+SQLite使用】

    2024-01-24 15:02:01       44 阅读
  6. leetcode - 527. Word Abbreviation

    2024-01-24 15:02:01       33 阅读
  7. Spring/Spring boot项目接入traceId

    2024-01-24 15:02:01       29 阅读
  8. C Primer Plus(第六版)13.11 编程练习 第11题

    2024-01-24 15:02:01       30 阅读
  9. Vue学习笔记11--路由2(路由传参/命名路由)

    2024-01-24 15:02:01       29 阅读