[萌新发帖]由于权限问题,我只能在“茶余饭后”发表帖子,希望这一次过后可以多多在Android安全中发。
目的:完成MainActivity中的onCreate和replaceClassloader两个java函数的jni等价实现
首先声明一下AS工程写的是dex动态加载,然后是为了去加载另一个1.dex里的TestActivity类
接着使用GDA去看要加载的1.dex中查看
如果Native转化成功,则会在logcat窗口中看到i am from TestActivity.onCreate
开始JNI转化:
0x01 使用JNI实现onCreate函数的等价转化
①首先是注释掉onCreate,并添加声明
②其中,setContentView(R.layout.activity_main);这个语句中会有R类,这是自动生成类,我们需要在GDA中观看它的反编译结果。
发现其中都是些静态Static int 属性,一会儿用Field的时候选择StaticInt 和Static
③转Jni层实现
onCreate的前两行都没什么大问题,一般的反射思路。
第三行,我们跟进并观察getApplication的函数实现
第四行,原理和第三行一致:
第五行,调用了copAssetAndWrite,因此需要注意私有属性和Static类型
//copyAssetAndWrite函数
private static boolean copyAssetAndWrite(String fileName) {
try {
File cacheDir = appContext.getCacheDir();
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
File outFile = new File(cacheDir, fileName);
if (!outFile.exists()) {
boolean res = outFile.createNewFile();
if (!res) {
return false;
}
} else {
if (outFile.length() > 10) {
return true;
}
}
InputStream is = appContext.getAssets().open(fileName);
FileOutputStream fos = new FileOutputStream(outFile);
byte[] buffer = new byte[1024];
int byteCount;
while ((byteCount = is.read(buffer)) != -1) {
fos.write(buffer, 0, byteCount);
}
fos.flush();
is.close();
fos.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
java.io.File android.content.Context.getCacheDir()' on a null object reference
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-5-22 17:11
被一颗金柚子编辑
,原因: 上传主java工程