helloword.java.bak,安卓移動逆向(四)-Smail_HelloWorld

着手編寫一個Smail類型的HelloWord

開始編寫

不要直接復制,要一個一個字符敲,否則沒有意義!!

不要直接復制,要一個一個字符敲,否則沒有意義!!!!

不要直接復制,要一個一個字符敲,否則沒有意義!!!!!!.class public LHelloWorld; #定義類名

.super Ljava/lang/Object; #定義父類

.method public static main{[Ljava/lang/String;}V #聲明main()

.registers 4 #程序中使用v0,v1,v2寄存器與一個參數寄存器

.prologue #代碼起始指令

return-void #沒有返回值void

.end method

這是一段HelloWorld的架構代碼,定義了一個可編譯運行的DEX文件的最小組成部分,下面我們將在.prologue(代碼起始指令)下編寫具體代碼:#空指令

nop

nop

nop

#數據定義指令

const/16 v0, 0x8 #v0=0x8

const/4 v1, 0x5 #v1=0v5

const/4 v2, 0x3 #v2=0x3

#數據操作指令

move v1, v2 #v1=v2

#數組操作指令

new-array v0,v0,[I # v0 = new int[v0(8)];

array-length v1, v0 # v1 = v0(8);

#實例操作指令

new-instance v1, Ljava/lang/StringBuilder; #v1 = new StringBuilder();

#方法調用指令

invoke-direct{v1}, Ljava/lang/StringBuilder;->()V #(不確定是不是這個意思) void init(v1)

#跳轉指令

if-nez v0, :cond_0 #如果v0!=0;則跳轉到cond_0

goto : goto_0 #否則就進入goto_0

:cond_0 #cond_0開始

#數據轉換指令

int-to-float v2,v2 #v2 = (float)v2

#數據運算指令

add-float v2,v2,v2 #v2 = v2+v2

#比較指令

cmpl-float v0,v2,v2 #if(v2==v2) v0 = 0

#字段操作指令

sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream; # v0 = out();

const-string v1,"HelloWorld" #構造字符串 v1 = "HellpWorld"

#方法調用指令

invoke-virtual{v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/String;)V #out.println(v1)

#返回指令

:goto_0 #goto_0 開始

完成代碼如下,.class public LHelloWorld; #定義類名

.super Ljava/lang/Object; #定義父類

.method public static main([Ljava/lang/String;)V #聲明main()

.registers 4 #程序中使用v0,v1,v2寄存器與一個參數寄存器

.prologue #代碼起始指令

#空指令

nop

nop

nop

#數據定義指令

const/16 v0, 0x8 #v0=0x8

const/4 v1, 0x5 #v1=0v5

const/4 v2, 0x3 #v2=0x3

#數據操作指令

move v1, v2 #v1=v2

#數組操作指令

new-array v0,v0,[I # v0 = new int[v0(8)];

array-length v1, v0 # v1 = v0(8);

#實例操作指令

new-instance v1, Ljava/lang/StringBuilder; #v1 = new StringBuilder();

#方法調用指令

invoke-direct{v1}, Ljava/lang/StringBuilder;->()V #(不確定是不是這個意思) void init(v1)

#跳轉指令

if-nez v0, :cond_0 #如果v0!=0;則跳轉到cond_0

goto : goto_0 #否則就進入goto_0

:cond_0 #cond_0開始

#數據轉換指令

int-to-float v2,v2 #v2 = (float)v2

#數據運算指令

add-float v2,v2,v2 #v2 = v2+v2

#比較指令

cmpl-float v0,v2,v2 #if(v2==v2) v0 = 0

#字段操作指令

sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream; # v0 = out();

const-string v1,"HelloWorld" #構造字符串 v1 = "HellpWorld"

#方法調用指令

invoke-virtual{v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/String;)V #out.println(v1)

#返回指令

:goto_0 #goto_0 開始

return-void #沒有返回值void

.end method

然后我們可以通過命令java -jar E:\Reverse\smali_baksmali\smali.jar -o classes.dex HelloWorld.smali來將Smali文件打包成dex文件(這里的”E:\Reverse\smali_baksmali\smali.jar”要是配置了環境變量就不用這樣帶路徑了,下面的也是一樣)

如果沒有報錯,就會在當前目錄下生成classes.dex(報錯了就根據提示調錯就好)

然后我們將classes.dex壓縮為HelloWorld.zip

測試的時候要保證電腦連着一個手機(已Root)或者有一個模擬器

執行adb push HelloWorld.zip /data/local/

有的童鞋可能會報下面這個錯誤adb server version (31) doesn't match this client (39)

* daemon started successfully *

error: no devices/emulators found

原因是新版adb錯誤,我們下載舊版的adb用舊版的adb運行即可

最后,執行adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld就可以了,附圖

4b1440be361723375e33609237da10b1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值