模拟代码流的技巧?

时间:2017-08-26 20:33:31

标签: compiler-construction flow

我想知道是否有任何众所周知的技术可以为应用程序模拟代码流。在我的情况下,我想在我自己的字节码上使用它们,这是由我为项目编写的一个小vm执行的。我非常有兴趣试图改变我的字节码流,以了解这些技术。我通过inet进行搜索,并且几乎没有关于它的信息。

干杯。

1 个答案:

答案 0 :(得分:1)

我曾在多年前的一个项目上工作,以混淆Flash ActionScript代码来破坏逆向工程和保护游戏的尝试。我们构建了一个工具,每当有人加载游戏时都会混淆闪存。

实际混淆是在VM模型上完成的,它基于您必须根据VM的特定字节码定义的以下简单模式。对我们来说,困难的部分是编写Flash格式的读写器,然后将实际的代码字节转换为带参数的字节码助记符。但是一旦你在那里,那就很容易了。

您查找特定说明,然后将其替换为不同指令的出现。例如。一些标准代码可能如下所示:

load_to_stack 100
:label_01
do_something
get_from_stack
decrement
put_to_stack
jump_if_non_zero label_01

然后,您可以做的一件事就是找到代码行jump_if_non_zero <label>后,用jump to <end of code>替换该行,并在代码末尾添加jump_if_non_zero label_01。这将导致在代码结束时出现多个条件跳转,并在其他位置进行直接跳转。

您可以执行更多操作,例如将add 100替换为add 99; increment,对其他数学操作也是如此。

然后你可以找到条件跳转并反转条件,指向跳转到文件末尾(遵循上面的技巧)并无条件地将必要的跳转作为下一条指令。像

这样的东西
jump_if_non_zero :forward
do_something
:forward

的更改
jump_if_zero :new_label_at_end
jump :forward
:additional_label
do_something
:forward
[.....]
:new_label_at_end
jump :additional_label

上面的一个技巧会让代码反编译器大大混淆。而且您可以获得更多创意,它实际上是您虚拟机中的各种指令,并且您愿意使您的混淆器复杂化并接受由于其他操作而导致生成的代码可能会慢一点。

希望这有帮助。