.text:00000D28 PUSH {R4-R7,LR}
.text:00000D2A SUB SP, SP, #0x14 ; 开闭空间
.text:00000D2C MOVS R6, R2 ; R6 = data
.text:00000D2E LDR R2, [R0] ; R2 = Env地址; 从这里可以看出下面肯定有一条语句是 R2+###,为什么? 哈哈
.text:00000D30 STR R3, [SP,#8] ; Sp+8 = key1; 把key1的值放到Sp+8里面,
.text:00000D32 MOVS R3, #0x2AC ; R3 = 0x2ac; 看到这里我知道R2+###语句马上就要来了,###=0x2ac
.text:00000D36 LDR R3, [R2,R3] ; R3 = Env地址+0x2ac; 他果然来了; 这是一个Env指针的方法:GetArrayLength
.text:00000D38 MOVS R1, R6 ; R1 = data;
.text:00000D3A MOVS R5, R0 ; R5 = Env指正
.text:00000D3C BLX R3 ; 调用getarrayLength, 获取Data的长度,长度放到R0 = data.length
.text:00000D3E LDR R3, [R5] ; R3 = Env地址, 同理,我知道下面会有一个语句是R3+###
.text:00000D40 MOVS R4, #0x2E4 ; 坚定了我的想法
.text:00000D44 STR R0, [SP,#0xC] ; Sp+0xc = data.length
.text:00000D46 LDR R3, [R3,R4] ; R3 = GetCharArrayElements方法
.text:00000D48 MOVS R0, R5 ; R0 = Env指针
.text:00000D4A MOVS R1, R6 ; R1 = data
.text:00000D4C MOVS R2, #0 ; R2 = 0
.text:00000D4E BLX R3 ; 调用GetCharArrayElements方法,获取一个指向data数组元素第0个字节的指针; R0 = *data[0]
.text:00000D50 STR R0, [SP] ; Sp+0 = *data[0]
.text:00000D52 CMP R0, #0
.text:00000D54 BEQ loc_DC4 ; 当R0 == 0 跳转到loc_dc4
.text:00000D56 LDR R3, [R5] ; R3 = Env地址
.text:00000D58 MOVS R0, R5 ; R0 = Env
.text:00000D5A LDR R1, [SP,#8] ; R1 = key1
.text:00000D5C LDR R3, [R3,R4] ; R3 = GetCharArrayElements方法
.text:00000D5E MOVS R2, #0 ; R2= 0
.text:00000D60 BLX R3 ; 调用GetCharArrayElements方法;R0 = *key1[0]
.text:00000D62 STR R0, [SP,#4] ; Sp+4 = *key1[0]
.text:00000D64 CMP R0, #0
.text:00000D66 BEQ loc_D6E
.text:00000D68 LDR R4, [SP] ; R4 = *data[0]
.text:00000D6A MOVS R7, #0
.text:00000D6C B loc_D9C ; R3 = data.length
.text:00000D6E ; ---------------------------------------------------------------------------
.text:00000D6E
.text:00000D6E loc_D6E ; CODE XREF: Java_com_tencent_mobileqq_utils_SecurityUtile_encrypt+3Ej
.text:00000D6E LDR R2, [R5]
.text:00000D70 MOVS R3, #0x304
.text:00000D74 LDR R4, [R2,R3]
.text:00000D76 MOVS R1, R6
.text:00000D78 MOVS R0, R5
.text:00000D7A LDR R2, [SP,#0x28+var_28]
.text:00000D7C LDR R3, [SP,#0x28+var_24]
.text:00000D7E BLX R4
.text:00000D80 LDR R6, [SP,#0x28+var_24]
.text:00000D82 B loc_DC6
.text:00000D84 ; ---------------------------------------------------------------------------
.text:00000D84
.text:00000D84 loc_D84 ; CODE XREF: Java_com_tencent_mobileqq_utils_SecurityUtile_encrypt+78j
.text:00000D84 MOVS R0, R7 ; R0 = 0
.text:00000D86 LDR R1, [SP,#0x28] ; R1 = key2;
.text:00000D88 BLX __aeabi_idivmod ; 求余运算!; R0 = 0 % key2;
.text:00000D8C LDR R3, [SP,#4] ; R3 = *key1[0]指向key数组第0个元素的指针
.text:00000D8E LSLS R1, R1, #1 ; R1 = 求余的结果 * 2^1
.text:00000D90 ADDS R7, #1 ; R7 = R7 +1 ;
.text:00000D92 LDRH R2, [R1,R3] ; R2 = key1[R1]
.text:00000D94 LDRH R3, [R4] ; R3 = *data[0]第一个元素
.text:00000D96 EORS R3, R2 ; R3 = R3 异或 R2;
.text:00000D98 STRH R3, [R4] ; R4的地址 = R3 异或 R2
.text:00000D9A ADDS R4, #2 ; R4 = 2
.text:00000D9C
.text:00000D9C loc_D9C ; CODE XREF: Java_com_tencent_mobileqq_utils_SecurityUtile_encrypt+44j
.text:00000D9C LDR R3, [SP,#0xC] ; R3 = data.length
.text:00000D9E CMP R7, R3 ; 通过分析我知道了, data.length有多长, 就循环几次
.text:00000DA0 BLT loc_D84 ; if( 0 < data.length ){loc_D84}
.text:00000DA2 LDR R3, [R5] ; R3 = Env地址
.text:00000DA4 MOVS R7, #0x304
.text:00000DA8 LDR R4, [R3,R7] ; R4 = ReleaseCharArrayElements方法
.text:00000DAA MOVS R0, R5 ; R0 = Env
.text:00000DAC MOVS R1, R6 ; R1 = data
.text:00000DAE LDR R2, [SP] ; R2 = *data[0]
.text:00000DB0 MOVS R3, #0
.text:00000DB2 BLX R4 ; 调用ReleaseCharArrayElements方法.目的在于释放通过GetCharArrayElements方法获取到的指针, 提醒计算机这个指针以后不会在访问了.
.text:00000DB4 LDR R3, [R5] ; R3 = Env地址
.text:00000DB6 MOVS R0, R5 ; R0 = Env指针
.text:00000DB8 LDR R1, [SP,#8] ; R1 = key1
.text:00000DBA LDR R4, [R3,R7] ; R4 = ReleaseCharArrayElements方法
.text:00000DBC LDR R2, [SP,#4] ; R2 = *key1[0];指向key1数组元素第0个元素的指针
.text:00000DBE MOVS R3, #0
.text:00000DC0 BLX R4 ; 同理,释放*key[0]
.text:00000DC2 B loc_DC6
上面是整个方法的代码, 基本上已经逐行添加了注释.
通过分析,确定了方法的核心内容如下:
注释用的是口水话, 有些用词不标准, 希望大家能看的懂. 这里给大家一个翻译的机会,就不公报源码了,输出结果如下:
明文: 那⒈抹基情
入库后:邛Ⓘ抍城惱
对比数据库的数据一样,分析成功
不懂的留言给我或者加QQ交流群:492788365