.so(SharedObject)作用等同于windows环境下的.dll(dynamic link library)文件,我们在引用第三方SDK时,也会遇到需要调用相应的.so文件的情况,.so文件本事更多的是集成公共处理方法,当然有事也会用来保存重要的数据信息。
对于应用的编译与反编译过程中,本地混淆一直是有效的方法。对于.so文件,同样也适用于混淆,.so文件虽然在使用破解工具IDA打开后看到的是汇编数据,但仍然存在着规律可循,不妨碍专业人员的阅读,所以掌握对.so文件的混淆也是必须的。
.so文件的混淆是从两方面入手:
1:方法名混淆
2:数据混淆
方法名混淆
我们在创建构建.so文件所需的.c和.h文件时,NDK会帮助我们自动生成native方法名,这个方法名是格式化,该方法名同时也是索引表中的索引名。因其特殊性,在IDA浏览时,可以通过索引表快速查看到。比如我们创建一个TestSimple,在里面声明一个native方法showDsc(),最终得到的方法名是:
Java_com_example_xx_TestSimple_showDsc
生成的.so文件在经过IDA反编译后,可以在函数索引表中清楚的看到:
好在NDK提供了修改的方法,帮助我们隐藏掉这种显眼的名字。首先说一下两个基础方法:
1、简化方法名,该方法如下:
继续以TestSimple为例,声明
#defineJNIFUNCTION_NATIVE(sig) Java_com_example_xx_TestSimple_##sig
将函数名前边的路径剔除掉,只显示函数名,避免显得直接。
JNIEXPORT void JNICALL JNIFUCTION_NATIVE (showMath(JNIEnv *env, jobject obj));