反混淆:简化Python3表达式

时间:2016-10-25 00:37:00

标签: python obfuscation deobfuscation

我试图学习如何对一些不必要复杂的代码进行反混淆处理。例如,我希望能够重写这行代码:

return ('d' + chr(101) + chr(97) + chr(200 - 100)) # returns 'dead'

到:

return 'dead'

所以基本上,我需要评估py文件中的所有文字,包括评估为简单整数的复杂表达式。我如何编写这个阅读器?是否存在可以做到这一点的东西?谢谢!

1 个答案:

答案 0 :(得分:1)

你想要的是程序转换系统(PTS)。

这是一个用于将源代码解析为AST,转换树,然后从树中重新生成有效源代码的工具。有关某些背景,请参阅rewriting Python text上的我的答案。

使用PTS(我公司的)DMS Software Reengineering Toolkiit,您可以编写规则来执行常量折叠,这意味着基本上进行编译时算术。

对于您显示的示例,以下规则可以完成OP的示例:

     rule fold_subtract_naturals(n:NATURAL,m:NATURAL): sum->sum =
        " \n + \m " ->  " \subtract_naturals\(\n\,\m\) ";

     rule convert_chr_to_string(c:NATURAL): term->term =
       " chr(\c) " -> make_string_from_natural(c) ;

     rule convert_character_literal_to_string(c:CHARACTER): term->term =
       " \c " -> make_string_from_character(c) ;

     rule fold_concatenate_strings(s1:STRING, s2:STRING): sum->sum =
        " \s1 + \s2 " ->  " \concatenate_strings\(\s1\,\s2\) ";

     ruleset fold_strings = { 
          fold_subtract_naturals,
          convert_chr_to_string,
          convert_characater_to_string,
          fold_concatenate_strings };

每个单独的规则都匹配相应的语法/树。它们的编写方式只适用于文字常量。

fold_add_naturals 查找通过add操作连接的NATURAL常量对,并使用内置函数将该值替换为总和,该函数对两个值求和并生成包含总和的文字值节点。

convert_chr_to_string 将chr(c)转换为相应的字符串文字。

convert_character_to_string 将“C”转换为相应的字符串“C”。

fold_concatenate_strings 组合了两个由add运算符分隔的文字字符串。它类似于fold_add_naturals的工作方式。

subtract_naturals concatenate_strings 内置于DMS中。 convert_chr_to_string convert_character_to_string 需要在DMS的元编程语言PARLANSE中进行自定义编码,但这些例程非常简单(可能是10行)。

规则集打包了规则集,以便可以应用它们。 未显示的是打开文件,调用解析器,调用规则集转换器(应用规则直到不适用规则)的基本代码。最后一步是调用prettyprinter重新打印修改后的AST。

许多其他PTS提供类似的设施。