怎么给软件加壳
版权声明:本文为博主原创文章,若转载请注明出处:http://blog.csdn.net/pvlking首先加壳的方法和代码都是从Jack_Jia的博客学习的。
详见:http://blog.csdn.net/jiazhijun/article/details/8678399由于本人从c++开发直接跳到Android开发,没有对android进行系统的学习,看上面博客时还是有很多不理解的地方。
本文把不理解的地方梳理一下,最后提供个测试源码(加了比较详细的注释)。
希望对于跟我一样安卓基础不是太好的人有一定帮助。
正文:apk加壳的目的(我的用途):增加apk静态分析的难度。
(如果反编译的人知道是加壳的,可以在data/包名目录下 找到真正的apk。
所以在壳上增加正常的代码的话可以增加迷惑性)基础知识:ClassLoader:http://www.iteye.com/topic/83978 这个写的不错想了解的可以去看看。
整个加壳的过程涉及到三个程序:要加壳的apk,加壳程序(demo中的apkjm),解壳程序(demo中的myunshell)。
其中加壳程序就是把要加壳的apk放入解壳程序的dex文件中。
解壳程序是最后替代我们apk安装到手机中运行的程序。
它在执行中从自己的dex中释放出我们apk程序。
步骤:1.实现加壳程序。
2.实现解壳程序:按博客创建个解壳的Application。
如果我们的apk中用到了 Application,需要在解壳程序的xml文件中添加:com.***.Application 是我们apk的Application类名 加上我们apk的包名注:1.我们apk用到的权限和组件都需要添加到解壳程序的xml中,组件都需要加上完整的包名路径。
2.我们apk内用到的资源也就是res文件内的东西,需要拷贝到解壳程序的res中。
3.如果我们apk静态注册了广播接收器,那广播接收器类需要在解壳程序中实现。
3.解壳程序完成后,把bin文件夹内的dex文件拷出来,用加密程序把我们的apk添加到该dex文件中。
4.把新生成的dex文件覆盖bin文件夹中原来的dex文件,并把apk文件也删掉,重新运行解壳程序生成新的解壳apk。
这个apk就是我们需要的最后的apk文件了。
加壳就完成了。
另外:1.在解壳程序中对我们apk文件进行解密函数调用的地方不对。
在demo中做了修改和说明。
2.我在释放apk的时候加了个判断,如果文件存在就不再释放了,如果是在测试的时候,可以先屏蔽掉,免的每次运行调试前要先删掉原来的程序。
[java] view plain copyif (!dexFile.exists()) { dexFile.createNewFile(); //在payload_odex文件夹内,创建payload.apk // 读取程序classes.dex文件 byte[] dexdata = this.readDexFileFromApk(); // 分离出解壳后的apk文件已用于动态加载 this.splitPayLoadFromDex(dexdata); } demo地址:http://download.csdn.net/detail/pvlking/8302249
请问这个软件有没加壳?
加壳:其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩,改变其原来的特征码,隐藏一些字符串等等,使一些资源编辑软件不能正常打开或者修改。
类似WINRAR的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。
解压原理,是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。
现在的CPU都很快,所以这个解压过程你看不出什么东东。
软件一下子就打开了,只有你机器配置非常差,才会感觉到不加壳和加壳后的软件运行速度的差别。
当你加壳时,其实就是给可执行的文件加上个外衣。
用户执行的只是这个外壳程序。
当你执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。
所以,这些的工作只是在内存中运行的,是不可以了解具体是怎么样在内存中运行的。
通常说的对外壳加密,都是指很多网上免费或者非免费的软件,被一些专门的加壳程序加壳,基本上是对程序的压缩或者不压缩。
因为有的时候程序会过大,需要压缩。
但是大部分的程序是因为防止反跟踪,防止程序被人跟踪调试,防止算法程序不想被别人静态分析。
加密代码和数据,保护你的程序数据的完整性。
不被修改或者破。
(有些木马和病毒利用加壳伪装成正常程序)参考资料: http://zhidao.baidu.com/question/95004366.html