如何使用some在APK中创建和添加Java类?
我想使用APK来计算其回调方法的执行次数(与此类似) 为此,我想从头创建一个静态类(与此类似),它保持计数。然后将该类添加到APK,最后插入回调方法的开头,以调用该静态类的方法(类似于此) 我可以用Java应用程序做类似的事情,但不能用APK。下面是生成新SootClass并将其添加到如何使用some在APK中创建和添加Java类?,java,android,android-instrumentation,soot,Java,Android,Android Instrumentation,Soot,我想使用APK来计算其回调方法的执行次数(与此类似) 为此,我想从头创建一个静态类(与此类似),它保持计数。然后将该类添加到APK,最后插入回调方法的开头,以调用该静态类的方法(类似于此) 我可以用Java应用程序做类似的事情,但不能用APK。下面是生成新SootClass并将其添加到场景中的代码部分: SootClass staticCls = generateClass("StaticCounter"); Scene.v().addClass(staticCls); Scene.v().ad
场景中的代码部分
:
SootClass staticCls = generateClass("StaticCounter");
Scene.v().addClass(staticCls);
Scene.v().addBasicClass("StaticCounter", SootClass.SIGNATURES);
Scene.v().loadNecessaryClasses();
generateClass
是从中改编而来的。但是当我检查修改后的APK时,没有出现StaticCounter
class的迹象。此外,我安装并运行了修改后的APK,并出现以下错误:
08-21 14:15:45.936 19917 19917 E AndroidRuntime:
Caused by: java.lang.ClassNotFoundException:
Didn't find class "StaticCounter" on path:
DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/APKNAME-RdhHiJzxKyyUHh_KCi6RUA==/base.apk"],nativeLibraryDirectories=[/data/app/APKNAME-RdhHiJzxKyyUHh_KCi6RUA==/lib/x86, /system/lib]]
这只是表明生成的类不在APK内
这个问题有什么解决方案吗?您可能需要提供它所要求的依赖关系:
android {
useLibrary "org.apache.http.legacy"
}
它不会生成的原因可能是,StaticCounter
在编译时是未知的,因为它可能应该而不是从应用程序包中引用,而应用程序包并不知道它。看看这个,显然是从作者那里。。。驱动程序类可能是成功的关键:
//prefer Android APK files// -src-prec apk
Options.v().set_src_prec(Options.src_prec_apk);
//output as APK, too//-f J
Options.v().set_output_format(Options.output_format_dex);
// resolve the PrintStream and System soot-classes
Scene.v().addBasicClass("java.io.PrintStream", SootClass.SIGNATURES);
Scene.v().addBasicClass("java.lang.System", SootClass.SIGNATURES);
下面是一个完整的示例:除非您将其标记为应用程序类,否则烟尘不会发出该类。你能试试吗?我想我已经找到了为什么应用程序不知道新生成的类,这要归功于的提示。生成的类必须在APK的包中。烟尘通过查看类的签名来处理类的包。因此,StaticCounter
类必须具有如下签名
com.example.app.StaticCounter
这表示StaticCounter
在包com.example.app
中
可以使用FlowDroid中的ProcessManifest
类查找包名:
new ProcessManifest(apkPath).getPackageName();
我简化了工作代码并将其放在。它从头开始创建一个新类,并添加一个静态整型字段和一个方法,该字段表示调用静态方法的次数,该方法打印该值。然后使用转换包,应用程序中的每个方法都将调用此静态方法。谢谢。但我已经遵循了博客文章中的步骤。当没有额外的类时,它可以正常工作:运行应用程序后,每当我执行一次回调时,它都会打印日志。但是,我有兴趣向包中添加一个新类(StaticCounter
)。我认为应该有办法改变APK本身的配置,使新引入的类对所有方法都可见。@noidsirius您可以通过将其添加到androidTest
源集中,将其添加到测试应用程序中,或者使用TestSuite
将其添加到其中<代码>烟尘
似乎相当专门用于桌面Java,而桌面Java是另一种动物,因此可能存在某些限制。不过,谢谢,我做到了。看来问题出在班级的包袱上。