java字节码确定性指令

时间:2014-03-26 16:20:20

标签: java bytecode instructions deterministic

我需要自动查找java字节码中执行的所有指令。 伪代码中的模拟示例:

x=a; //will be executed for sure
y=b; //will be executed for sure
if(x>y) //will be executed for sure
 x++; //might not be executed
else
 y++; //might not be executed
k=4; //will be executed for sure

一种可能的解决方案可能是创建控制流图和 找到一条确定性的道路。 (图论?) 根据例子:

x=a;
y=b;
if(x>y)
 |   \
 |    \
x++;  y++;
 |    /
 |   /
k=4;

您是否知道如何找到此任务的解决方案?

1 个答案:

答案 0 :(得分:1)

更新:既然已经显示了提问者的实际问题,请点击此处更新的答案。

首先,不需要确定总是执行"的指令。如果你看一下这篇论文,它指的是当用一个特定的输入执行程序时的指令跟踪。要查找指令,只需使用该输入执行程序并记录执行哪些指令(当然这假定程序纯粹是功能性的,是本文中的许多问题之一)。

但是,最重要的问题是为什么要实现这一点。根据我对论文的理解,这不是一个非常有用或有趣的混淆+水印技术。而用Java实现它只会让它变得更糟。

如果你只是为了好玩而实现它,那么就把自己搞得一团糟,但如果你只是想要一个Java水印工具,我会看看像Sandmark这样的现有项目。

原始回答

没有保证执行的指令,因为Thread.stop()可以在任何时候停止执行。

为了进行有意义的分析,您必须忽略某些类型的错误。例如,Krakatau忽略了Thread.stop以及大多数VirtualMachineErrors的可能性。

此时,只需遵循控制流程即可。我不确定你的问题是什么。如果你解释一下你想要完成什么以及项目要求是什么,我可能会建议一个工具。

编辑:如果您试图找到所有在运行时保证由程序执行的指令,而不是静态分析保证,那当然是一个棘手的问题。事实上,它是不可抗拒的。而且我不确定这个用例是什么。