綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[教程] Smali注入之打造屬於自己的安卓crack利器

[複製連結] 查看: 3877|回覆: 4|好評: 0
跳轉到指定樓層
樓主
fam1001 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2016-3-22 15:08

馬上加入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,代碼如下:

  1. .class public Lcrack;
  2. .super Ljava/lang/Object;
  3. .source "crack.java"

  4. .method public static log(Ljava/lang/String;)V
  5.     .locals 1
  6.     .prologue

  7.     const-string v0, "info"
  8.     invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
  9.     return-void
  10. .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日誌輸出,代碼如下:

  1. .class public Lcrack;
  2. .super Ljava/lang/Object;
  3. .source "crack.java"

  4. .method public static log(Ljava/lang/String;)V
  5.     .locals 1
  6.     .prologue

  7.     const-string v0, "info"
  8.     invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
  9.     return-void
  10. .end method
複製代碼


把crack.smali放進smali目錄,在要查看的,保存了字符串的寄存器vx的下面,新增代碼:

  1. invoke-static {vx}, Lcrack;->log(Ljava/lang/String;)V
複製代碼


保存并重新编译,在手机或模拟器上安装软件,连上电脑,打开cmd命令行:

「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 8碎鑽 +6 幫助 +7 收起 理由
greatfuture2010 + 1 + 1 非常讃
a04500000 + 1 好內容。朕有賞,還不謝主隆恩.
woolala + 1 + 1 非常讃
cheangerlove + 1 + 1 非常讃
liwil + 1 + 1 非常讃
ben3336669 + 1 + 1 非常讃
names + 1
球-球 + 1 好內容,老衲來為這篇文章開開光.

查看全部評分

收藏收藏6 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
liwil | 收聽TA | 只看該作者
發表於 2016-9-3 13:50
不錯,謝謝分享!

可以幫我嗎?
求會 JAVA或SMALI 碼幫忙修改apk,感謝!
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 0 反對 1

使用道具 舉報

板凳
cheangerlove | 收聽TA | 只看該作者
發表於 2016-9-10 23:04
終於找到教學smali插入代碼的文了.......!!!!!!!!!
想給你一萬個碎鑽
但我真的沒有..
萬分感謝!!
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
csw123 | 收聽TA | 只看該作者
發表於 2016-9-14 09:55
very goooood !!! 很棒!谢谢分享。
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
coffee5549 | 收聽TA | 只看該作者
發表於 2017-4-10 22:14

很棒!谢谢分享.............
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則