Android SO CM小记

来源:互联网 发布:电信有4g网络吗 编辑:程序博客网 时间:2024/05/01 22:37

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位。先这样吧。

0 0
原创粉丝点击