Archive for the ‘Lần đầu với software của android OS’ Category


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.