http://bbs.pediy.com/showthread.php?t=188793帖子给出了算法分析,注册机等。出于汇编分析练习,将之爆破。
Step1: 通过SODUMPER工具,DUMP解密后的SO文件。
Step2: 分析去花后的verify函数:
arg_8 = 8
arg_28 = 0x28
STMFD SP!, {R4-R8,LR}
MOV R5, R2 //r5 -> username
SUB SP, SP, #8
MOV R4, R0 //r4 -> env
MOV R8, R3 //r8 -> EmailAddr
MOV R7, R1 //r7 -> jobj
MOV R1, R5 //r1 -> username
MOV R0, R4 //r0 -> env
BL __gnu_Unwind_8
MOV R1, R8
MOV R6, R0 //r6 -> char *username
MOV R0, R4
BL __gnu_Unwind_8
LDR R1, [SP, #-8+arg_28] //r1 -> Serial Number
MOV R5, R0 //r5 -> char *EmailAddr
MOV R0, R4
BL __gnu_Unwind_8
MOV R1, R7
STR R0, [SP, #-8+arg_8] //char* SN;
MOV R2, R6
MOV R0, R4
MOV R3, R5
BL __gnu_Unwind_6
ADD SP, SP, #8
LDMFD SP!, {R4, R8, PC}
__gnu_Unwind_8 ->
char*getCharsByJavaString(JNIEnv *env, jstring jstr); //malloc分配空间
__gnu_Unwind_6 ->
voidcheckNumber(JNIEnv *env, jobject obj, char* username, char* EmailAddr, char*SN);
{
char**str;
...
str= (char**)malloc(0x0c);
str[0]= username; str[1] = EmailAddr; str[2] = SN;
if(strlen(SN) == 8){
__gnu_Uwind_1(
env,
obj,
str,
memset(malloc(strlen(username)+ strlen(EmailAddr) + 1), 0 , malloc(strlen(username) + strlen(EmailAddr) +1)),
memset(malloc(0x28,0, 0x28)));
}
}
__gnu_Unwind_1 ->
voiddo(JNIEnv *env, jobject obj, char** strs, char* str_comb, char* str_0x28);
__gnu_Unwind_1:去花后的指令
STMFD SP!,{R4-R10,LR}
MOV R5,R0 // r5 -> env
SUB SP,SP, #8
MOV R4,R1 // r4 -> jobj
MOV R10, R2 // r10 -> strs
MOV R7,R3 // r7 -> *str_comb
MOV R0,R5 // r0 -> env
LDR R8,[SP, #0x28]
MOV R1,R4 // r1 -> jobj
MOV R0,R5 // r0 -> env
BL _gnu_Unwind_2
MOV R1,R10 //r1 -> strs
MOV R6,R0 //r6 -> show方法地址
MOV R0,R7 //r0 -> str_comb
BL _gnu_Unwind_3
ADD R7,SP, #8 //r7 -> 局部变量1
MOV R3,#0 //r3 = 0;
STR R3,[R7, #-4]! //局部变量1, 清0
MOV R9,R0 //r9 -> str_comb
MOV R1,#4 //r1 = 4;
BL __gnu_armfini_29
MOV R0,R9 //r0 -> str_comb
MOV R1,R8 //r1 -> str_0x28
BL __gnu_Unwind_4(str_0x28 已填充40字节的数据0x28)
MOV R0,R10 //r0 -> r10(sts)
MOV R1,R7 //r1 -> 局部变量1(0)
MOV R2,R8 //r2 -> str_0x28
BL __gnu_Uwind_11
MOV R0,R5 //r0 -> env
MOV R1,R4 //r1 -> jobj
MOV R2,R6 //r2 -> show方法地址
LDR R3,[SP, #4] -> 局部变量1
BL __gnu_Uwind_10
ADD SP,SP, #8
LDMFD SP!, {R4-R10, PC}
_gnu_Unwind_2:
void*getShowMethod(JNIEnv* env, jobject obj);
__gnu_Unwind_3:
voidcombineUsernameAndEmailAddr(char* str_comb, char** strs);
__gnu_armfini_29:
voidchangeFourBytes(char *str_comb, int n); 改变了str_comb 前4个字节
__gnu_Unwind_4:
voidgenStr_0x28(char *str_comb, char *str_0x28); //根据str_comb生成了40字节
__gnu_Uwind_11:
voidxxx(char **strs, int *n, char *str_0x28); //可能修改了str_0x28, n =(0xff)
__gnu_Uwind_10:
如果n等于0xff,解密Toast字符串,并调用show方法
Step3: 通过对上述verify流程分析,关键之处就是修改__gnu_Uwind_10中判定是否等于0xff。级将0x17CF4BEQ修改为BNE即可。修改DUMP出来的SO文件。也可以修改原SO文件,不过得先将其解密
Step4: 由于代码已经被解密,或者将代码再加密回去。这里,我采用修改init_array函数,使其不执行。
Step5: 打包测试
大功告成,美中不足的是SN必须为8位。先这样吧。