逆向破解必备基础smail基础语法

本文解析了Smali语言的基础结构,包括变量声明、方法调用(super/invoke-direct)、条件分支操作(if-eqv~if-lez),并以实例展示了if和for函数的转换。深入理解这些核心概念有助于安卓逆向工程师进行代码分析与修改。
摘要由CSDN通过智能技术生成

// 此代码由autojs交流群于群里和网上整理提供 一键加群 如有侵权,请联系删除

访问 资源网站获取更多实战视频
Smali基本语法

.field private isFlag:z  定义变量

.method  方法

.parameter  方法参数

.prologue  方法开始

.line 12  此方法位于第12行

invoke-super  调用父函数

const/high16 v0, 0x7fo3  把0x7fo3赋值给v0

invoke-direct  调用函数

return-void  函数返回void

.end method  函数结束

new-instance  创建实例

iput-object  对象赋值

iget-object  调用对象

invoke-static  调用静态函数

============

条件跳转分支(最常用。):
nez改eqz,eq改ne这类,逻辑取反,实现破解的目的。

"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_

=============

if函数的java代码:

private boolean ifSense(){
boolean tempFlag = ((3-2)==1)? true : false;
if (tempFlag) {
return true;
}else{
return false;
}
}
if函数分析:

.method private ifSense()Z
.locals 2

.prologue
.line 22
const/4 v0, 0x1     // v0赋值为1

.line 24
.local v0, tempFlag:Z
if-eqz v0, :cond_0            // 判断v0是否等于0, 不符合条件向下走, 符合条件执行cond_0分支

.line 25
const/4 v1, 0x1            // 符合条件分支

.line 27
:goto_0
return v1

:cond_0
const/4 v1, 0x0            // cond_0分支

goto :goto_0

.end method

###文字描述:如果符合if分支则程序往下走,最终return ; 而如果条件不符合则会走到 :cond_0分支 , 最终执行 goto :goto_0走回 :goto_0返回

============

for函数java代码:

private void forSense(){
listStr = new ArrayList(COUNT);
for (int i = 0; i < COUNT; i++) {
listStr.add(“现在轮到我上场乐”);
}
}

for函数分析:

.line 40
const/4 v0, 0x0

.local v0, i:I
:goto_0
if-lt v0, v3, :cond_0            //  if-lt判断数值v0小于v3 ,    如不符合往下走, 符合执行分支 :cond_0

.line 43
return-void

.line 41
:cond_0                // 标签
iget-object v1, p0, Lcom/example/smalidemo/MainActivity;->listStr:Ljava/util/List;                // 引用对象

const-string v2, "\u73b0\u5728\u8f6e\u5230\u6211\u4e0a\u573a\u4e50"

invoke-interface {v1, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z        // List是接口, 所以执行接口方法add

.line 40
add-int/lit8 v0, v0, 0x1    // 将第二个v0寄存器中的值,加上0x1的值放入第一个寄存器中, 实现自增长

goto :goto_0                // 回去:goto_0标签
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值