Rust命令行,实现自动反编译Android APK包工具

Rust-CLI实现自动反编译APK

  • Rust提供了比较好的CLI接口,可以快速的编写命令行应用, 用于日常的工具类使用。

  • 分享一个用Rust命令行实现自动反编译Android APK包工具,是之前学习Rust写的一个练手小工具,可以快速反编译APK,同时也学习下用Rust来写命令行工具的。

核心依赖库准备:

  • 反编译APK依赖的必要库:

    d2j-dex2jar
    jd-cli
    Apktool

应用该库使用为最新版本,如果有不支持兼容的需要确认Java使用的相关版本即可,这些可以下载或者从工具源码里获取。

  • Rust CLI 编写依赖的库:

    clap
    console
    execute
    indicatif
    text2art

这些库的使用方式和说明可在crates.io查到具体的使用,或者参见我工程里的源码使用方式。

核心代码解析:

  • 编写CLI处理接口:

      let matches = Command::new("Decompile APK")
          .author("lg.json@gmail.com")
          .version("1.0.0")
          .about("ApkDecompiler for Android, create by Spark Coding BU")
          .arg(
              Arg::new("file")
                  .action(ArgAction::Set)
                  .short('f')
                  .long("file")
                  .default_value("-")
                  .help("The path to your apk."),
          )
          .after_help(
              "Longer explanation to appear after the options when \
                    displaying the help information from --help or -h",
          )
          .get_matches();
    
  • Command使用的是clap来创建, 通过Arg创建对应的参数和应用,可以创建读个arg进行添加。

  • 读取CLI的输入参数:

    let file_path = match matches.get_one::<String>("file") {
          Some(it) => it,
          _ => return,
      };
      let apk_path = PathBuf::from(file_path);
    
  • 开始执行:

      pub fn start_decompile(&self) -> Result<()> {
          self.show_tools_info()?;
          self.create_output_dir()?;
          self.start_dex2jar()?;
          self.start_decompile_class()?;
          self.start_decompile_res()?;
          self.open_output()?;\
          Ok(())
      }
    

开始执行会显示工具对应的信息,创建文件输出的地址,开始解析对应的包

  • 举例命令行的创建:

     ///use dex2jar get APK's jar in output_path
      pub fn start_dex2jar(&self) -> Result<()> {
          let mut command = Command::new("sh");
    
          command
              .arg(self.exe_dir.join("lib/dex2jar/d2j-dex2jar.sh"))
              .arg("-f")
              .arg(&self.apk_path)
              .arg("-o")
              .arg(self.output_path.join("app.jar"));
    
          execute_state(command, "dex2jar");
          Ok(())
      }
    
  • 工程注意点:

    1.使用build.rs在构建前需要把代码依赖的lib库拷到对应的target下,这里使用了构建脚本, 具体参见代码工程
    2.如何使用cli的执行状态,来显示处理过程, 是CLI下常用的工具

使用方法:

  • 到软件路径下:./apkdecompiler -f ./test.apk 一个命令可以自动反编译出包。

    _____                      _        _____                                        _  _
    

    / | | | | __ \ ()| |
    | (
    _ __ __ _ _ __ | | __ | | | | ___ ___ ___ _ __ ___ _ __ _ | | ___ _ __
    ___ \ | '_ \ / || '__|| |/ / | | | | / _ \ / __| / _ \ | '_ _ \ | ' \ | || | / _ | '|
    __) || |) || (| || | | < | |
    | || /| ( | () || | | | | || |) || || || /| |
    |
    / | ./ _,||| ||_\ |/ _| _| _/ || || |_|| ./ |||| ___|||
    | | | |
    |
    | |_|
    begin del old file...in /Users/developer/apkdecompiler/output
    ✅ create ouput:/Users/developer/apkdecompiler/output
    ✅ dex2jar...done
    ✅ decompile class...done
    ✅ decompile Resource...done

反编译后的相关代码和资源内容会自动打开对应的文件夹。分享这个工具仅供对练手rust,方便反编译Android APK包用户使用,任何商业行为均与软件和本人无关。

一些源码实现细节比如rust里文件路径操作、命令行状态实现等没有具体在文中呈现,可以通过源码进一步学习。

PS: 也欢迎大家评论和交流~ 更多文章也可关注微信公号:良技漫谈 ,如需源码回复Rust。

相关推荐
极客代码5 分钟前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow
土豆湿10 分钟前
拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流
开发语言·javascript·css
界面开发小八哥17 分钟前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具
草莓base31 分钟前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
Dnelic-35 分钟前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Ljw...1 小时前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
qystca1 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
编程重生之路1 小时前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱1 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子1 小时前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab