方格社区-淘金信息差

 找回密码
 立即注册

[金融] 安卓逆向破解之Smali基本语法

 火.. [复制链接]
发表于 2022-5-30 18:05:47 | 显示全部楼层 |阅读模式
本帖最后由 不爱江山爱美人 于 2022-5-30 18:09 编辑

10001.png

学习安卓逆向破解,Smali语法是绕不开的,我们看一些用MT管理器破解vip,去广告的教程,都是直接给你说改哪个地方,今天这篇文章看完你就了解为啥要改哪些代码了。
常用基础的smali语句函数有:

Const 赋值
return-void返回空
Goto 跳转
Cond 分支
判断语句:

if-eq 等于
if-ne 不等于
if-lt 小于
f-ge 大于等于
if-gt 大于
if-le 小于等于
if-eqz 等于
if-nez 不等于
if-ltz 小于
if-gez 大于等于
if-gtz 大于


上面是常用的语法,着重记一下,下面的基本语法,需要理解并掌握:

.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  调用静态函数

条件跳转分支:

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

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


具体案例,看一下java代码转给Smali语言:

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


if函数smali语法:
.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<String>(COUNT);
    for (int i = 0; i < COUNT; i++) {
        listStr.add("现在轮到我上场乐");
    }
}


for循环smali语法:


.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标签


###文字描述:设定一个标签goto_0, 判断v0小于v3, 符合执行分支:cond_0 ,然后又跑回:goto_0做继续判断

一般我们用MT管理器看到并修改的代码都是以smali语法显示的,而我们开发APP的代码通常是java语言,对于逆向破解来说,掌握这之间的转换,破解就手到擒来了!




回复

使用道具 举报

发表于 2022-5-31 11:29:36 来自手机 | 显示全部楼层
     
回复 支持 反对

使用道具 举报

发表于 2022-6-21 07:55:18 来自手机 | 显示全部楼层
牛批牛批  
回复 支持 反对

使用道具 举报

发表于 2023-4-16 08:37:54 来自手机 | 显示全部楼层
学习学习  
回复 支持 反对

使用道具 举报

发表于 2023-12-29 18:49:09 来自手机 | 显示全部楼层
哦哦哦     
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表