欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android代码混淆,资源混淆,SO混淆分析

程序员文章站 2023-01-13 15:21:33
> 代码混淆 通过proguard或者dexguard来保护我们的代码,从而实现相对的代码安全。靠android资源管理框架来完成的,而android资源管理框架实际是由assetmanage...

> 代码混淆

通过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文件。