免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。第一次接触安卓逆向写的很烂,后面有机会再全部重写。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:36.安卓逆向-壳-脱壳实战
上一个内容里写了脱壳实战,通过破解一个加固的app,然后找它的加密参数进行的实战,上一个内容最后发现它的加密是用c语言实现的,然后也通过IDA工具找到了它的加密函数,并用IDA生成伪代码的功能简单的看了看,然后本次就要开始写如何看懂IDA反编译的汇编代码了
首先介绍smali
smali数据类型都是用一个字母表示,如果熟悉java语言的数据类型,会发现smali数据类型的字母是java语言的基本数据类型首字母的大写,除了boolean类型外,boolean类型使用大写的Z来表示
smali是Dalvik的寄存器语言,smali代码是用dex反编译来的
然后简单了解一下概念
数据类型对应
常用指令
java代码转smali,Android Studio有一个java2smali插件可以把java转成smali
然后如下图安装java2smali插件
安装完之后,如下图,就会有Compile to Smali了,点击它就可以把java代码编译成smali了
然后java代码
编译的samli代码
然后在被编译成smali目录下也有smali文件,如下图红框
smali说明
# 定义类部分
.class public Lcom/example/course1/Samli;
.super Ljava/lang/Object;
.source "Samli.java"
# 定义类字段部分-静态字段
# static fields
.field private static flag:Ljava/lang/String;#字符串类型
.field public static run:Z#boolean类型
# 定义类字段部分-非静态字段
# instance fields
.field public name:Ljava/lang/String;#字符串类型
.field public num:I #int类型
# 初始化静态的东西
# direct methods
.method static constructor <clinit>()V # clinit方法名 V返回类型,.method static意思是静态方法
.registers 1 #寄存器 1表示一个寄存器
.prologue #方法的开始
.line 4 #源代码(java代码)中的行号,这里表示第4行
const-string v0, "jb666" #把字符串jb666存放到寄存器v0里面
#下面的一句意思是把 v0 的值放到 flag 里
sput-object v0, Lcom/example/course1/Samli;->flag:Ljava/lang/String;
.line 7 #源代码(java代码)中的行号,这里表示第7行
const/4 v0, 0x1#把十六进制的数字1放到v0里
#下面的一句意思是把 v0 的值放到 run 里,0x1就表示true
sput-boolean v0, Lcom/example/course1/Samli;->run:Z
#下面一句意思是方法的结束,返回值是void
return-void
.end method #方法结尾
#类的构造方法
.method public constructor <init>()V
.registers 1
.prologue
.line 3
# p0是当前对象的引用,Ljava/lang/Object;-><init>()V意思是调用父类的构造方法
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method