Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
SiMBA — 高效反混淆线性混合布尔算术表达式 | Kitploit
工具/GitHubGitHub/denuvosoftwaresolutions/simba
静态分析逆向工程密码学二进制分析论文与研究学习与教育
GitHubdenuvosoftwaresolutions/simba

SiMBA

高效反混淆线性混合布尔算术表达式

查看仓库
1891923年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SiMBA

SiMBA 是一个用于简化线性混合布尔算术表达式(MBA)的工具。与 MBA-Blast 和 MBA-Solver 类似,它采用完全代数方法,基于线性 MBA 由其在全零和全一集合上的值完全确定的思路,但利用新的见解,即不需要转换到 1 位空间。

它基于以下论文:

root@kitploit:~
@inproceedings{simba2022,
    author = {Reichenwallner, Benjamin and Meerwald-Stadler, Peter},
    title = {Efficient deobfuscation of linear mixed Boolean-arithmetic expressions},
    year = {2022},
    month = nov,
    address = {Los Angeles, CA, USA},
    date = {November 7 - 11, 2022},
    booktitle = {Proceedings of the CheckMATE 2022 workshop, co-located with the ACM Conference on Computer and Communication Security, CCS'22},
    pages = {19--28},
    doi = {10.1145/3560831.3564256},
    publisher = {ACM},
    howpublished = {\url{https://arxiv.org/abs/2209.06335}}
}

获取演示文稿的幻灯片和视频录像。也可通过 ACM 获取。

内容

提供了两个主要程序(Python 3):

  • simplify.py 用于简化单个线性 MBA
  • simplify_dataset.py 用于简化文件中包含的一组线性 MBA,并通过与文件中也包含的相应更简单表达式进行比较来验证它们

此外,程序 check_linear_mba.py 可用于检查表达式是否表示线性 MBA。

用法

简化单个表达式

为了简化单个表达式 expr,使用

root@kitploit:~
python3 src/simplify.py "expr"

或者,可以一次性简化多个表达式,例如:

root@kitploit:~
python3 src/simplify.py "x+x" "a&a"

实际上,每个不是选项的命令行参数都被视为要简化的表达式。请注意,省略引号可能导致意外行为。简化结果打印到命令行,如下所示:

root@kitploit:~
*** Expression x+x
*** ... simplified to 2*x
*** Expression a
*** ... simplified to a

默认情况下,不检查输入表达式是否为线性 MBA。可以通过选项 -l 可选地启用此检查:

root@kitploit:~
python3 src/simplify.py "x*x" -l

由于 $x*x$ 不是线性 MBA,在这种情况下会显示以下输出:

root@kitploit:~
*** Expression x*x
Error: Input expression may be no linear MBA: x*x

如果使用选项 -z,则简化结果将与原始表达式通过 Z3 进行等价验证。只要算法正确且输入表达式是线性 MBA,命令行输出不受影响:

root@kitploit:~
python3 src/simplify.py "x*x" -z

这将触发以下错误:

root@kitploit:~
*** Expression x*x
Error in simplification! Simplified expression is not equivalent to original one!

由于 SiMBA 输出表达式中出现的常量始终是非负的,它们可能取决于常量和变量使用的位数。该位数默认值为 $64$,可以通过选项 -b 设置:

root@kitploit:~
python3 src/simplify.py "-x" -b 32

对于 $b$ 位,输出中出现的常量始终介于 $0$ 和 $2^b-1$ 之间。因此上面的调用将产生以下输出:

root@kitploit:~
*** Expression -x
*** ... simplified to 4294967295*x

简化并验证文件中的表达式

为了简化存储在路径 path_to_file 的文件中的表达式,使用

root@kitploit:~
python3 src/simplify_dataset.py -f path_to_file

即,必须使用选项 -f 指定文件。文件的每一行必须包含一个复杂表达式以及一个等价的更简单表达式,用逗号分隔,例如:

example-expressions.txt:

root@kitploit:~
(x&y)+(x|y), x+y
(x|y)-(~x&y)-(x&~y), x&y
-(a|~b)+(~b)+(a&~b)+b, a^b
2*(s&~t)+2*(s^t)-(s|t)+2*~(s^t)-~t-~(s&t), s

对于每一行,复杂表达式和简单表达式都会被简化,最后进行比较。简化后者的目的是使验证结果独立于空白、因子或加数的顺序等。

与 simplify.py 类似,可以使用选项 -l 和 -z 分别启用线性检查和正确简化检查,并且可以使用选项 -b 指定位数。如果只想在指定文件中运行 SiMBA 处理一定最大数量的表达式,可以通过选项 -r 指定该最大数量:

root@kitploit:~
python3 src/simplify_dataset.py -f some_file.txt -r 2

如果 some_file.txt 包含上面列出的表达式,则只会简化前两个:

root@kitploit:~
Simplify expressions from data/some_file.txt ...
  * total count: 2
  * verified: 2
  * equal: 2
  * average duration: 0.00014788552653044462

在任何情况下,输出都会提供以下信息:

  • 输入中表达式的总数,
  • 简化后能够通过 Z3 验证与对应简单表达式等价的表达式数量(除非简化结果已经具有完全相同的字符串表示),
  • 简化结果与对应简单表达式完全相同的表达式数量,
  • 平均运行时间(秒)。

请注意,使用 Z3 对正确简化进行可选验证会增加运行时间,而对于由复杂表达式和简单表达式组成的对,比较它们的简化结果则不会增加运行时间。

默认情况下不打印简化结果,仅显示这些统计数据。如果需要前者信息,可以使用选项 -v:

root@kitploit:~
python3 src/simplify_dataset.py -f some_file.txt -v

然后将显示以下输出:

root@kitploit:~
Simplify expressions from data/some_file.txt ...

    *** 1 groundtruth x+y, simplified x+y => equal: True, verified: True
    *** 2 groundtruth x&y, simplified x&y => equal: True, verified: True
    *** 3 groundtruth a^b, simplified a^b => equal: True, verified: True
    *** 4 groundtruth s, simplified s => equal: True, verified: True

  * total count: 4
  * verified: 4
  * equal: 4
  * average duration: 0.00016793253598734736

另一个选项 -e 提供了将所有表达式的输出通过仿射函数 $f(x)=ax+b$ 进行编码的可能性,其中 $a,b$ 是介于 $1$ 和 $2^b-1$ 之间的随机整数($b$ 为位数):

root@kitploit:~
python3 src/simplify_dataset.py -f some_file.txt -v -e

当然,同一函数应用于同一行中的一对表达式。这将产生类似于以下的输出:

root@kitploit:~
Simplify expressions from data/some_file.txt ...

    *** 1 groundtruth 10623056950310032687+5038261596809828791*x+5038261596809828791*y, simplified 10623056950310032687+5038261596809828791*x+5038261596809828791*y => equal: True, verified: True
    *** 2 groundtruth 15181401701264988765+3962868592131193124*(x&y), simplified 15181401701264988765+3962868592131193124*(x&y) => equal: True, verified: True
    *** 3 groundtruth 6812440940417974076+11894131080657788315*(a^b), simplified 6812440940417974076+11894131080657788315*(a^b) => equal: True, verified: True
    *** 4 groundtruth 4558303267887122851+10271005790757592209*s, simplified 4558303267887122851+10271005790757592209*s => equal: True, verified: True

  * total count: 4
  * verified: 4
  * equal: 4
  * average duration: 0.00019435951253399253

可复现性

为了重现论文中所述的部分实验,可以使用 data/ 目录中包含的任何数据集文件。对于以下每个函数 $e_1,\ldots, e_5$,提供了使用 $2$、$3$ 或 $4$ 个变量的 $1,000$ 个等价线性 MBA 的数据集:

  • $e_1(x,y) = x+y$
  • $e_2 = 49,374$
  • $e_3(x) = 3,735,936,685, x + 49,374$
  • $e_4(x,y) = 3,735,936,685, (x\mathbin{^\wedge}y) + 49,374$
  • $e_5(x) = 3,735,936,685\cdot \mathord{\sim} x$

对于 $e_1$,额外提供了 $5$ 到 $7$ 个变量的数据集。这些 MBA 是使用基于 Zhou 等人 2007 年描述的方法的算法生成的,并在论文中有所描述。

请注意,这些数据集是针对 $b=64$ 位生成的。对于不同的位数,不能保证它们与 $e_i$ 的等价性。

为了重现其他实验,我们分别参考 MBA-Solver 仓库 和 NeuReduce 仓库 提供的数据集。

检查线性度

文件 check_linear_mba.py 被简化器使用,但它也提供自己的接口,例如:

root@kitploit:~
python3 src/check_linear_mba.py "x+x" "x*x"

它检查所有通过命令行参数传递的表达式。在这种情况下,会产生以下输出:

root@kitploit:~
*** Expression x+x
*** +++ valid
*** Expression x*x
*** --- not valid

MBA 的格式

变量数量理论上无限制,但运行时间随变量数量增加而增加。变量命名没有严格的限制。它们必须以字母开头,可以包含字母、数字和下划线。例如,以下变量名都是有效的:

  • $a$, $b$, $c$, ..., $x$, $y$, $z$, ...
  • $v0$, $v1$, $v2$, ...
  • $v_0$, $v_1$, $v_2$, ...
  • $X0$, $X1$, $X2$, ...
  • $var0$, $var1$, $var2$, ...
  • $var1a$, $var1b$, $var1c$, ...
  • ...

支持以下运算符,按 Python 中的优先级顺序排列:

  • $\mathord{\sim}$, $-$:按位非和一元减号
  • $*$:乘法
  • $+$, $-$:加法和减法
  • &:合取
  • $\mathbin{^\wedge}$:异或
  • $|$:析取

输入表达式中可以使用空白。例如,表达式 "x+y" 也可以写为 "x + y"。

请尊重运算符的优先级,必要时使用括号!例如,表达式 $1 + (x|y)$ 和 $1 + x|y$ 不等价,因为 $+$ 的优先级高于 $|$。注意,后者甚至不是线性 MBA。

依赖项

SMT 求解器 Z3 是必需的:

  • 由 simplify_dataset.py 使用,用于验证简化后的表达式与对应的简单表达式等价;
  • 如果使用简化表达式的可选验证,则由 simplify.py 使用。如果未使用此选项,即使未安装 Z3 也不会抛出错误。

安装 Z3:

  • 从 Github 仓库:https://github.com/Z3Prover/z3,或
  • 在 Debian 上:sudo apt-get install python3-z3

许可

版权所有 (c) 2022 Denuvo GmbH,基于 GPLv3 发布。

联系方式

  • Benjamin Reichenwallner: benjamin(dot)reichenwallner(at)denuvo(dot)com
  • Peter Meerwald-Stadler: peter(dot)meerwald(at)denuvo(dot)com
下载工具