逆向基礎------smali語法學習

.class public LHelloWorld;
.super Ljava/lang/Object;
#這個V是幹啥的,函數返回類型,V代表void、Z代表boolean、B代表byte、
#S代表short、C代表char、I代表int、J代表long、F代表float、D代表double、F代表float、L代表java類型
#[代表數據類型
.method public static main([Ljava/lang/String;)V
	.registers 4 #代表使用4個寄存器、分別是v0、v1、v2寄存器和一個參數寄存器
	.prologue
	#空指令
	nop
	nop
	nop
	nop
	#數據定義指令
	const/16 v0, 0x8
	const/4 v1, 0x5
	const/4 v2, 0x3
	#將v2寄存器的值賦予v1寄存器
	move v1,v2
	#數據操作指令 [是數組,[I是int一維數組
	new-array v0,v0,[I
	array-length v1, v0
	#實例操作指令,我把V0數組的長度給V1了,爲什麼V1繼續接受了字符串構造?那這樣是不是覆蓋前一個值了。
	#是不是因爲構造一個指定類型的新實例不能是數組類,所以這樣用string來代替,從而構造一個新實例類,引用對象給了v1
	new-instance v1, Ljava/lang/StringBuilder;
	#方法調用指令
	invoke-direct {v1},Ljava/lang/StringBuilder;-><init>()V
	#跳轉指令,如果v0不爲0則跳轉
	if-nez v0, :cond_0
	goto :goto_0
	:cond_0
	#數據轉換指令
	int-to-float v2, v2
	#數據運算指令
	add-float v2, v2, v2
	#比較指令,如果v1>v2, v0=-1; v1=v2,v0=0;v1<v2, v0=1
	cmpl-float v0, v1, v2
	#字段操作指令
	sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
	#構造字符串
	const-string v1, "Hello World"
	#方法調用指令
	invoke-virtual {v0, v1},Ljava/io/PrintStram;->println(Ljava/lang/String;)V
	:goto_0
	return-void


	return-void
.end method

smali -o HelloWorld.dex HelloWorld.smali會有錯誤,因爲版本不一樣,不支持這樣編譯了。

smali --help

 liyang@liyangdeMacBook-Air  ~/逆向  smali --help
usage: smali [-v] [-h] [<command [<args>]]

Options:
  -h,-?,--help - Show usage information
  -v,--version - Print the version of baksmali and then exit

Commands:
  assemble(ass,as,a) - Assembles smali files into a dex file.
  help(h) - Shows usage information

See smali help <command> for more information about a specific command
smali assemble HellWorld.smali -o HelloWorld.dex

纔可以。

adb push HelloWorld.dex /sdcard/

adb shell dalvikvm -cp /sdcard/HelloWorld.dex HelloWorld

執行即可。

發佈了50 篇原創文章 · 獲贊 33 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章