(文章仅用于记录学习过程)
一般安卓逆向过程是,反编译-看源码-修改smail文件-重新打包-签名-运行,使用到的工具有apktool,dex2jar,jd-gui,SublimeText
反编译
将apk拆解成若干个文件,其中包括,资源文件,清单文件,smail文件等等,这个过程我们一般使用apktool来完成,打开终端,进入apk所在的目录,我们分别输入2条命令看下会得到什么.
//得到dex文件
apktool d -s test.apk
//不会得到dex文件
apktool d test.apk
命令一可以得到dex文件,dex文件就是class的文件集合,class文件是由java文件编译而已的,大的项目一般会有多个dex文件,因为class文件太多了,一个dex放不下只能放多个,
命令二可以得到smail文件,smail里面的文件就是开发时候的java文件,只不过里面的代码已经被转换成了smail语言,反编译的目的就是修改smail里面的代码,比如把==修改成!=,把true改成false,来实现自己想要的逻辑.
看源码
如何看懂代码,当然首先你要先看到代码,我们可以使用apktool将apk拆解得到dex文件(apk重命名rar,然后解压也可以得到),然后使用dex2jar将dex转换成jar包,最后将jar包拖进jd-gui里面就可以看到原始代码
//dex2jar当前目录
sh d2j-dex2jar.sh dex路径
修改smail文件
jd-gui看得是源码,这个是不能直接修改的,我们只能修改smail文件里面的代码,使用apktool的命令二得到smail文件,要学习smail语言才能进行smail文件的修改
java语言要转成机器语言让机器能够识别,smail语言就是对寄存器等进行操作
//我们在java中定义一个变量
String a="123";
//通过计算机去理解就是我在内存里面开辟了一个空间,这个空间的地址是多少,然后指向字符串123,我们通过这个内存地址就能找到这个变量,就好像可以通过身份证找到我们人一样
String b="123"
//又定义了一个变量,但是计算机不会再开辟一个空间,a和b的内存地址是一样的.
重新打包
也就是将我们修改的文件,比如修改了资源文件,或者修改smail文件,然后在重新打包成一个apk(例如港版的手机,将原先的包装拿去,然后放到一个新的包装里面,重新打上封条,外表就和新的苹果手机一样),打包我们依旧使用apktool工具
// test是我们之前通过命令二解压之后的目录,因为我的apk叫test.pk,所以命令二就会生成test目录
apktool b test
打包成功后,会在test里面的dist文件下生成一个新的apk文档(未签名不能安装)
签名
打包完成了,我们得到修改过的apk文件,但是这时候我们不能运行,还需要签名,谷歌爸爸区分2个应用是否相同,是通过包名还有签名完成的,由于我们是二次打包,之前的签名已经消失了,不可能在使用之前的签名了,只能自己在生成一个签名,使用Android Studio生成jks签名
//jarsigner -verbose -keystore 签名文件路径 -signedjar 签名后生成的文件路径 未签名的文件路径 签名文件名称
jarsigner -verbose -keystore apktool.jks -signedjar test_sign.apk test/dist/test.apk apktool
输入完成后就会提示输入加密密码,输入正确后就签名成功了,这时候就可以正常安装了