1. 程式人生 > 其它 >【Android 逆向】動態除錯AliCrackme_1

【Android 逆向】動態除錯AliCrackme_1

1 試玩 apk

# 安裝APK到真機
adb install AliCrackme_1.apk
開啟apk,投石問路,輸入123試一下

2 將apk 拖入androidKiller,得到反編譯的smali檔案專案

smali目錄地址在androidkiller目錄下的projects/AliCrackme_1/Project 下

3 這裡使用AndroidStudio3.5 進行動態除錯

動態除錯需要安裝外掛smalidea。外掛地址為(androidstudio3.5和smalidea-0.05.zip搭配,使用smalidea更高版本會有問題),該外掛支援smali斷點debug模式

smaliidea下載地址,記得選0.05版本


4. androidstudio 安裝該外掛

5. 使用android studio 匯入androidkiller目錄下的projects/AliCrackme_1/Project,一路 next,會將smali專案匯入

6. 在關鍵onClick處下斷點,執行得到密碼字典表

一乙二十丁廠七卜人入八九幾兒了力乃刀又三於幹虧士工土才寸下大丈與萬上小口巾山千乞川億個勺久凡及夕丸麼廣亡門義之屍弓己已子衛也女飛刃習叉馬鄉豐王井開夫天無元專雲扎藝木五支廳不太犬區歷尤友匹車巨牙屯比互切瓦止少日中岡貝內水見午牛手毛氣升長仁什片僕化仇幣仍僅斤爪反介父從今凶分乏公倉月氏勿欠風丹勻烏鳳勾文六方火為鬥憶訂計戶認心尺引醜巴孔隊辦以允予勸雙書幻玉刊示末未擊打巧正撲扒功扔去甘世古節本術可丙左厲右石布龍平滅軋東卡北佔業舊帥歸且旦目葉甲申叮電號田由史只央兄叼叫另叨嘆四生失禾丘付仗代仙們儀白仔他斥瓜乎叢令用甩印樂

還有真正的但是被加密過的密碼義弓麼丸廣之
關鍵加密轉換演算法,將我們輸入的密碼,比如123,根據密碼字典轉換,後面會和真正轉換後的密碼進行比較是否一致
.method private static bytesToAliSmsCode(Ljava/lang/String;[B)Ljava/lang/String;
    .locals 3
    .param p0, "table"    # Ljava/lang/String;
    .param p1, "data"    # [B

    .prologue
    .line 144
    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    .line 145
    .local v1, "sb":Ljava/lang/StringBuilder;
    const/4 v0, 0x0

    .local v0, "i":I
    :goto_0
    array-length v2, p1

    if-lt v0, v2, :cond_0

    .line 148
    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    return-object v2

    .line 146
    :cond_0
    aget-byte v2, p1, v0
	# 關鍵指令,將輸入的char轉換為int,比如 1 ASCII碼對應的 50
    and-int/lit16 v2, v2, 0xff
	#轉換後的值,去字典表裡找對應的字元
    invoke-virtual {p0, v2}, Ljava/lang/String;->charAt(I)C

    move-result v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;

    .line 145
    add-int/lit8 v0, v0, 0x1

    goto :goto_0
.end method

6. 根據該演算法,可以倒推出解密演算法,將加密後的真正密碼進行反解密

public static void main(String[] args) {
	String tableStr = "一乙二十丁廠七卜人入八九幾兒了力乃刀又三於幹虧士工土才寸下大丈與萬上小口巾山千乞川億個勺久凡及夕丸麼廣亡門義之屍弓己已子衛也女飛刃習叉馬鄉豐王井開夫天無元專雲扎藝木五支廳不太犬區歷尤友匹車巨牙屯比互切瓦止少日中岡貝內水見午牛手毛氣升長仁什片僕化仇幣仍僅斤爪反介父從今凶分乏公倉月氏勿欠風丹勻烏鳳勾文六方火為鬥憶訂計戶認心尺引醜巴孔隊辦以允予勸雙書幻玉刊示末未擊打巧正撲扒功扔去甘世古節本術可丙左厲右石布龍平滅軋東卡北佔業舊帥歸且旦目葉甲申叮電號田由史只央兄叼叫另叨嘆四生失禾丘付仗代仙們儀白仔他斥瓜乎叢令用甩印樂";
	String pwdStr = "義弓麼丸廣之";
	char[] pwdIndex = new char[pwdStr.length()];
	for (int i = 0; i < pwdStr.length(); i++) {
		int index = tableStr.indexOf(pwdStr.charAt(i));
		pwdIndex[i] = (char)index;
	}
	System.out.println(new String(pwdIndex))
}

最後得到密碼: 581026