Android应用逆向分析

本文详细介绍了Android逆向工程的基础知识,包括Java语言、smali汇编、dexodex转换及Android NDK开发。深入探讨了加壳与脱壳技术,特别是vmp技术的应用。文章还讲解了APK结构分析,逆向分析工具如Android SDK、APKTool、jarsigner等的使用方法,以及逆向步骤,包括解压apk、拆卸classes.dex文件、静态分析、代码注入等。此外,还提供了逆向代码修改的具体实例,如添加Toast语句,以及如何重新打包并签名APK。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android逆向入门
  • Java语言, smali汇编 dex odex ->android ndk开发
  • 加壳与脱壳(vmp技术)
    • 一般需要保护的文件就是dex,so文件
APK结构

* ![74997bad7ea71341549483a036c084a0.jpeg](en-resource://database/4586:1)

  • 逆向分析工具:

    • Android SDK
    • APKTool
    • jarsigner
    • keytool
  • 逆向步骤:

    • 解压apk和拆卸classes.dex文件
    • 在APP上进行静态分析
    • 在APP中注入代码
命令行的方式进行操作:
  • 首先使用Android studio编译生成apk文件
  • 下载apktool文件,并将文件名改为apktool
  • 然后将你的apk文件拷贝出来将后缀名改为.zip文件,解压
    在这里插入图片描述
java -jar apktool.jar d xxx.apk

在这里插入图片描述

  • 这时候在生成的文件下会有一个smali文件,主要区别就是Java文件全部转换为smali文件,smali文件是个Android虚拟机使用的寄存器语言。
  • 在HelloWorld程序中添加以下代码即为Toast语句
invoke-virtual {p0}, Lcom/vogella/android/hackdemo/MainActivity;->getApplicationContext()Landroid/content/Context;
    move-result-object v1
    const/4 v3, 0x0
    invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)
    Landroid/widget/Toast;
    move-resulkt-object v1
    invoke-virtual {v1}, Landroid/wiget/Toast;->show()V
  • 打包
java -jar apktool.jar b app-debug -o newdebug.apk

在这里插入图片描述

  • 在同目录下就会出现新的apk文件,但是此APK文件是没有签名的APK 所以安装之后会出现无法进行解析的错误:
  1. 首先执行查看keystore文件别名:
keytool -list -v -keystore [keystore文件路径] -storepass [keystore文件密码]

2.然后执行签名命令:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名

在这里插入图片描述
3.接着将之前的程序卸载进行安装我们呢刚才通过修改smali代码的apk即可

IDE(AndroidKiller)操作:
  • 使用的工具在这里下载

  • 直接使用该应用打开APK即可

  • 从bin文件下可以看出和上面的原理相同:在这里插入图片描述

  • smali语法简述:

V void
Z boolean
B byte
S short
C char
F float
I int 
J long
D double
[ array

比如:
Ljava/lang/String; //String类型
[I //一维int数组
  • 方法全名:
Lpackage/name/ObjectName;->methodName(III)Z
(III)Z方法签名
  • 方法体:

    • BakSmali生成的方法代码以.method指令开始,以.end method指令结束
    • 根据方法的类型不同,可以会在方法前加 # 表示方法类型
  • 虚方法:

const-class v1, Lcn/woblog/markdowndiary/domain/Note
move-result-object v0
check-cast v0, Lcn/woblog/markdowndiary/domain/Note
return-object v0
  • 直接方法:
invoke-direct {p0} ,Ljava/lang/Object;-><init>()V
  • 静态方法:
move-result-object
return-object v1
  • 字段:
field private static instance:Lcn/woblog/markdowndiary/respository/LocalNoteRepository;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值