首页默认分类正文

【教程】安卓逆向,零基础入门详细小白教程

安卓逆向的话,smali是必学的,因为java源码编译成smali代码这个过程是不可逆的。


所需的工具:Mt管理器2代

下载地址http://t.cn/ES7GXsI


先来了解一下一个apk的基本结构

•Assets里存放的是apk的资源文件,比如声音,视频

•META-INF是签名信息,apk必须签名才能用,除非你有核心破解

•Res文件夹存放的是apk的布局文件,图标,按钮样式等

•Androidmanifest.xml用来配置程序的入口,活动,服务,权限等

•classes.dex则是程序的逻辑主体,代码就保存在这里面

•resources.arsc则是res的索引,res内的文件都有一个十六进制id,dex通过这个id调用它们

用mt管理器打开dex文件

可以看到这样的结构

类就相当于txt文件,里面保存着代码

打开一个类

点击那个指南针图标

方法里保存的就是程序的逻辑

下面开始讲Smali的基本语法(只讲常见语法)

.source 表示这个类对应的 Java 文件的文件名,看这个可以大概知道这个类的作用,如果代码被混淆了,.source 可能会没有值。

v+数字是寄存器,用来存贮一些数据

const const/4 const/16都是用来存储数值的

const-string则是用来存储字符串的

比如const v0, "0x1"就是将1赋值给v0

const-string v0, "Hello World!"则是将Hello World这串字符串保存到v0

if则是用来作跳转的

if-eq vA, vB, :cond_** 表示如果vA等于vB则跳转到:cond_** 

if-ne vA, vB, :cond_** 表示如果vA不等于vB则跳转到:cond_** 

if-lt vA, vB, :cond_** 表示如果vA小于vB则跳转到:cond_** 

if-ge vA, vB, :cond_** 表示如果vA大于等于vB则跳转到:cond_** 

if-gt vA, vB, :cond_** 表示如果vA大于vB则跳转到:cond_** 

if-le vA, vB, :cond_** 表示如果vA小于等于vB则跳转到:cond_** 

if-eqz vA, :cond_** 表示如果vA等于0则跳转到:cond_** 

if-nez vA, :cond_** 表示如果vA不等于0则跳转到:cond_** 

if-ltz vA, :cond_** 表示如果vA小于0则跳转到:cond_** 

if-gez vA, :cond_** 表示如果vA大于等于0则跳转到:cond_** 

if-gtz vA, :cond_** 表示如果vA大于0则跳转到:cond_** 

if-lez vA, :cond_** 表示如果vA小于等于0则跳转到:cond_**

gloto :cond_**则表示无条件跳转到:cond_**

cond_**就是一小段指令的合集

iget指令则是用来取得数值的

iget-boolean 是用于读取布尔值的,boolean只存在两种状态,0和1,即是和否

iput则相反

是用来写入的,和const的区别就是iput写入是对别的方法,类的寄存器进行的

move-result用于把前面运行的结果赋值

return则用于返回结果

.line无意义,用于表示该代码位于原java代码第几行

评论