馬上加入Android 台灣中文網,立即免費下載應用遊戲。
您需要 登錄 才可以下載或查看,沒有帳號?註冊
x
關於Smali注入大家應該瞭解過,網上有不少教程。那些注入代碼看上去簡單,實際用起來得花不少功夫。
普通的注入就是在軟體源代碼中新增幾行代碼,用於改變軟體的功能,或查看某個寄存器在執行中具體的值。
需要注意的地方是:新增的注入代碼所使用的寄存器不影響其他代碼的執行。當注入代碼較多時,這個要求就變得很困難了。
在這裡我的解決辦法是:把注入代碼寫進自己專屬的crack.smali,然後在要注入的地方調用crack.smali裡的注入方法即可,只用一行注入代碼,而且不影響其他寄存器。
舉個例子說明下兩種方法的區別,假設原軟體中有以下代碼:
.method public methodName()Ljava/lang/String;
.locals 4
.prologue
const-string v0, "test1"
const-string v3, "test2"
invoke-static {v0}, Lpackage/name/ObjectName;——>methodName1(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
invoke-static {v1}, Lpackage/name/ObjectName;——>methodName2(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
invoke-static {v3}, Lpackage/name/ObjectName;——>methodName3(Ljava/lang/String;)V
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v0, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
return-object v0
.end method
假如我要查看move-result-object v1和move-result-object v2,兩處中v1、v2的值該如何注入?
普通的log.d注入方法如下(可以用Logcat查看日誌):
.method public methodName()Ljava/lang/String;
.locals 5
.prologue
const-string v0, "test1"
const-string v3, "test2"
invoke-static {v0}, Lpackage/name/ObjectName;——>methodName1(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
const-string v4, "info"
invoke-static {v4, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
invoke-static {v1}, Lpackage/name/ObjectName;——>methodName2(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
const-string v4, "info"
invoke-static {v4, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
invoke-static {v3}, Lpackage/name/ObjectName;——>methodName3(Ljava/lang/String;)V
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v0, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
return-object v0
.end method
在上面的代碼中,我先是修改了開頭的「.locals 5」,表示使用的寄存器為v0-v4。然後我用v4作為log.d的第一個參數,寄存器v1、v2為第二個參數。
由於原代碼中,v0、v1、v2、v3從頭到尾都有使用,所以注入時使用這幾個寄存器會影響軟體的正常執行,所以我才修改「.locals」開闢新的寄存器v4。
明顯這樣注入很麻煩。而且剛好v1、v2都是字符串,符合log.d的要求。如果v1、v2為整數值,注入就更加複雜了。
下面看看建立了crack.smali的注入會如何。
假設我已經有了個crack.smali,代碼如下:
- .class public Lcrack;
- .super Ljava/lang/Object;
- .source "crack.java"
-
- .method public static log(Ljava/lang/String;)V
- .locals 1
- .prologue
-
- const-string v0, "info"
- invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
- return-void
- .end method
複製代碼
把crack.smali放到反編譯後的smali根目錄,在源代碼中注入:
.method public methodName()Ljava/lang/String;
.locals 4
.prologue
const-string v0, "test1"
const-string v3, "test2"
invoke-static {v0}, Lpackage/name/ObjectName;——>methodName1(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
invoke-static {v1}, Lcrack;->log(Ljava/lang/String;)V
invoke-static {v1}, Lpackage/name/ObjectName;——>methodName2(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
invoke-static {v2}, Lcrack;->log(Ljava/lang/String;)V
invoke-static {v3}, Lpackage/name/ObjectName;——>methodName3(Ljava/lang/String;)V
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v0, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
return-object v0
.end method
明顯比前面的注入方式簡單多了。crack.smali的方法可以不斷豐富,需要用時信手拈來。
既然如此,就讓我們打造屬於自己的安卓crack利器吧!
最基本的crack.smali推薦加入log日誌輸出,代碼如下:
- .class public Lcrack;
- .super Ljava/lang/Object;
- .source "crack.java"
-
- .method public static log(Ljava/lang/String;)V
- .locals 1
- .prologue
-
- const-string v0, "info"
- invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
- return-void
- .end method
複製代碼
把crack.smali放進smali目錄,在要查看的,保存了字符串的寄存器vx的下面,新增代碼:
- invoke-static {vx}, Lcrack;->log(Ljava/lang/String;)V
複製代碼
保存并重新编译,在手机或模拟器上安装软件,连上电脑,打开cmd命令行:
|
評分
-
查看全部評分
|