做网站还 淘宝,建网站的方案,网站制作长春,南充市住房建设局网站0#xff0e;前言单纯从技术角度上来讲#xff0c;掌握反编译功能确实是一项非常有用的技能。另外既然别人可以反编译程序#xff0c;我们当然有理由应该对程序进行一定的保护#xff0c;因此代码混淆也是我们必须要掌握的一项技术。看完此篇如果对代码混淆也感兴趣#x… 0前言单纯从技术角度上来讲掌握反编译功能确实是一项非常有用的技能。另外既然别人可以反编译程序我们当然有理由应该对程序进行一定的保护因此代码混淆也是我们必须要掌握的一项技术。看完此篇如果对代码混淆也感兴趣可以参考Android安全——混淆技术完全解析。 1反编译Android的反编译主要又分为两个部分一个是对代码反编译一个是对资源反编译。 1.1 代码反编译要想将APK文件中的代码反编译出来我们需要用到以下两款工具adex2jar这个工具用于将dex文件转换成jar文件。下载地址http://sourceforge.net/projects/dex2jar/files/bjd-gui这个工具用于将jar文件转换成Java代码。下载地址http://jd.benow.ca/ 1我们首先将APK文件进行解压可以先将文件后缀名改成zip然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件。2classes.dex就是存放所有Java代码的地方我们将它拷贝到dex2jar解压后的目录下并在cmd中也进入到同样的目录然后执行d2j-dex2jar classes.dex3如果没有报任何错误这就说明我们已经转换成功了。现在观察dex2jar目录你会发现多了classes-dex2jar.jar这个文件。但是对于我们而言jar文件也不是可读的因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成Java代码。4最后一步就是使用jd-gui工具打开classes-dex2jar.jar这个文件。我们便得到了Java代码。基本已经做到了90%以上的还原工作像setContentView()方法传入的参数反编译也就只能将相应的id值进行还原而无法变成像R.layout.activity_main这样直观的代码展示。另外除了MainActivity之外引用的library也会作为代码的一部分被打包到classes.dex文件当中因此反编译的时候这些代码也会一起被还原。 1.2 资源反编译要想将APK文件中的资源反编译出来又要用到另外一个工具了Apktool用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。下载地址http://ibotpeaches.github.io/Apktool/install/1下载该工具后目录下会存在apktool.bat和apktool.jar这两个文件。2我们将APK文件拷贝到和这两个文件同样的目录下然后cmd也进入到这个目录下并在cmd中执行如下命令apktool d APKName.apk3第二步成功后我们会发现在当前目录下多了一个APKName文件夹这个文件夹中存放的就是反编译的结果了。我们可以打开AndroidManifest.xml、res/layout即可查看资源信息。【拓展】第二步命令中d是decode的意思表示我们要对Demo.apk这个文件进行解码。那除了这个基本用法之外我们还可以再加上一些附加参数来控制decode的更多行为-f //如果目标文件夹已存在则强制删除现有文件夹默认如果目标文件夹已存在则解码失败。
-o //指定解码目标文件夹的名称默认使用APK文件的名字来命名目标文件夹。
-s //不反编译dex文件也就是说classes.dex文件会被保留默认会将dex文件解码成smali文件。
-r //不反编译资源文件也就是说resources.arsc文件会被保留默认会将resources.arsc解码成具体的资源文件。
2. 重新打包首先我们来看一下通过apktool反编译后的包目录情况如下图所示1其中original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件。2res文件夹下存放的是反编译出来的所有资源。3smali文件夹下存放的是反编译出来的所有代码。4AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的主要的区别就是所有的Java文件都变成了smali文件。smali文件其实也是真正的源代码只不过它的语法和Java完全不同它有点类似于汇编的语法是Android虚拟机所使用的寄存器语言如果你能够看得懂smali文件的话那么你就可以做很恐怖的事情了——你可以随意修改应用程序内的逻辑将其进行破解。我们可以稍微改变smali文件里的部分内容并重新打包只需要在cmd中执行如下命令apktool b Demo -o New_APKName.apk 其中b是build的意思表示我们要将Demo文件夹打包成APK文件-o用于指定新生成的APK文件名。成功后便在当前目录下生成了apk文件。3. 重新签名不过目前这个New_APKName.apk还是不能安装的因为它还没有进行签名。我们显然没有办法拿到原作者的签名因此我们只能拿自己的签名文件对这个APK文件重新进行签名重新打包出来的软件也就是个盗版软件。使用Android Studio或者Eclipse都可以非常简单地生成一个签名文件。 有了签名文件之后在cmd中执行签名命令就可以进行签名了命令格式如下jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名1其中jarsigner命令文件是存放在jdk的bin目录下的需配置系统的环境变量。下同。2签名之后的APK文件现在已经可以安装到手机上了不过在此之前为了使得我们的程序在Android系统中运行得更快我们需要对签名后的APK文件进行一次对齐操作使用的是zipalign工具存放于Android SDK/build-tools/version目录下命令格式如下zipalign 4 New_APKName.apk New_APKName_aligned .apk3其中4是固定值不能改变后面指定待对齐的APK文件名和对齐后的APK文件名。运行这段命令之后就会生成一个New_APKName_aligned .apk文件便可以在手机上运行我们重新打包过后的APK了。 转载整理自郭大侠博客http://blog.csdn.net/guolin_blog/article/details/49738023 转载于:https://www.cnblogs.com/qitian1/p/6461528.html