Android逆向系列(一):初探Android逆向

Android逆向系列(一):初探Android逆向这段时间因为某些业务驱动 开始研究一些逆向相关的东西 浏览了下其所包含的大致内容 发现真是一个新大陆 跟之前耳听目染过的一些门面介绍完全不是一个层级的 真正的印证了下手难这一说法 谨此以本文开始记录我的 Android 逆向之旅吧 总述习惯于应用层开发的我们都知道 在应用上架的时候都需要程序经过编译 签名 生成一个后缀为 apk 的文件才能发布到应用市场 而我认识的逆向就从这个 ap

这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法。

 谨此以本文开始记录我的Android逆向之旅吧。 

总述

习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场,而我认识的逆向就从这个apk开始(逆向分为多种逆向,为了避免混淆概念这里的逆向暂且就特指apk的逆向)。

工具准备

反编译代码的工具下载:

  • dex2jar: 把dex文件转成jar文件下载地址:https://sourceforge.net/projects/dex2jar/files/
  • jd-gui: 这个工具用于将jar文件转换成java代码下载地址:http://jd.benow.ca/

反编译资源的工具:

  • APKTool: 本文重要工具,APK逆向工具,使用简单下载地址: http://ibotpeaches.github.io/Apktool/install/
    这里简单介绍下大概流程,首先把后缀为.apk的文件改为.zip的一个压缩文件,方便解压。dex2jar和jd-gui配套使用,用于逆向代码部分,APKTool用于逆向res文件夹下的图片布局等部分。
    .apk 修改成.zip文件解压后的目录树长这样:
    这里写图片描述
    这里也贴上源码,很简单就一个输入框和一个按钮,输入框内输入“2018”点击按钮即可跳转到另外一个界面,否则提示一个Toast “验证码错误!”,而我们要做的就是突破这个“2018”,绕过验证。
    这里写图片描述










反编译代码部分

需要用到的是dex2jar包里面的三个文件(当前是在windows环境下,Mac环境用对应的.sh文件):

  • d2j_invoke.bat
  • d2j-dex2jar.bat
  • lib
    将这三个文件复制到一个空的文件夹内,将刚才.apk解压后的classes.dex文件也一起复制到这里。如图:
    这里写图片描述
    Windows cmd到这个文件夹下 输入:d2j-dex2jar.bat classes.dex
    Mac 到这个文件夹下 输入:sh d2j-dex2jar.sh classes.dex
    如此之后在这个目录里会生成一个classes-dex2jar.jar文件。如图:
    这里写图片描述
    这个时候就轮到JD-GUI工具出手了,运行jd-gui.exe File–OpenFile–classes-dex2jar.jar 打开刚才生成的jar文件。就能很清晰的看到我们想要的代码了,如图。
    这里写图片描述
    对照上面发过的主要代码,已经差不离十了,对于想要代码思路的我们来说,到这里已经基本可以摸透他的逻辑了。


















反编译res资源部分

apktool d app-release.apk 此处app-release为apk名称 
  • AndroidManifest.xml:描述文件
  • res:资源文件
  • smail:反编译出来的所有代码,语法与java不同,类似汇编,是Android虚拟机所使用的寄存器语言

到此我们想要的都有了。下一步就是实现我们想法的时候了。

修改原代码逻辑

在刚才的JD-GUI中可以看到跳转的逻辑判断如下:

 public void onClick(View paramAnonymousView) { if (MainActivity.this.code.getText().toString().trim().equals("2018")) { paramAnonymousView = new Intent(MainActivity.this, SuccessActivity.class); MainActivity.this.startActivity(paramAnonymousView); return; } Toast.makeText(MainActivity.this, "验证码错误!", 0).show(); } 

我们只需要修改if后面的判断条件,设置为否即可if (!MainActivity.this.code.…),这样就成功绕过了条件约束。

Δ 接下来还有一部很重要那就是修改smali文件,找到MainActivity$1.smali这个文件用代码查看工具打开,如图:

这里写图片描述
找到这个if-eqz 修改成if-nez (nez对应为非,符号“!”),到这里要修改的部分都成功了,最后一步要做的就是重新打包了。当然对smali语法感兴趣的可以到我群里索取免费的pdf资料(415974495),大家可以一起探讨学习一下。

重新打包

在apktool文件夹路径的cmd下输入:

apktool b [文件夹] -o test2.apk (test2为新apk名称,[文件夹]为对应的有修改需要打包的文件夹) 例如:我当前就可以这样写 apktool b [F:\tools\apktool\app-release] -o test2.apk 

这里写图片描述
至此,我们的目标apk文件已经生成,当然如果你想装到你自己手机上还需要重新签名一下。

重新签名

首先我们需要一个用于签名的.keystore文件,生成命令如下(这里我们假设生成的是demo.keystore)。

keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore (cmd到apktool文件夹下跟待签名的apk放同个文件夹内便于操作) 

这里我们利用Java JDK提供的一个jarsigner进行签名,在刚才的cmd下继续操作,输入:

jarsigner -verbose -keystore demo.keystore test2.apk demo.keystore 

这里写图片描述
以上。我们目的apk已经可以投入使用,如果需要更快更好的体验还需要进行一次字节对齐的操作(后续分析)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207695.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:18
下一篇 2026年3月19日 下午1:18


相关推荐

  • 载入java VM时windows出现错误:2 的解决方法

    载入javaVM时Windows出现错误:2的解决方法问题:执行安装包时出现下图错误。原因:该安装包运行时需用到JAVA运行环境(JRE),JDK默认的安装路径是C:\ProgramFiles\Java,有些安装包默认从此处找JRE环境变量,如果你的JDK是自定义安装目录的话,就会出现上述错误。解决方法:首先确定JAVA_HOME环境变量配置是否正确,要和注册表中版本保持一致,WIN+R—>cmd中输入指令java-version可以查看环境变量的JAVA版本。找到安装包文件

    2022年4月9日
    743
  • PyCharm+QT Designer整合

    PyCharm+QT Designer整合CMD 下使用 pip 安装 PyQt4 或者 PYQT5 这里要注意 你下载的 PYQT5 不包含 QTdesigner 还要 pip3installP tools 好像 Pyqt5 中将 designer 分离了或者查看源码 https github com altendky pyqt5 tools 编译安装将 QTDesigner 整合到 PyCharm 的 ExternalTool 中 以后就可

    2026年3月27日
    3
  • dataguard安装

    dataguard安装1 1 nbsp nbsp nbsp nbsp Dataguard 实施前准备 nbsp nbsp nbsp nbsp Oracle 安装分包括 2 块 安装 DB nbsp 软件和升级 如果是 10g 的话 可以先将 DB 升级到 10 2 0 5 升级的原因是为了避免某些 bug 先安装软件 升级 升级完在用 DBCA nbsp 创建实例 这样比安装 DB nbsp 和创建实例之后升级要简单点 nbsp nbsp nbsp nbsp 1 redo nbsp 文件默认是 50M 改成 100M nbsp nbsp nbsp nbsp 2 每个 redogroup 里改成 2 个 nbsp

    2026年3月19日
    2
  • tikv源码分析_crt脚本命令大全

    tikv源码分析_crt脚本命令大全版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。以TiKvConfigstruct为起始点,从TiKvConfig内部的字段开始,分析每个模块的作用和配置检查逻辑所做的事情。TiKV是一个分布式事务型的键值数据库,是TiDB的存储层,提供了满足ACID约束的分布式事务接口,并且通过Raft协议保证了多副本数据一致性以及高可用。关于TiDB、TiKV的详细介绍可以从官网查阅,这里就不多赘述了。知乎上已经有一篇高屋建瓴的文章,由TiKV亲爹Ed写的TiKV代码初探,可以从整

    2026年2月22日
    6
  • 怎么获取枚举的值_枚举是值类型吗

    怎么获取枚举的值_枚举是值类型吗最近在做一个学校的系统,其中用到一些枚举,可是在显示下拉列表时要绑定枚举的描述及其枚举值时就只一个一个的默认设死,这样不灵活。有没有其快捷方法?搜了下百度很多相关资料有了些许眉目,代码如下1.首先定

    2022年8月3日
    7
  • python运算符

    什么是操作符?简单的回答可以使用表达式4+5等于9,在这里4和5被称为操作数,+被称为操符。 Python语言支持操作者有以下几种类型。算术运算符比较(即关系)运算符赋值运算符

    2021年12月23日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号