【问题标题】:java bytecode deterministic instructionsjava字节码确定性指令
【发布时间】:2014-05-05 05:13:27
【问题描述】:

我需要自动找到所有确定执行的 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;

您知道如何找到解决此任务的方法吗?

【问题讨论】:

  • 这感觉有点像XY problem。您试图解决的根本问题是什么?
  • 您的意思是无条件的而非确定性的。在没有线程的情况下,字节码的执行已经是确定性的了。
  • 我不认为这是一个 XY 问题,因为它确实是我必须执行的任务的要求,以保证执行。我在 Antimonys 帖子的回答中对此进行了更详细的解释。

标签: java bytecode instructions deterministic


【解决方案1】:

更新:既然提问者的实际问题已经暴露,这是我的更新答案。

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

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

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

原答案

没有保证会执行的指令,因为Thread.stop() 可以随时停止执行。

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

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

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

【讨论】:

  • 感谢到目前为止的答案,我应该在开始的帖子中更详细地解释它。我现在就试试。
  • 我现在试试:要分析的程序得到一个特定的输入,例如1,2 和 3。现在我必须调试程序采用的路径(一组函数 F)并保存该组。对于我的任务,我现在必须找到保证在该函数中执行的指令。为什么我需要那个?因为我必须操纵跳转指令,但我必须确保它们被接受。
  • @user - 问题在于它通常是不可判定的。如果您想了解实际使用的技术,请查看符号执行和 SMT。这是一个活跃的研究领域。如果您解释为什么要操作跳转指令,也许我可以告诉您更好的方法。您要解决的实际问题是什么?
  • 好的,我必须在java中实现一个软件水印技术。 Link to the technique.(检查“Java 字节码扩展”)并且“由于算法要求分支位于确定性路径上”,我需要找到可以确定执行的指令。对于“确定性路径”,我无法想象其他任何事情,而且它也有点符合背后的逻辑。
  • @user 看到你应该从这么说开始。这就是为什么 XY 问题不好的原因。
猜你喜欢
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多