分析文章
//定位 native crackme(String paramString1, String paramString2);函数,通过查看安卓源码Dalvik虚拟机JNI方法的注册过程得知,在dvmUseJNIBridge函数下断, 就会得到native crackme函数的内存地址:
//-------------crackme函数
libcrackme.so:80506714 PUSH {R3-R7,LR}
libcrackme.so:80506716 MOVS R7, R3
libcrackme.so:80506718 LDR R3, [R0]
libcrackme.so:8050671A MOVS R5, #0x2A4
libcrackme.so:8050671E LDR R3, [R3,R5]
libcrackme.so:80506720 MOVS R1, R2
libcrackme.so:80506722 MOVS R2, #0
libcrackme.so:80506724 MOVS R4, R0
libcrackme.so:80506726 BLX R3 ; 获得输入框中帐户
libcrackme.so:80506728 LDR R3, [R4]
libcrackme.so:8050672A MOVS R6, R0
libcrackme.so:8050672C MOVS R1, R7
libcrackme.so:8050672E LDR R3, [R3,R5]
libcrackme.so:80506730 MOVS R2, #0
libcrackme.so:80506732 MOVS R0, R4
libcrackme.so:80506734 BLX R3 ; 获得输入框中密码
libcrackme.so:80506736 MOVS R1, R0
libcrackme.so:80506738 MOVS R0, R6
libcrackme.so:8050673A BL unk_80506610
//-----------判断账户长度与密码长度是否合法
libcrackme.so:80506586 BL loc_80505E54 ; 判断账户长度与密码长度是否合法
libcrackme.so:80505E54 PUSH {R4-R6,LR}
libcrackme.so:80505E56 LDR R4, =(unk_80515F4C - 0x80505E5E)
libcrackme.so:80505E58 LDR R3, [R0,#0x34]
libcrackme.so:80505E5A ADD R4, PC ; unk_80515F4C
libcrackme.so:80505E5C CMP R3, #0
libcrackme.so:80505E5E BEQ loc_80505E80
libcrackme.so:80505E60 LDR R5, [R0,#0x38]
libcrackme.so:80505E62 CMP R5, #0
libcrackme.so:80505E64 BEQ loc_80505E80
libcrackme.so:80505E66 MOVS R0, R3
libcrackme.so:80505E68 BLX strlen_0 ; 帐户长度
libcrackme.so:80505E6C MOVS R6, R0
libcrackme.so:80505E6E SUBS R6, #8
libcrackme.so:80505E70 MOVS R0, R5
libcrackme.so:80505E72 BLX strlen_0 ; 密码长度
libcrackme.so:80505E76 CMP R6, #0x16
libcrackme.so:80505E78 BHI loc_80505E80
libcrackme.so:80505E7A SUBS R0, #0xC
libcrackme.so:80505E7C CMP R0, #0x58
libcrackme.so:80505E7E BLS loc_80505E94
//--------帐户每一个数值循环0x100次与一个表进行计算,得到8字节数值 (表大小为0x100)
libcrackme.so:80505D8E loc_80505D8E ; CODE XREF: libcrackme.so:80505E34j
libcrackme.so:80505D8E LDR R0, [SP,#0x18] ; 开始
libcrackme.so:80505D90 BLX setjmp_0
libcrackme.so:80505D94 CMP R0, #0
libcrackme.so:80505D96 BEQ loc_80505D9E
libcrackme.so:80505D98 BLX sub_80507D64
libcrackme.so:80505D9C B loc_80505DA8
libcrackme.so:80505D9E ; ---------------------------------------------------------------------------
libcrackme.so:80505D9E
libcrackme.so:80505D9E loc_80505D9E ; CODE XREF: libcrackme.so:80505D96j
libcrackme.so:80505D9E LDR R1, [SP,#0x10]
libcrackme.so:80505DA0 LDR R2, [SP,#8]
libcrackme.so:80505DA2 LDR R3, [R1,#0x34]
libcrackme.so:80505DA4 LDRB R3, [R3,R2] ; 取帐户下一个字节
libcrackme.so:80505DA6 STR R3, [SP,#4]
libcrackme.so:80505DA8
libcrackme.so:80505DA8 loc_80505DA8 ; CODE XREF: libcrackme.so:80505D9Cj
libcrackme.so:80505DA8 MOVS R3, #0
libcrackme.so:80505DAA STR R3, [SP,#0xC]
libcrackme.so:80505DAC LDR R3, =(unk_80516AF8 - 0x80505DB4)
libcrackme.so:80505DAE LDR R1, =unk_104B2
libcrackme.so:80505DB0 ADD R3, PC ; unk_80516AF8
libcrackme.so:80505DB2 ADDS R3, #0x30
libcrackme.so:80505DB4 STR R3, [SP,#0x1C]
libcrackme.so:80505DB6 STR R1, [SP,#0x20]
libcrackme.so:80505DB8
libcrackme.so:80505DB8 loc_80505DB8 ; CODE XREF: libcrackme.so:80505DE8j
libcrackme.so:80505DB8 LDR R0, [SP,#0x1C]
libcrackme.so:80505DBA BLX setjmp_0
libcrackme.so:80505DBE CMP R0, #0
libcrackme.so:80505DC0 BEQ loc_80505DC8
libcrackme.so:80505DC2 BLX sub_80507D64
libcrackme.so:80505DC6 B loc_80505DDC
libcrackme.so:80505DC8 ; ---------------------------------------------------------------------------
libcrackme.so:80505DC8
libcrackme.so:80505DC8 loc_80505DC8 ; CODE XREF: libcrackme.so:80505DC0j
libcrackme.so:80505DC8 LDR R3, [SP,#0x20]
libcrackme.so:80505DCA LDR R2, [SP,#0xC]
libcrackme.so:80505DCC LDR R1, [SP,#4]
libcrackme.so:80505DCE ADD R3, PC
libcrackme.so:80505DD0 ADDS R3, #0x38
libcrackme.so:80505DD2 LDRB R3, [R2,R3] ; 取表中1字节
libcrackme.so:80505DD4 EORS R3, R1 ; 帐户1字节与表中1字节进行计算
libcrackme.so:80505DD6 LSLS R3, R3, #0x18
libcrackme.so:80505DD8 LSRS R3, R3, #0x18
libcrackme.so:80505DDA STR R3, [SP,#4]
libcrackme.so:80505DDC
libcrackme.so:80505DDC loc_80505DDC ; CODE XREF: libcrackme.so:80505DC6j
libcrackme.so:80505DDC LDR R2, [SP,#0xC]
libcrackme.so:80505DDE MOVS R3, #0x100
libcrackme.so:80505DE2 ADDS R2, #1
libcrackme.so:80505DE4 STR R2, [SP,#0xC]
libcrackme.so:80505DE6 CMP R2, R3 ; 循环0x100次
libcrackme.so:80505DE8 BNE loc_80505DB8
libcrackme.so:80505DEA LDR R3, [SP,#4]
libcrackme.so:80505DEC LDR R0, [SP,#0x24]
libcrackme.so:80505DEE STR R3, [SP,#0x14]
libcrackme.so:80505DF0 BLX setjmp_0
libcrackme.so:80505DF4 CMP R0, #0
libcrackme.so:80505DF6 BEQ loc_80505DFE
libcrackme.so:80505DF8 BLX sub_80507D64
libcrackme.so:80505DFC B loc_80505E1E
libcrackme.so:80505DFE ; ---------------------------------------------------------------------------
libcrackme.so:80505DFE
libcrackme.so:80505DFE loc_80505DFE ; CODE XREF: libcrackme.so:80505DF6j
libcrackme.so:80505DFE LDR R1, [SP,#0x14]
libcrackme.so:80505E00 CMP R1, #0
libcrackme.so:80505E02 BNE loc_80505E1E
libcrackme.so:80505E04 LDR R0, =(unk_80516AF8 - 0x80505E0A)
libcrackme.so:80505E06 ADD R0, PC ; unk_80516AF8
libcrackme.so:80505E08 ADDS R0, #0x30
libcrackme.so:80505E0A BLX setjmp_0
libcrackme.so:80505E0E MOVS R2, #0x99
libcrackme.so:80505E10 STR R2, [SP,#4]
libcrackme.so:80505E12 CMP R0, #0
libcrackme.so:80505E14 BEQ loc_80505E1E
libcrackme.so:80505E16 BLX sub_80507D64
libcrackme.so:80505E1A LDR R3, [SP,#0x14]
libcrackme.so:80505E1C STR R3, [SP,#4]
libcrackme.so:80505E1E
libcrackme.so:80505E1E loc_80505E1E ; CODE XREF: libcrackme.so:80505DFCj
libcrackme.so:80505E1E ; libcrackme.so:80505E02j ...
libcrackme.so:80505E1E LDR R2, [SP,#8]
libcrackme.so:80505E20 LDR R1, [SP,#0x10]
libcrackme.so:80505E22 ADDS R3, R1, R2
libcrackme.so:80505E24 LDR R2, [SP,#8]
libcrackme.so:80505E26 MOV R1, SP
libcrackme.so:80505E28 LDRB R1, [R1,#4]
libcrackme.so:80505E2A ADDS R3, #0x5A
libcrackme.so:80505E2C ADDS R2, #1
libcrackme.so:80505E2E STRB R1, [R3] ; 存放计算后得到的值
libcrackme.so:80505E30 STR R2, [SP,#8]
libcrackme.so:80505E32 CMP R2, #8 ; 循环8次,其中又循环0x100次
libcrackme.so:80505E34 BNE loc_80505D8E ; 开始
libcrackme.so:80505E36
libcrackme.so:80505E36 loc_80505E36 ; CODE XREF: libcrackme.so:80505D82j
libcrackme.so:80505E36 ADD SP, SP, #0x2C
libcrackme.so:80505E38 MOVS R0, #1
libcrackme.so:80505E3A POP {PC}
//--------用上面帐户计算得到的8字节数值进行再次计算
libcrackme.so:80505594 loc_80505594 ; CODE XREF: sub_80505588+3Aj
libcrackme.so:80505594 ASRS R3, R4, #0x1F
libcrackme.so:80505596 LSRS R3, R3, #0x1D
libcrackme.so:80505598 ADDS R3, R3, R4
libcrackme.so:8050559A ASRS R3, R3, #3
libcrackme.so:8050559C LDRB R3, [R1,R3] ; 取帐户与表计算后的值
libcrackme.so:8050559E MOV R12, R3
libcrackme.so:805055A0 MOVS R3, R4
libcrackme.so:805055A2 ANDS R3, R7
libcrackme.so:805055A4 STR R3, [SP,#0x20+var_1C]
libcrackme.so:805055A6 BPL loc_805055B0 ; 计算表与帐户计算后的值
libcrackme.so:805055A8 SUBS R3, #1
libcrackme.so:805055AA ORRS R3, R6
libcrackme.so:805055AC ADDS R3, #1
libcrackme.so:805055AE STR R3, [SP,#0x20+var_1C]
libcrackme.so:805055B0
libcrackme.so:805055B0 loc_805055B0 ; CODE XREF: sub_80505588+1Ej
libcrackme.so:805055B0 LDR R3, [SP,#0x20+var_1C] ; 计算表与帐户计算后的值
libcrackme.so:805055B2 MOV R5, R12 ; 进算运算
libcrackme.so:805055B4 ASRS R5, R3
libcrackme.so:805055B6 MOVS R3, R5
libcrackme.so:805055B8 MOVS R5, #1
libcrackme.so:805055BA ANDS R3, R5
libcrackme.so:805055BC STRB R3, [R0,R4] ; 存放运算后的值
libcrackme.so:805055BE ADDS R4, R4, R5
libcrackme.so:805055C0
libcrackme.so:805055C0 loc_805055C0 ; CODE XREF: sub_80505588+Aj
libcrackme.so:805055C0 CMP R4, R2 ; 判断是否完成 循环0x40次
libcrackme.so:805055C2 BLT loc_80505594
libcrackme.so:805055C4 POP {R0-R2,R4-R7,PC}
//----------循环初始化成01
libcrackme.so:80505804 loc_80505804 ; CODE XREF: libcrackme.so:8050583Cj
libcrackme.so:80505804 LDR R4, =(unk_805165F8 - 0x8050580E)
libcrackme.so:80505806 LDRB R5, [R6,R7]
libcrackme.so:80505808 MOVS R1, #0x1C
libcrackme.so:8050580A ADD R4, PC ; unk_805165F8
libcrackme.so:8050580C MOVS R3, R4
libcrackme.so:8050580E ADDS R3, #0x30
libcrackme.so:80505810 MOVS R0, R3
libcrackme.so:80505812 MOVS R2, R5
libcrackme.so:80505814 STR R3, [SP]
libcrackme.so:80505816 BL loc_805056FC
libcrackme.so:8050581A MOVS R0, R4
libcrackme.so:8050581C ADDS R0, #0x4C
libcrackme.so:8050581E MOVS R1, #0x1C
libcrackme.so:80505820 MOVS R2, R5
libcrackme.so:80505822 BL loc_805056FC
libcrackme.so:80505826 MOVS R3, #0x30
libcrackme.so:80505828 MOVS R2, R3
libcrackme.so:8050582A MULS R2, R6
libcrackme.so:8050582C ADDS R4, #0x70
libcrackme.so:8050582E ADDS R0, R4, R2
libcrackme.so:80505830 LDR R1, [SP]
libcrackme.so:80505832 LDR R2, [SP,#4]
libcrackme.so:80505834 ADDS R6, #1
libcrackme.so:80505836 BL sub_805056CC
libcrackme.so:8050583A CMP R6, #0x10 ; 循环0x10次
libcrackme.so:8050583C BNE loc_80505804
libcrackme.so:8050583E POP {R0-R2,R4-R7,PC}
libcrackme.so:8050583E ; ----------------------------------
/---------计算密码值得到 8字节数值
libcrackme.so:805060FC BL loc_805058F8 ; 密码数值进行计算得到8字节数值
libcrackme.so:80506598 BL loc_80505F70 ; 密码计算出来的8值与帐户进行比较
libcrackme.so:80505F70 loc_80505F70 ; CODE XREF: libcrackme.so:80506598p
libcrackme.so:80505F70 PUSH {R4,LR}
libcrackme.so:80505F72 SUB SP, SP, #0x18
libcrackme.so:80505F74 STR R0, [SP,#0xC]
libcrackme.so:80505F76 LDR R0, =(unk_80515F4C - 0x80505F7E)
libcrackme.so:80505F78 LDR R1, [SP,#0xC]
libcrackme.so:80505F7A ADD R0, PC ; unk_80515F4C
libcrackme.so:80505F7C STR R0, [SP,#8]
libcrackme.so:80505F7E LDR R0, [R1,#0x34]
libcrackme.so:80505F80 BLX strlen_0 ; 帐户长度
libcrackme.so:80505F84 STR R0, [SP,#0x10]
libcrackme.so:80505F86 LDR R0, [SP,#0xC]
libcrackme.so:80505F88 ADDS R0, #0x3C
libcrackme.so:80505F8A BLX strlen_0 ; 密码计算出来的长度
libcrackme.so:80505F8E LDR R2, [SP,#0x10]
libcrackme.so:80505F90 CMP R2, R0 ; 判断计算出来的值长度与帐户长度
libcrackme.so:80505F92 BEQ loc_80505FA2
//密码计算出来的值与帐户进行比较 (相同则显示成功)
libcrackme.so:80505FCE loc_80505FCE ; CODE XREF: libcrackme.so:80505FC6j
libcrackme.so:80505FCE LDR R0, [SP,#0xC]
libcrackme.so:80505FD0 LDR R1, [SP,#4]
libcrackme.so:80505FD2 LDR R2, [R0,#0x34]
libcrackme.so:80505FD4 ADDS R3, R0, R1
libcrackme.so:80505FD6 ADDS R3, #0x3C
libcrackme.so:80505FD8 LDRB R2, [R2,R1] ; 取帐户值
libcrackme.so:80505FDA LDRB R3, [R3] ; 取密码计算出来的值
libcrackme.so:80505FDC CMP R2, R3 ; 比较密码计算后的值与帐户是否相同 (相同则显示成功)
libcrackme.so:80505FDE BEQ loc_80505FF6
libcrackme.so:80505FE0 MOVS R0, #1
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)