by Computer_Angel on 03/25/10 at 11:44:44 (346 Views)
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.