加固后 odex 运行闪退
大神你好,关于有近100款产品使用该加固技术后 odex 方式运行异常,对这个项目并不很了解,不知是否已经解决过该问题,详情见: https://juejin.cn/post/7514618035832471561
这个odex问题没处理过,我看了下分析很有用。enum导致脏问题之前遇到类似的就是方法返回boolean,使用jvalue.z接收结果,而if-get这类指令使用int,然后判断总会随机出错。晚上我试试生成native方法时加上强制类型转换。
vmInterpret返回的是jvalue, 然后会依据native函数返回类型生成不同的返回代码(比如 return value.z,return value.i)。我写了两个测试函数,一个直接reutrn value.i,一个reutrn (jint) value.i,然后反编译so对比一下汇编代码发现没区别。按理有返回值的native函数不会调用vmInterpret后直接返回,而是会处理返回值。
http://www.danji100.com/app/249624.html 样本使用的是这个软件。
cmd package compile -f -m speed me.liuliang.xianfeng
代码生成模板是
jvalue value = vmInterpret(env, &code, &dvmResolver);
//清理内存等相关
...
return value.i;
我测试使用jvalue.i这类返回可以正确处理数据类型问题,我看你文章中会反编译出现调用vmInterpret后直接不处理返回值不知道是不是和编译器优化有关。 好,我去下载样本试试。
代码生成模板是
jvalue value = vmInterpret(env, &code, &dvmResolver); //清理内存等相关 ... return value.i;我测试使用jvalue.i这类返回可以正确处理数据类型问题,我看你文章中会反编译出现调用vmInterpret后直接不处理返回值不知道是不是和编译器优化有关。 好,我去下载样本试试。
是的,要显式类型转换。我写测试代码模拟过。比如专门写成 jint value = function 才被处理。
代码生成模板是
jvalue value = vmInterpret(env, &code, &dvmResolver); //清理内存等相关 ... return value.i;我测试使用jvalue.i这类返回可以正确处理数据类型问题,我看你文章中会反编译出现调用vmInterpret后直接不处理返回值不知道是不是和编译器优化有关。 好,我去下载样本试试。
是的,要显式类型转换。我写测试代码模拟过。比如专门写成 jint value = function 才被处理。
之前用debug版反编译,我改成release版发现问题了,处理返回值相关被优化掉了
jvalue value = vmInterpret(...);
...
return value.i;
上面代码我debug编译我看汇编还能正确处理,release就会被优化掉,我专门加上return (jint) value.i;也会被优化,所以给jvalue value;加上volatile保证不会被优化。vmInterpret内部不太好修改,不然把所有数据按jlong处理应该也没问题。
太有效率了,但这些应用的开发者比较难联系上。