纯属个人备忘,不喜勿喷
持续更新
首先,把需要反编译的apk文件放到apktool目录,调出cmd命令apktool.bat d xxx.apk解包。正常情况下解包之后的xxx目录如图所示:
当然了,大一些的项目还会有assets等文件夹。
到这一步,资源文件和manifest配置文件就已经得到了,这一步基本很少有人可以加固防止。从这一步我们可以得到应用的图片、布局等资源,也可以通过配置文件得知应用需要获取的权限以及首次打开的哪个activity的名字,如图代码代表最先出现的activity。
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
apktool.yml是可以用EditPlus修改的,回编译时改文件名版本等可以用到。
smali则是我们反编译的核心,smali语法比较晦涩,不深学很难看懂,如果要增加方法和类,尽量少的加入逻辑到原文件,避免出错。
首先,我们写一个test工程,把需要加的逻辑代码资源文件等等都放进去然后生成apk,将apk用以上方法apktool反编译,可以得到转变出的smali文件。
增添新的逻辑时,如果用到了第三方jar和新的类、图片、布局文件、raw资源,需添加进原应用目录,资源文件必须在values中的xml文件(比如public.xml等带有资源ID的文件)以及R文件相关配置。注意:有新资源文件加入时,资源ID可以随意自增,但不能有重复。R文件一般会在主包目录:
,但部分项目不会。
今天遇到一个很重要的问题,在反编译一些大型项目时,会遇到dex分包的情况,目录中会出现多个smali目录,而main活动一般会在第一个smali,这时候如果向main里注入逻辑或添加jar包,那么回编译时必定会报方法超过65535的错误,解决办法如下:
按照图片上的例子,我们在根目录新建一个文件夹,命名为smali_classes4(注意,这里包的路径还是必须正确),将jar包和方法放进去,在main里invoke引用一下,回编译就没问题啦!进去到build里也可以看到dex文件多了一个,这种方法相当于再多分了一次包,就不会出现方法超过的错误,success~
2017.5.22
今天回编译时又遇到一些问题,百度google都没有得到什么有用的信息让我很烦躁。好在机智如我。
没有图,错误代码就手写出来吧。
answer:某app无raw文件夹,我手动创建之后在public.xml加了随便一个不与内容重复的id,信心满满回编译,结果报错。
提示:Multiple type names declared for public type identifier 0x8(raw vs integer).
/home/apktool/***/public.xml:356:originally defined here.
我加的id是0x7f090006,看到上面有个0x8我还傻傻的以为id要改成是0x7f0800006,被自己蠢哭~ 试了两次之后终于得到结论:不同type的16进制ID不能随便写,第四位数不能相同。
但是0x9都用过了,怎么办呢?没关系,字母也是可以的,我写的0x7f0e0000。不过字母好像只能a-f。
今天到此为止。