问题标签 [soot]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
266 浏览

java - 异常处理期间的烟灰、标识 stmts 和控制流

我正在尝试在soot.

让我们反编译

我会将完整的反编译添加到问题的末尾。重要的部分是

所以这意味着如果指令 0-6 中的任何一条抛出异常,控制将被重新路由到9并且执行将像正常一样继续,astore_1对异常对象的引用存储在局部变量中。

但是,我试图在其中生成一个 try-catch 块,soot并且发现了一个实际上执行以下操作的示例:CatchWrapInstrumenter.java

根据文档,newTrap

使用给定的 Stmt 处理程序为给定的 Stmt 范围内的给定异常构造一个新的JTrap 。

所以当我们看到

我们可以猜测这本质上是在说“如果thrwCls在 , 之间的任何 stmts 中抛出类型异常sFirstNonId,则sGotoLast跳转到sCatch.

到目前为止,这符合预期。

现在,困扰我的是

是一个身份证明。

因为身份代表

是定义要使用特殊值(如参数或 this 值)预加载(在方法进入时)的局部变量的语句。

例如, l0 := @this: A 将本地 l0 定义为方法的 this。

这个标识是必要的,因为局部变量没有编号(通常这个变量是字节码级别的局部变量槽 0 中的变量。)

(烟灰纸中的第 31 页 [编号 23] )

所以——再举class A个例子——如果我要生成(简化)

有意注册

,正如我基于反编译的A.class那样,这实际上是非法的,因为t := thrownException应该是“预加载(在方法输入时)”。

然而与此同时,如果煤烟纸第 86 页 [编号 78] 上的示例值得信赖,这正是我们要做的。

这种“预加载”的概念在当时还不存在,对我来说没有多大意义,让我觉得我在控制流上可能是错误的,尽管我不知道怎么做。

有人可以在这里解释一下实际发生的事情吗?

小型 try-catch 示例的完整反编译代码:

0 投票
0 回答
141 浏览

java - 添加新 RuntimeException 的抛出

所以我试图在 soot 中插入一个 RuntimeException 并且我写了一个方法来帮助我做到这一点:

这是基于此处找到的示例。

我尝试像这样使用它:

现在的问题是......没有抛出异常。既不是这样,也不是当我newNeExpr用 a替换时newEqExpr,也不是当我完全删除 if-check 时。

那么抛出这个异常的正确方法是什么?

更新

生成的检查代码示例(如果我将newEqExpr取出newNeExprifnonnull将变为ifnull):

0 投票
2 回答
1090 浏览

java - 将 Soot 用作库时如何设置它?

我想使用 Soot 库从 *.java 文件构建 SSA。但是我发现的所有示例都使用 Soot 作为独立工具,而不是库。谁能给我一个在程序中做的例子吗?

首先,我只是想从源文件中加载我的类并打印它(TestClass.class 在目录中A/home/abdullin/workspace/test):

但是当我运行它时,我得到运行时异常Aborting: can't find classfile TestClass。如果我像他们在某些教程中所做的那样更改为,soot 会找到我的课程,但它并不完整Scene.v().getSootClass("TestClass")Scene.v().loadClassAndSupport("TestClass")它打印出类方法的签名,但找不到它们的主体,activeBody字段为空。

0 投票
1 回答
298 浏览

code-analysis - 我可以使用 JDT 生成控制流图吗?

JDT 是否提供任何 API 来生成控制流图?我使用soot生成控制流图,但是我可以使用JDT生成控制流图吗?

0 投票
1 回答
1440 浏览

java - 更改“静态最终”字段的值

假设我有一个

反汇编的字节码看起来像这样

是的,这让我很惊讶。我本来希望有一个<clinit>包含分配的方法bar,然后我可以替换它。final(当我删除修饰符时确实会发生这种情况。)

如何更改final字段的值?我要上钩什么?

0 投票
2 回答
692 浏览

soot - 无法加载 java.lang.CharSequence 错误

我尝试在 Windows 上使用 Java 版本 8 运行此命令。

java -cp soot.jar soot.Main -cp ".;C:\Program Files\Java\jre1.8.0_151\lib\rt.jar" Example_4

我不断收到:线程“主”java.lang.Error 中的异常:错误:无法加载 java.lang.CharSequence。仅当我将 System.out.print 之类的行作为我的源代码的一部分时才会发生这种情况。否则它工作正常。

源代码

0 投票
2 回答
74 浏览

java - 将所有语句从一种方法移动到另一种方法

所以我有一个方法

我现在想拆分此方法,将其主体中的所有内容提取到一个单独的方法中(以编程方式)。

IE

不过,我该怎么做呢?

天真的

不工作。如果我跑,说

我得到一个

0 投票
0 回答
147 浏览

java - JCute 执行 Concolic 测试 - 烟尘错误

我尝试使用 JCute 测试一个程序。但是,我一直收到此错误。

cd /opt/jcute/tmpjcute java -Xmx512m -Xms512m -Dcute.sequential=true cute.instrument.CuteInstrumenter -> keep-line-number -d /opt/jcute/tmpjcute/classes -x com.vladium -x cute -x lpsolve > --app MyTest1 env: LD_LIBRARY_PATH=/opt/jcute/ env: JAVA_LIB_PATH=/opt/jcute/ env: PATH=/opt/jcute/:/opt/jcute/ env: CLASSPATH=/opt/jcute/tmpjcute/类:/opt/jcute/jcute.jar:jcute.jar 常量池中的未知标记:条目 15 处的 18 线程“主”java.lang.RuntimeException 中的异常:无法加载类文件:> java.lang.reflect.AnnotatedElement

在 soot.coffi.Util.resolveFromClassFile(Util.java:78) 在 soot.CoffiClassSource.resolve(CoffiClassSource.java:37) 在 soot.SootResolver.bringToHierarchy(SootResolver.java:148) 在 soot.SootResolver.processResolveWorklist(SootResolver. java:105) 在 soot.SootResolver.resolveClass(SootResolver.java:89) 在 soot.Scene.loadClass(Scene.java:329) 在 soot.Scene.loadClassAndSupport(Scene.java:314) 在 cute.instrument.CuteInstrumenter。 main(CuteInstrumenter.java:182) 出口 1

根据此链接: https ://www.se.informatik.uni-kiel.de/en/research/science-blog/soot-tutorial

该错误是由于使用与执行以下命令不同的 java 版本编译要分析的类。

java -cp烟灰罐;soot.Main -cp classes-to-analyze ; 图书馆;-pp soot.Main主类

不幸的是,我不完全理解如何修复错误,因为我只有一个版本的 java。另外,我使用的是 GUI,所以我自己不运行命令。任何帮助表示赞赏。

0 投票
1 回答
168 浏览

java - 在 Soot 中创建的类对象的输出类文件

对于测试生成任务,我需要以.class编程方式生成文件。我正在使用 Soot 框架来生成代码。假设我已经创建了一个类Scene.v().makeSootClass("Test")并为其添加了一些方法。我现在如何将 Soot IR 结构的虚拟 Java 表示编译为实际.class文件?

文档列出了他们的命令行界面的一些输出选项,但我想通过 Java 中的 API 以编程方式执行此操作,但我找不到有关如何继续的说明。

0 投票
1 回答
61 浏览

soot - 使用 soot 检测 java 类

我正在尝试通过将字节码转换为 jimple、将代码行添加到 jimple 并将 jimple 编译回字节码来检测字节码。问题是我根本无法将 jimple 代码编译回字节码,这可能吗?