Android代码混淆,资源混淆,SO混淆分析
> 代码混淆
通过proguard或者dexguard来保护我们的代码,从而实现相对的代码安全。靠android资源管理框架来完成的,而android资源管理框架实际是由assetmanager和resources两个类来实现的。其中,resources类可以根据id来查找资源,而assetmanager类根据文件名来查找资源。事实上,如果一个资源id对应的是一个文件,那么resources类是先根据id来找到资源文件名称,然后再将该文件名称交给assetmanager类来打开对应的文件的。
> 资源混淆
微信android资源混淆打包工具-http://mp.weixin.qq.com/s__biz=mzawndy1ody2oq==&mid=208135658&idx=1&sn=ac9bd6b4927e9e82f9fa14e396183a8f#rd
微信android资源混淆andresguard- https://github.com/shwenzhang/andresguard/blob/master/readme.zh-cn.md
https://github.com/shwenzhang/andresguard
美团android资源混淆保护实践- http://tech.meituan.com/mt-android-resource-obfuscation.html
aapt是android asset packaging tool,打包的流程:
1.把"assets"和"res/raw"目录下的所有资源进行打包(会根据不同的文件后缀选择压缩或不压缩),而"res/"目录下的其他资源进行编译或者其他处理(具体处理方式视文件后缀不同而不同,例如:".xml"会编译成二进制文件,".png"文件会进行优化等等)后才进行打包;
2.会对除了assets资源之外所有的资源赋予一个资源id常量,并且会生成一个资源索引表resources.arsc;
3.编译androidmanifest.xml成二进制的xml文件;
4.把上面3个步骤中生成结果保存在一个*.ap_文件,并把各个资源id常量定义在一个r.java中;
proguard obfuscator方式,对apk中资源文件名使用简短无意义名称进行替换,给者制造困难,从而做到资源的相对安全;通过上面分析,我们可以看出通过修改aapt在生成resources.arsc和*.ap_时把资源文件的名称进行替换,从而保护资源。通过修改aapt,我们可以在代码零修改的基础下就能做到相对的资源安全,当然安全是相对的.
通过aapt编译资源的代码,我们发现修改aapt在处理资源文件相关的是能够做到资源文件名的替换,下面是resource.cpp中makefileresources()的修改的代码片段:
static status_t makefileresources(bundle* bundle, const sp& assets,
resourcetable* table,
const sp& set,
const char* restype)
{
string8 type8(restype);
string16 type16(restype);
bool haserrors = false;
resourcediriterator it(set, string8(restype));
ssize_t res;
while ((res=it.next()) == no_error) {
if (bundle->getverbose()) {
printf(" (new resource id %s from %s)\n",
it.getbasename().string(), it.getfile()->getprintablesource().string());
}
string16 basename(it.getbasename());
const char16_t* str = basename.string();
const char16_t* const end = str + basename.size();
while (str < end) {
if (!((*str >= 'a' && *str <= 'z')
|| (*str >= '0' && *str <= '9')
|| *str == '_' || *str == '.')) {
fprintf(stderr, "%s: invalid file name: must contain only [a-z0-9_.]\n",
it.getpath().string());
haserrors = true;
}
str++;
}
string8 respath = it.getpath();
respath.converttorespath();
string8 obfuscationname;
string8 obfuscationpath = getobfuscationname(respath, obfuscationname);
table->addentry(sourcepos(it.getpath(), 0), string16(assets->getpackage()),
type16,
basename, // string16(obfuscationname),
string16(obfuscationpath), // respath
null,
&it.getparams());
assets->addresource(it.getleafname(), obfuscationpath/*respath*/, it.getfile(), type8);
}
return haserrors unknown_error : no_error;
}
> so混淆
so库中jni方法混淆;
android studio 混淆打包时如何忽略依赖库中的第三方.so文件。
上一篇: iOS 动画(3)
下一篇: 数据库的相关概念、SQL及功能讲解