溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

實(shí)驗(yàn)吧smali文件分析

發(fā)布時(shí)間:2020-06-16 15:25:40 來源:網(wǎng)絡(luò) 閱讀:606 作者:ToAlice 欄目:安全技術(shù)

試題網(wǎng)址: http://www.shiyanbar.com/ctf/1871


0x01

        首先我們得到了一個(gè)hello.dex文件,要把它反編譯為smali文件,使用工具baksmali,cmd命令:  java -jar baksmali-2.0.3.jar -o class/ Hello.dex ,就在當(dāng)前目錄下生成了一個(gè)文件夾,里邊有一個(gè)hello.smali 代碼如下:

.class public LHello;
.super Ljava/lang/Object;
.source "Hello.java"
# direct methods
.method public constructor <init>()V
    .registers 1
    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method
.method public static main([Ljava/lang/String;)V
    .registers 5
    .prologue
    .line 7
    new-instance v0, LHello;
    invoke-direct {v0}, LHello;-><init>()V
    .line 8
    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;  //v1存out對(duì)象的引用
    const/4 v2, 0x5    //把5符號(hào)擴(kuò)展32位賦值給v2
    const/4 v3, 0x3    //把3符號(hào)擴(kuò)展32位賦值給v3
    invoke-virtual {v0, v2, v3}, LHello;->foo(II)I   //調(diào)用函數(shù)foo
    move-result v0    //把函數(shù)的結(jié)果賦值給v0
    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V  //打印輸出v0
    .line 9
    return-void
.end method
# virtual methods
.method public foo(II)I
    .registers 5
    .prologue
    .line 3        
    add-int v0, p1, p2        // v0=p1+p2
    sub-int v1, p1, p2        // v1=p1+p2
    mul-int/2addr v0, v1        // v0=v0*v1
    return v0
.end method。  于是便可以進(jìn)行分析了.



0x02

            在這里首先稍微的科普一下,安卓程序都是由安卓虛擬機(jī)來運(yùn)行的,Dalvik虛擬機(jī)有兩種不同的寄存器表示方法,p命名法還有v命名法,假如說一個(gè)函數(shù)fun()使用了5個(gè)寄存器,2個(gè)顯式的參數(shù),并且這個(gè)方法是非靜態(tài)的方法,所以調(diào)用的時(shí)候會(huì)傳入一個(gè)隱式的fun對(duì)象引用,所以有三個(gè)參數(shù),局部變量使用前2個(gè)寄存器,參數(shù)使用后3個(gè),分別為v0,v1,v2,p0,p1,其中p0傳入對(duì)象的引用。

         

             然后說下Dalvik字節(jié)碼的類型,方法還有字段表示方法:

             1.類型:

                      V--void    Z--boolean  B--byte    S--short     C--char    I--int    F--float

                      D--double    L--java類型     [--數(shù)組類型 

               其中java類型一般都是LpackageName/name/Objname 來表示具體的那個(gè)對(duì)象,如Ljava/lang/String相當(dāng)于java.lang.String



             2.方法:

                    Lpackage/name/Objname;->MethodName(III)Z

                     III表示三個(gè)整型參數(shù),Z表示返回值是boolea型,


              3.字段:

                    字段由類型、字段名、字段類型構(gòu)成,字段名和字段類型之間使用:隔開

                    #instance fileds 實(shí)例字段

                    #static fields 靜態(tài)字段 


一些基本語法:

.prologue         方法開始

invoke-direct  調(diào)用函數(shù)

return-void  函數(shù)返回void

.end method  函數(shù)結(jié)束

new-instance  創(chuàng)建實(shí)例

iput-object  對(duì)象賦值

iget-object  調(diào)用對(duì)象


所以最終返回結(jié)果 (5+3)*(5-3)=16


當(dāng)然這里直接反編譯成jar然后反匯編為java代碼更容易看出來:


import java.io.PrintStream;
    public class Hello
{
      public static void main(String[] paramArrayOfString)
      {
            Hello localHello = new Hello();
            System.out.println(localHello.foo(5, 3));
      }
 
      public int foo(int paramInt1, int paramInt2)
      {
            return (paramInt1 + paramInt2) * (paramInt1 - paramInt2);
      }
}

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI