Author : Computer_Angel (REA’s Admin)
1. File .apk của android tương đương với .jar của java, tức là file .zip. Rename lại, extract ra sẽ được file cần đó là classes.dex, file này chứa các class đã compile.
2. Dùng tool smali/baksmali để disasmble ra opcode. (http://code.google.com/p/smali/) . Opcode của android gọi là dalvik opcodes.
3. Tra cứu bảng dalvik opcode để tìm hiểu ý nghĩa các opcode. (http://pallergabor.uw.hu/androidblog…k_opcodes.html)
4. Phân tích sơ bộ:
Code:
.method private static ValidateLicenseKeyAlgA(Ljava/lang/String;)Z .limit registers 11 ; parameter[0] : v10 (Ljava/lang/String;) .var 0 is curr C from l13c0ce to l13c104 .var 2 is j I from l13c0e0 to l13c104 const/4 v9,5 ; v9=5 const/4 v8,0 .line 242 if-eqz v10,l13c0a8 invoke-virtual {v10},java/lang/String/length ; length()I move-result v6 ; v6=length serial const/16 v7,10 if-eq v6,v7,l13c0ac l13c0a8: move v6,v8 l13c0aa: .line 261 return v6 l13c0ac: .line 244 invoke-virtual {v10},java/lang/String/toLowerCase ; toLowerCase()Ljava/lang/String; move-result-object v3 ; v3 = lowcase serial .line 247 const/4 v4,0 .line 248 const/4 v5,0 .line 250 const/4 v1,0 ; v1=0 l13c0ba: if-lt v1,v9,l13c0c6 ; if v1<5 .line 259 if-eq v4,v5,l13c104 move v6,v8 goto l13c0aa l13c0c6: .line 251 invoke-virtual {v3,v1},java/lang/String/charAt ; charAt(I)C move-result v0 ; v0 = v3[v1] .line 252 add-int/2addr v4,v0 ; v4=v4+v0 .line 253 add-int/lit8 v6,v1,5 ; v6=v1+5 invoke-virtual {v3,v6},java/lang/String/charAt ; charAt(I)C move-result v6 ; v6=v3[v6] add-int/2addr v5,v6 ; v5=v5+v6 .line 255 const/4 v2,0 ; v2=0 l13c0e0: if-lt v2,v9,l13c0ea ; if v2<5 .line 250 add-int/lit8 v1,v1,1 goto l13c0ba l13c0ea: .line 256 add-int/lit8 v6,v2,5 invoke-virtual {v3,v6},java/lang/String/charAt ; charAt(I)C move-result v6 if-ne v0,v6,l13c0fe move v6,v8 goto l13c0aa l13c0fe: .line 255 add-int/lit8 v2,v2,1 goto l13c0e0 l13c104: .line 261 const/4 v6,1 goto l13c0aa .end method
5. Dựng thành code giả:
Code:
v4=0 v5=0 v1=0 A: if v1<5 v0=v3[v1] v4=v4+v0 v6=v1+5 v6=v3[v6] v5=v5+v6 v2=0 B: if v2<5 v6=v2+5 v6=v3[v6] if v0!=v6 v2=v2+1 goto B else return 0 else v1=v1+1 goto A else if v4==v5 return 1 else return 0
6. Optimize code giả lần 1:
Code:
v4=0; v5=0; v1=0; while (v1<5) { v0=serial[v1]; v4+=v0; v6=v3[v1+5]; v5+=v6; v2=0; while (v2<5) { v6=v3[v2+5]; if (v0!=v6) v2++; else break; } v1++; } if (v4==v5) return true; else return false;
7. Optimize code giả lần 2:
Code:
v4=0; v5=0; v1=0; while (v1<5) { v4+=serial[v1]; v5+=serial[v1+5]; v2=0; while (v2<5) { if (serial[v1]!=serial[v2+5]) v2++; else break; } v1++; } if (v4==v5) return true; else return false;
8. Xong.