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

    谨此以本文开始记录我的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下载后会有两个文件,一个.jar(例如apktool_2.3.3.jar 需要把名字改成apktool.jar) 一个apktool.bat 。(这两个文件在这里下载,如图:)

同刚才一样在cmd命令下进入刚才文件夹(同样可以新建一个),连同我们刚才那个后缀为apk的安装包一起放入,输入如下命令:

apktool d app-release.apk   此处app-release为apk名称

得到一个新的app-release(对应apk名称)文件夹。流程如图:


这个app-release文件夹下会得到若干文件,主要内容介绍如下:

  • 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已经可以投入使用,如果需要更快更好的体验还需要进行一次字节对齐的操作(后续分析)。

Android逆向系列(一):初探Android逆向相关推荐

  1. Android复习系列③之《Android筑基》

    1.Android系统架构 应用层 应用框架层(Framwork) 系统运行库层 Linux内核层 2.四大组件 1. Activity 1.1 生命周期 下面这张图一定要仔细看看,并能理解每一个步骤 ...

  2. android模拟点击系统打开apk按钮,Android开发系列: 电脑端Android模拟器安装使用教程...

    如今说到什么智能手机最火,那很多人肯定会说android系统的手机.如果你还没有Android手机,又想买一部试试,可是价格都不便宜,买来不适合自己怎么办?那么可以先在电脑上安装一个Android模拟 ...

  3. ANDROID Porting系列一、ANDROID编译系统

    译自:http://source.android.com/porting/build_system.html Android使用一个自定义生成系统生成工具,二进制文件和文档.本文档提供了一个建立And ...

  4. 安卓逆向系列教程 4.4 逆向云播 VIP

    4.4 逆向云播 VIP 作者:飞龙 这次的软件是刀哥云播,在这里下载:http://www.xuepojie.com/thread-23860-1-1.html 我们先分析一下行为: 打开之后的界面 ...

  5. Android复习系列④之《Android进阶》

    Android进阶 1 Okhttp OkHttpClient相当于配置中心, 所有的请求都会共享这些配置(例如出错是否重试.共享的连接池) . 1.OkHttpCLient中的配置主要有: Disp ...

  6. Android技术馆系列之:Android 碎片的介绍

    借用海子的一句诗来抒发一下感慨"每天喂马砍柴,面朝大海,春暖花开" Android 碎片(Fragment) 碎片是活动的一部分,是的活动更加的模块化设计.我们可以认为碎片是一种子 ...

  7. Android系统启动系列----init进程

    Android系统启动系列 Android系统启动系列----init进程 Android系统启动系列----Zygote进程 引言 在开发app的过程中,是不是会有疑问: java程序的运行不是从m ...

  8. 移动安全Android逆向系列:Dalvik概念破解实例

    本篇文章是Android逆向系列的第三篇,开始介绍Dalvik虚拟机的相关知识,认识dex和smali文件格式和熟悉Dalvik字节码及指令集,对Dalvik指令集有个大概的了解就可以开始简单的反编译 ...

  9. 【原创】【2021 android逆向系列】2:MIUI安装xposed问题全览(从本人简书博客移入)

    书接上文[原创][android逆向系列]1:真机(小米note 3)root,本文和大家说一说MIUI安装xposed爬过的坑,以及如何安装xposed~ 一.xposed基础知识: xposed ...

  10. Android逆向系列--JDWP协议

    Android逆向系列--JDWP协议 背景 简介 使用 源码调用 参考 背景 经常会遇到各种各样需要使用jdwp知识的场景,比如调试Java源码.比如抓帧等等,这些关联知识点通常都会极其复杂,如果不 ...

最新文章

  1. 我在中关村给不了你国贸的爱
  2. Linking Containers Together
  3. Spring Boot 五种热部署方式,再也不用老重启了!
  4. [Vue warn]: You are using the runtime-only build of Vue 牵扯到Vue runtime-compiler与runtime-only区别
  5. 学习Asp.net MVC相关资料
  6. 格密码教程(五):Babai‘s algorithm和求解apprCVP算法
  7. 《2021新青年生长力报告》:水果青年、农货青年、设计青年,哪个最潮?
  8. 20155207 2016-2017-2 《Java程序设计》第七周学习总结
  9. Atitit 图像处理30大经典算法attilax总结
  10. 巧妙的使用RDP报表工具(免费报表工具、报表设计器)Excl绘制报表
  11. 拉格朗日法建立动力学方程
  12. 论文公式编号右对齐_毕业论文的封面格式要求有哪些?
  13. 计算机专业logo元素,计算机系logo设计大赛
  14. Chromium浏览器的一些使用总结
  15. python多元线性回归报错(assert pytype not in (tokenize.NL, tokenize.NEWLINE))
  16. 《图解HTTP》--返回结果的HTTP状态码
  17. el-input-number 默认值设置失效
  18. java opencv 视频教程_OpenCV视频目标跟踪示例教程(Meanshift)
  19. ssm基于SSM的南昌旅游网站管理系统设计与实现 毕业设计源码101407
  20. 手机QQ锁定?嘿???取之有道???

热门文章

  1. eve-ng ubuntu 20.04 设置iptables
  2. Docker教程(一)入门教程
  3. android studio编写阿里云物联网APP的基本步骤(附CSDN视频教程链接)
  4. 网红超火罗马桌面时钟效果
  5. C++编程第一课《编程是一门技术——认识C++》
  6. C++第一课(初识C++)
  7. WindowsDBCA建库
  8. 【TensorFlow】基础教程
  9. 海康修改云存储服务器,ivms-4200云存储服务器
  10. python logging配置时间或大小轮转