我想知道是否有任何众所周知的技术来融合应用程序的代码流。在我的例子中,我想在我自己的字节码上使用它们,这些字节码是由我为项目编写的一个小vm执行的。我非常有兴趣尝试转换字节码的流程,以了解一些关于这项技术的知识。我在inet上搜索了一下,几乎找不到任何关于它的信息。
干杯。
发布于 2017-08-27 04:52:39
我在一个项目中工作(几年前),以混淆闪存ActionScript代码,以破坏反向工程的尝试,并确保游戏的安全。我们建立了一个工具,每当有人加载游戏时,它就会混淆flash。
实际的混淆是在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 99; increment替换add 100,对于其他数学运算也是如此。
然后,您可以找到条件跳转并反转条件,将跳转指向文件的末尾(遵循上面的技巧),并将必要的跳转无条件地放置为下一条指令。就像这样
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像上面这样的技巧让代码反编译者困惑了很多。你可以变得更有创造力,这实际上是因为你的虚拟机中有各种各样的指令,以及你愿意让你的混淆程序复杂化,并接受由于额外的操作而产生的代码可能会变得更慢。
希望这能有所帮助。
https://stackoverflow.com/questions/45899444
复制相似问题