1. 程式人生 > >Smail語言 switch case 還原Java逆向分析

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;
        }

相關推薦

Smail語言 switch case 還原Java逆向分析

Java 逆向成Smail中間語言,一般都比較容易解讀。switch case 算是大家疑問比較多的一種結構。在case 值是連續的情況下,一般比較簡單,今天就不說了。我們今天來說一下case值離散的情況下怎麼分析。     直接上Smail程式碼 const/4 v0,

loadrunner C語言switch case

ecc image save ase style get res cti src 1 Action() 2 { 3 char *p=NULL; 4 web_reg_find("Fail=NotFound", 5 "Search=A

C語言switch case語句中定義變數問題

這個問題需要分開討論,C 語言和 C++ 的標準定義是不同的。 C++ int Caset(int a) { switch (a) { case 1: int b = 1; st

輸入年月日,輸出這個日期是該年的第幾天,java語言switch-case實現

充分利用switch-case 中break的特性,更方便的求出天數。 要點: 月份倒著寫,並且每個case 不要新增break;那麼,程式就會一直往下執行,直到month=1,進而求出了總的天數。 以下是原始碼: package third; impo

javaswitch case支持的7種數據類型

包裝類 mac 打開 拆箱 創建 eval get trade ocs switch表達式後面的數據類型只能是byte,short,char,int四種整形類型,枚舉類型和java.lang.String類型(從java 7才允許),不能是boolean類型。 在網上看到

Java中的switch-case語句

sub public return ID PE stat class a case cti class ArithmeticFunction {   public static int arithmetic(int a, int b, String operator) {

Java逆向基礎之ZKM字符串混淆與還原

java ZKM 字符串混淆 為了防止靜態分析,ZMK在混淆時對輸出的字符串使用對稱加密方法進行加密早期的ZKM只在靜態代碼塊的時候進行簡單的異或加密,後續版本使用了流加密技術進行二次加密看一個簡單的字符串輸出例子package com.vvvtimes.main; public class M

Java---switch...casecase可以匹配些什麼

switch…case語句 case 標籤可以是 : •型別為 char、byte、short 或 int 的常量表達式。 •列舉常量。 •從 Java SE 7 開始,case 標籤還可以是字串字面量。 測試整型 package demo; public class

Java基礎複習第三天:流程控制語句if()...else、switch() case、do while()、for迴圈()

  目錄 第一章 流程控制 1.流程控制的分類 2.死迴圈 3.跳出語句(迴圈控制語句) 4.巢狀迴圈 從下次開始,會盡量會直接懟上程式碼,減少文字 ----------------------------------------------------

Java switch case和陣列

Java switch case 語句 switch case 語句判斷一個變數與一系列值中某個值是否相等,每個值稱為一個分支。 語法 switch case 語句格式: switch(expression){ case value : //語句 break;

java中易錯的switch case

java中,switch語句的陷阱 switch中的default,一般用在最後,表示非以上的任何情況下而發生的情況, 我們一般習慣在他的後面加上個break。但是,如果default不是在最後, 而是在前面或中間會發生什麼情況呢: 先看看default在句首的情況: int i

ST語言和C語言關於case of 和switch case語句的區別

C語言中,case後不可直接跟多個常量,要如下圖所示使用(不要忘記defalut) switch(int,char){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: //todo break; defalut: br

java中使用switch case報錯case expressions must be constant expressions

一、發現問題 private int CLICK_QUERY = 1; private int CLICK_RESET = 2; @Override public void onClick(View v) {  int tag = (Integer) v.getTag(); &nb

if語句,if...else if語句和switch...case語句的區別和分析

當我們有一個判斷條件的時候,顯然用if語句比較方便有效。但當判斷條件很多的時候,我們可以使用if語句或者if....eles 語句和switch  case 語句。 if...else if語句和多個if語句的區別還是很大的,if...else if在任何一個環節滿足條件的時候就將會終

java--大量switch-case程式碼加入列舉型別進行優化

    當專案存在大量的switch-case條件判斷時,會把讓整個專案看起來非常low,以下tich提出一種優化方法,可提高程式碼的維護性,讓程式碼變得更加簡潔,易維護。 先看原始碼: String jrnDDZName = null;

Java學習筆記之——switch-case條件結構

語法: switch(變數){   case 常量1:     執行語句;     break; case 常量2:     執行語句;     break; case 常量3:     執行語句;     break; ………… default:   

java switch..case語句

語法: switch(變數){ case 變數值1: 程式碼塊1; break; case 變數值2: 程式碼塊2; break; ... case default: 程式碼塊d; break; } swit

java switch case 語句接列舉類 實現判斷

首先定義列舉類,如: public enum DataTypeEnum {     /**小時型別值**/     HOUR("hour"),     /**小時型別值**/     DAY("day"),     /**小時型別值**/     WEEK("week")

C語言進階-if....else和switch...case效率問題

1.switch用來根據一個整型值進行多路分支,並且編譯器可以對多路分支進行優化 2.switch-case只將表示式計算一次,然後將表示式的值與每個case的值比較,進而選   擇執行哪一個case的語句塊 3.if..else 的判斷條件範圍較廣,每條語句基本上獨立的,每次判斷時都要條件

Java: switch......case.....語句

switch(expression){ case value : //語句 break; //可選 case value : //語句 break; //可選 //你可以有任意數量的case語句 default