【Soot学习记录1】新Class文件的生成及错误处理
来源:互联网 发布:nginx lua header 编辑:程序博客网 时间:2024/05/22 06:16
在刚开始,我们总是发现生成的class文件无法正常使用,运行时会报错,这其中的一个原因就是未在class文件中添加构造函数。
生成流程
- 新建SootClass实例
- 完成SootClass的内容
- 将SootClass添加至Scene中
- 使用PackManager.v().writeClass(sootClass)来完成class文件的生成
问题解决
由于平时写Java代码时,编译器会自动为每个类提供一个默认构造函数,但是当接触到bytecode等底层的代码时,这个构造函数是必须手动添加的。
//创建Class文件 //以android开发为例,我们需要创建一个新的Activity类及其class文件 //activityName:新Activity类名 private SootClass createNewActivityClassFile(String activityName) { //如果已经存在该类,则不再创建 if(Scene.v().containsClass(activityName)) { return Scene.v().getSootClass(activityName); } // Resolve dependencies Scene.v().loadClassAndSupport("android.app.Activity"); Scene.v().loadClassAndSupport("android.os.Bundle"); Scene.v().loadClassAndSupport("android.content.Intent"); SootClass sClass; SootMethod method; sClass = new SootClass(activityName, Modifier.PUBLIC); sClass.setSuperclass(Scene.v().getSootClass("android.app.Activity")); Scene.v().addClass(sClass); createConstrutor(sClass);//添加构造函数,如果没有这一步,那么运行调用这个类时将会报错 createOnCreateMethod(sClass);//添加onCreate函数,或者其它自定义的函数 PackManager.v().writeClass(sClass); return sClass; }
private void createConstrutor(SootClass sClass) { SootMethod method = new SootMethod("<init>", Arrays.asList(new Type[] {}), VoidType.v(), Modifier.PUBLIC); sClass.addMethod(method); //添加body JimpleBody body = Jimple.v().newBody(method); method.setActiveBody(body); Chain<Unit> units = body.getUnits(); //添加this local Local thisLocal = Jimple.v().newLocal("this", sClass.getType()); body.getLocals().add(thisLocal); units.add(Jimple.v().newIdentityStmt(thisLocal, Jimple.v().newThisRef(sClass.getType()))); //调用init SootMethod oncreateMethod = Scene.v().getMethod("<android.app.Activity: void <init>()>"); SpecialInvokeExpr sie = Jimple.v().newSpecialInvokeExpr(thisLocal, oncreateMethod.makeRef()); units.add(Jimple.v().newInvokeStmt(sie)); // insert "return" units.add(Jimple.v().newReturnVoidStmt()); }
0 0
- 【Soot学习记录1】新Class文件的生成及错误处理
- Soot 学习笔记 5:使用 Soot 创建 Java class
- Soot学习笔记(1)
- SOOT学习【1】
- 学习Soot - 1
- Soot学习笔记3.使用soot解析java文件
- [Soot学习笔记][5]Soot依赖的两个框架
- Soot 学习笔记 4:Soot 的 pack 和 phase
- Soot 学习笔记 6:一些 Soot 重要的类
- Soot 学习笔记 1:First Step 命令行执行 soot
- [Soot学习笔记][3]通过Soot API生成Hello World程序
- jvm学习记录--08 Class文件结构
- Soot学习(1) --- 下载和导入项目
- soot-1
- 使用SOOT命令行对APK文件进行解码及包装
- 证书生成、应用及常见错误处理
- Infopath表单打不开的处理及如何生成CAB文件
- soot基础 -- soot 中的处理阶段
- 带着梦想,一路前行
- Tomcat 并发一些问题
- 【视频信号】为何视频信号种类如此的多?
- 用JS关闭带框架的窗口(转自百度知道)
- URAL 1009 K-based Numbers (DFS)
- 【Soot学习记录1】新Class文件的生成及错误处理
- LeetCode -- Binary Tree Level Order Traversal
- caffe安装系列——安装GCC4.7和G++4.7并降级
- CoreData 概述
- Scala教程(六)类、属性和对象字段
- LeetCode -- Course Schedule II
- Xcode7.0提交二进制文件到AppStore时遇到 ITMS-90535 错误
- 使用AsyncTask异步更新UI界面(加载网络图片)
- Xcode事件十问