[Android Security] APK自我保護 - 字串處理

來源:互聯網
上載者:User

標籤:方案   編碼方式   target   tar   破解   string   data   blog   rect   

cp : 1190000005128037

在開發過程中字串不可避免,但是這些字串也可能是破解的關鍵點,比如伺服器的地址和錯誤提示這些敏感的字串資訊。如果這些字串採用寫入程式碼方式,很容易通過靜態分析擷取。之前的一篇blog以提示的字串以突破點 Android程式逆向分析

普通方式定義字串

Java 中定義一個字串:

private String normalString(){    String str = "Hello world";    return str;}

 

反編譯的.smali代碼

.method private normalString()Ljava/lang/String;    .registers 2    .prologue    .line 16    const-string v0, "Hello world"    .line 17    .local v0, "str":Ljava/lang/String;    return-object v0.end method

 

可以看出來 const-string 關鍵字後面就是定義的字串值,甚至可以使用自動化分析工具批量提取。

解決方案1. StringBuilder 拼接

StringBuilder 類通過 append 方法來構造需要的字串。這種方式可以增加自動化分析的難度,如果要擷取完整的字串就必須進行相應的詞法文法解析了。

Java 中拼接字串代碼:

private String buildString(){    StringBuilder builder = new StringBuilder();    builder.append("Hello");    builder.append(" ");    builder.append("world");    return builder.toString();}

 

反編譯的.smali代碼:

.method private buildString()Ljava/lang/String;    .registers 3    .prologue    .line 21    new-instance v0, Ljava/lang/StringBuilder;    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V    .line 22    .local v0, "builder":Ljava/lang/StringBuilder;    const-string v1, "Hello"    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;    .line 23    const-string v1, " "    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;    .line 24    const-string v1, "world"    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;    .line 25    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;    move-result-object v1    return-object v1.end method

 

可以看出反編譯後的 .smali 代碼對破解增加了一定的難度,並不能一眼就識別出來。

2. 編碼混淆

編碼混淆是在硬式編碼時候將字串先轉換成 16進位 的數組或者 Unicode 編碼,在使用的時候在轉回字串。這種方式在反編譯成 .smali 代碼比 StringBuilder 方式更難直接識別。

Java代碼:

private String encodeString(){    byte[] strBytes = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64};    String str = new String(strBytes);    return str;}

 

反編譯 .smali 代碼:

.method private encodeString()Ljava/lang/String;    .registers 4    .prologue    .line 29    const/16 v2, 0xb    new-array v1, v2, [B    fill-array-data v1, :array_e    .line 30    .local v1, "strBytes":[B    new-instance v0, Ljava/lang/String;    invoke-direct {v0, v1}, Ljava/lang/String;-><init>([B)V    .line 31    .local v0, "str":Ljava/lang/String;    return-object v0    .line 29    nop    :array_e    .array-data 1        0x48t        0x65t        0x6ct        0x6ct        0x6ft        0x20t        0x77t        0x6ft        0x72t        0x6ct        0x64t    .end array-data.end method

 

.smali 代碼中可以看出已經隱藏了所有字元。

3. 加密處理

加密處理是先將字串在本地進行加密處理,後將密文寫入程式碼進去,運行時載進行解密。  
加密步驟:

  • 字串加密

  • 寫入程式碼進程式

  • 編譯運行

  • 解密密文

當然因為 Java 代碼相對來說比較容易反編譯,並且該方式需要將解密方法放在 APK 本地,所以我們可以將解密方法通過 JNI 實現,加大反編譯難度。

總結

任何一種加固方式都只是加大了反破解的難度,並不能完全避免 Android 程式被破解。

[Android Security] APK自我保護 - 字串處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.