经过各方神仙文档,以及多天调试,整理了这篇极简反编译apk的文档(没几个字,吧).轻轻松松对一个apk(没壳的)进行逆向分析以及调试.其实主要便是4个指令.

预备

  1. 下载apktool
  2. 下载Android SDK Build-Tools,其中对齐和签名所需的指令都在此目录下对应的版别的目录中,比如我的在D:\sdk\build-tools\30.0.3目录下,能够将此目录参加环境变量中,后续就能够直接运用签名和对齐所需的指令了
  3. 可选,下载jadx-gui,可查看apk文件,并可导出为gralde项目供AS翻开

流程

  1. 解压apk: apktool d C:\Users\CSP\Desktop\TEMP\decompile\test.apk -o C:\Users\CSP\Desktop\TEMP\decompile\test,第一个参数是要解压的apk,第二个参数(-o后面)是解压后的目录

  2. 修正: 留意寄存器的运用别紊乱,特别留意,假如需求运用更多的寄存器,要在办法开头的.locals x或.registers x中对x+1

    • 刺进代码:在idea上运用java2smali插件先生成smali代码,可仿制整个.smali文件到包内,或者直接仿制smali代码,留意刺进后修正包名;
    • 修正代码:需求熟悉smali语法,可自行百度;
    • 修正so代码,需求IDA,修正完从头保存so文件,并替换掉原so文件,留意如有多个架构的so,需求都进行修正并替换;
    • 删除代码:不建议,最好逻辑理清了再删,但千万别删一半;
    • 资源:修正AndroidManifest.xml,可在application标签下参加android:debuggable=”true”,从头打包后方可对代码进行调试;
  3. 重打包: apktool b C:\Users\CSP\Desktop\TEMP\decompile\test -o C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk,第一个参数是要进行打包的目录文件,第二个参数(-o后面)是从头打包后的apk途径.从头打包成功,会呈现Press any key to continue …

  4. 对齐: zipalign -v 4 C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk,第一个参数是需求进行对齐的apk途径,第二个参数是对齐后的apk途径.对齐成功,会呈现Verification succesful

  5. 签名: apksigner sign -verbose --ks C:\Users\CSP\Desktop\软件开发\反编译\mykeys.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key0 --ks-pass pass:mykeys --key-pass pass:mykeys --out C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk,第一个参数(–ks后面)是密钥途径,后面跟着是否敞开V1、V2签名,在后面跟着签名密码,最终两个参数(–out后面)是签名后的apk途径以及需求签名的apk(留意需对齐)途径.签名成功,会呈现Signed

  6. 安装: adb install C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk

  7. 调试: 用jdax将apk导出为gradle项目,在AS中翻开,即可经过attach debugger的办法对刚从头打包的项目进行调试.留意,调试时由于行号对不上,所以只能在办法上打上断点(菱形图标,缺陷,运转速度极慢)

  8. 留意事项:

    • 上述指令中,将目录和项目’test’改成自己的目录和项目名即可;
    • apktool,zipalign,apksigner,adb指令需参加环境变量,否则在各自的目录下./xxx 去执行指令;
    • zipalign,apksigner所需的运转文件在X:XX\sdk\build-tools\30.0.3目录下;
    • 运用apksigner签名,对齐操作必须在签名之前(推荐运用此签名办法);
    • 新版别Android Studio生成的签名密钥,1.8版别JDK无法运用,我是安装了20版别的JDK(AS自带的17也行)

假懒

为了将懒进行到底,写了个bat脚本(需求在test文件目录下):

::封闭回显
@echo off
::避免中文乱码
chcp 65001
title 一键打包
start /wait apktool b C:\Users\CSP\Desktop\TEMP\decompile\test -o C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk
start /b /wait zipalign -v 4 C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
start /b /wait apksigner sign -verbose --ks C:\Users\CSP\Desktop\软件开发\反编译\mykeys.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key0 --ks-pass pass:mykeys --key-pass pass:mykeys --out C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk

大家将此脚本仿制进bat文件,即可一键输出.

不过目前略有瑕疵:1.从头打包需求新开窗口,而且完成后还需手动封闭;2.封闭后还要输入’N’才干进行后续的对齐和签名操作有无bat大神帮助优化下/(ㄒoㄒ)/~~!

——-更新

真懒

关于’假懒’中的打包脚本,会有2个瑕疵,使得不能将懒进行到底.经过查找方案,便有了以下’真懒’的方案,使得整个打包能够真正一键执行:

::封闭回显
@echo off
::避免中文乱码
chcp 65001
title 一键打包
call apktool b C:\Users\CSP\Desktop\TEMP\decompile\test -o C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk
call zipalign -v 4 C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
del test_b.apk
call apksigner sign -verbose --ks C:\Users\CSP\Desktop\软件开发\反编译\mykeys.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key0 --ks-pass pass:mykeys --key-pass pass:mykeys --out C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
del test_b_zipalign.apk
echo 打包完毕
echo 输出文件是-----test_b_sign.apk
pause

能够看到,把start换成了call,而且删除了从头打包和对齐后的文件,只留下最终签完名的文件

懒汉式逆向APK

到此够了吗?不行,由于运转第一个apktool b指令时,从头打包完,会被pasue,让你按一个按键再继续.

这当然不行,这可不算一键,那么咱们找到apktool的存放途径,翻开apktool.bat,找到最终一行

懒汉式逆向APK

便是这里对程序暂停了,那么就把这一行删了,当然最好是注释了就行,在最前面rem即可对指令进行注释,处理完之后,再从头运转咱们的’一键打包.bat’脚本,这时候在半途从头打包后就不会呈现’Press any key to continue…’了,即可一键实现打包-对齐-签名的流程了( • • )y.

当然,假如想使脚本到处运转,能够给脚本添加一个变量,在运转前经过环境变量的形式把要打包的目录途径参加进来,这个大家能够自行测验.

最终,感谢大家的阅览.这里面有对smali和so的修正,有时机和时间,我也会继续共享!!!