首页
社区
课程
招聘
[原创]java函数转Native化的一些实践
发表于: 2020-5-13 00:53 11603

[原创]java函数转Native化的一些实践

2020-5-13 00:53
11603

[萌新发帖]由于权限问题,我只能在“茶余饭后”发表帖子,希望这一次过后可以多多在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工程
上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享!恭喜转正!帖子从休闲版块移到Android版块了。
2020-5-15 10:19
0
雪    币: 2965
活跃值: (2082)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
Editor 感谢分享!恭喜转正!帖子从休闲版块移到Android版块了。
谢谢版主认可!
2020-5-15 10:44
0
雪    币: 29
活跃值: (5672)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这程序速度得跌倒什么程度
2020-5-15 21:04
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个没有离开Java虚拟机,速度没什么影响,很多so调用java都是这么干的。如果在调用Java过程还加混淆,那就会变慢。
2020-5-16 08:23
0
雪    币: 1841
活跃值: (1290)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
6
2020-5-17 02:29
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
move v1,v2
这个语句怎么native?
2020-5-18 17:00
0
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
8
感谢分享,学习了
2020-8-8 14:57
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
tDasm move v1,v2 这个语句怎么native?
mov r1,r2
2021-2-13 11:52
0
雪    币: 286
活跃值: (381)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
简版的dexvmp
2021-2-18 15:13
0
游客
登录 | 注册 方可回帖
返回
//