Smail语言 switch case 还原Java逆向分析

Java 逆向成Smail中间语言,一般都比较容易解读。switch case 算是大家疑问比较多的一种结构。在case 值是连续的情况下,一般比较简单,今天就不说了。我们今天来说一下case值离散的情况下怎么分析。

    直接上Smail代码

const/4 v0, 0x0

    .local v0, "c":I
    const/4 v1, 0x0

    .local v1, "d":I
    const/4 v2, 0x0

    .line 28
    .local v2, "e":I
    iget v3, p0, Lcom/a/b/MainActivity;->b:I   //这个就是我们要判断的值

    packed-switch v3, :pswitch_data_0        //进入case 模块 ,根据v3值的不同,实现不同的跳转

    .line 41
    :pswitch_0                                              // case 0分支,注意这里的pswitch_0 并不是指 v3 ==0的时候跳转的分支。而只是代                                                                       码块的调用标记而已 。具体原因下面会说明。                                                               
    div-int v0, v1, v2

    .line 47
    :goto_1
    return-void

    .line 19
    .end local v0    # "c":I
    .end local v1    # "d":I
    .end local v2    # "e":I

    .line 30
    .restart local v0    # "c":I
    .restart local v1    # "d":I
    .local v2, "e":I
    :pswitch_1
    add-int v0, v1, v2

    .line 31
    goto :goto_1

    .line 34
    :pswitch_2                               //  case 2 ,这里pswitch_2 也是代码块调用标记
    sub-int v0, v1, v2

    .line 35
    goto :goto_1

    .line 37
    :pswitch_3
    mul-int v0, v1, v2

    .line 38
    goto :goto_1

    .line 28
    :pswitch_data_0
    .packed-switch 0x3    // 从这一行开始,才是对v3真正的值进行说明。 packed-switch 0x3表示  v3的初始值为3 
        :pswitch_1       //v3 == 3 的时候,跳转到代码块  pswitch_1
        :pswitch_0       //v3 == 4 的时候,跳转到代码块  pswitch_0
        :pswitch_2       //v3 == 5 的时候,跳转到代码块  pswitch_2
        :pswitch_0      // v3 == 6 的时候,跳转到代码块  pswitch_0
        :pswitch_3      // v3 == 7 的时候,跳转到代码块  pswitch_3
    .end packed-switch

所以翻译成java代码是

int c=0,d = 0,e=0;
        
        
        switch (b) {
        case 3:
            c = d+e;
            break;
        
        case 5:
            c = d-e;
            break;
        case 7:
            c = d*e;
            break;
            
        default:
            c = d/e;
            break;
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闽农qq:994955138

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

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

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

打赏作者

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

抵扣说明:

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

余额充值