您好,登錄后才能下訂單哦!
試題網(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);
}
}
免責(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)容。