實(shí)驗(yàn)吧smali文件分析-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站主營營口網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),營口h5重慶小程序開發(fā)搭建,營口網(wǎng)站營銷推廣歡迎營口等地區(qū)企業(yè)咨詢

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

名稱欄目:實(shí)驗(yàn)吧smali文件分析-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://bm7419.com/article12/hdgdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、做網(wǎng)站、域名注冊(cè)、App開發(fā)、企業(yè)網(wǎng)站制作、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司