多谢老大的提示,现在将分析调试过程描述下
在Java_com_crackme_MainActivity_crackme函数下好断点,输入账户与密码
获得输入的账户与密码
//申请空间存放账户与密码
libcrackme.so:8050536C loc_8050536C ; CODE XREF: Java_com_crackme_MainActivity_crackme+2Ep
libcrackme.so:8050536C PUSH {R4-R7,LR}
libcrackme.so:8050536E SUB SP, SP, #0x14
libcrackme.so:80505370 MOVS R6, R2
libcrackme.so:80505372 MOVS R4, R0
libcrackme.so:80505374 MOVS R5, R1
libcrackme.so:80505376 BL loc_80505328
libcrackme.so:8050537A CMP R6, #0
libcrackme.so:8050537C BEQ loc_805053DE
libcrackme.so:8050537E CMP R5, #0
libcrackme.so:80505380 BEQ loc_805053DE
libcrackme.so:80505382 MOVS R0, R5
libcrackme.so:80505384 BLX strlen_0
libcrackme.so:80505388 STR R0, [SP,#8]
libcrackme.so:8050538A MOVS R7, R0
libcrackme.so:8050538C MOVS R0, R6
libcrackme.so:8050538E BLX strlen_0
libcrackme.so:80505392 ADDS R7, #1
libcrackme.so:80505394 MOVS R3, R0
libcrackme.so:80505396 ADDS R3, #1
libcrackme.so:80505398 STR R0, [SP,#0xC]
libcrackme.so:8050539A MOVS R0, R7
libcrackme.so:8050539C STR R3, [SP,#4]
libcrackme.so:8050539E BLX new ; 申请空间存放账户与密码
libcrackme.so:805053A2 STR R0, [R4,#0x34]
libcrackme.so:805053A4 LDR R0, [SP,#4]
libcrackme.so:805053A6 BLX new
libcrackme.so:805053AA LDR R3, [R4,#0x34]
libcrackme.so:805053AC STR R0, [R4,#0x38]
libcrackme.so:805053AE CMP R3, #0
libcrackme.so:805053B0 BEQ loc_805053DE
libcrackme.so:805053B2 CMP R0, #0
libcrackme.so:805053B4 BEQ loc_805053DE
libcrackme.so:805053B6 MOVS R0, R3
libcrackme.so:805053B8 MOVS R1, #0
libcrackme.so:805053BA MOVS R2, R7
libcrackme.so:805053BC BLX memset_0
libcrackme.so:805053C0 MOVS R1, #0
libcrackme.so:805053C2 LDR R2, [SP,#4]
libcrackme.so:805053C4 LDR R0, [R4,#0x38]
libcrackme.so:805053C6 BLX memset_0
libcrackme.so:805053CA MOVS R1, R5
libcrackme.so:805053CC LDR R2, [SP,#8]
libcrackme.so:805053CE LDR R0, [R4,#0x34]
libcrackme.so:805053D0 BLX memcpy_0 ; 拷贝账户到申请的空间中
libcrackme.so:805053D4 LDR R0, [R4,#0x38]
libcrackme.so:805053D6 MOVS R1, R6
libcrackme.so:805053D8 LDR R2, [SP,#0xC]
libcrackme.so:805053DA BLX memcpy_0 ; 拷贝密码到申请的空间中
libcrackme.so:805053DE
//----------判断输入的账户与密码长度是否合法
libcrackme.so:805053E4 PUSH {R4-R6,LR}
libcrackme.so:805053E6 LDR R4, =(unk_80514F78 - 0x805053EE)
libcrackme.so:805053E8 LDR R3, [R0,#0x34]
libcrackme.so:805053EA ADD R4, PC ; unk_80514F78
libcrackme.so:805053EC CMP R3, #0
libcrackme.so:805053EE BEQ loc_80505410
libcrackme.so:805053F0 LDR R5, [R0,#0x38]
libcrackme.so:805053F2 CMP R5, #0
libcrackme.so:805053F4 BEQ loc_80505410
libcrackme.so:805053F6 MOVS R0, R3
libcrackme.so:805053F8 BLX strlen_0 ; 账户长度
libcrackme.so:805053FC MOVS R6, R0
libcrackme.so:805053FE SUBS R6, #6
libcrackme.so:80505400 MOVS R0, R5
libcrackme.so:80505402 BLX strlen_0 ; 密码长度
libcrackme.so:80505406 CMP R6, #0xE ; 判断账户与密码长度是否合法
libcrackme.so:80505408 BHI loc_80505410
libcrackme.so:8050540A SUBS R0, #0xC
libcrackme.so:8050540C CMP R0, #0x12 ; 判断账户与密码长度是否合法
libcrackme.so:8050540E BLS loc_80505424
//-------判断密码中是否包含字符'-'
libcrackme.so:80505986 LDR R3, [R5,#0x38]
libcrackme.so:80505988 LDRB R2, [R3,#3]
libcrackme.so:8050598A CMP R2, #0x2D ; 判断密码中是否包含字符'-'
libcrackme.so:8050598C BNE loc_8050599A
libcrackme.so:8050598E LDRB R2, [R3,#7]
libcrackme.so:80505990 CMP R2, #0x2D
libcrackme.so:80505992 BNE loc_8050599A
libcrackme.so:80505994 LDRB R3, [R3,#0xB]
libcrackme.so:80505996 CMP R3, #0x2D
libcrackme.so:80505998 BEQ loc_805059B0
//--------去掉密码中包含的字符'-'
libcrackme.so:8050545A loc_8050545A ; CODE XREF: sub_80505430+3Aj
libcrackme.so:8050545A LDRB R1, [R5,R3] ; 去掉密码字符'-'
libcrackme.so:8050545C CMP R1, #0x2D
libcrackme.so:8050545E BEQ loc_80505466
libcrackme.so:80505460 ADD R0, SP, #0x118+var_114
libcrackme.so:80505462 STRB R1, [R0,R2]
libcrackme.so:80505464 ADDS R2, #1
libcrackme.so:80505466
libcrackme.so:80505466 loc_80505466 ; CODE XREF: sub_80505430+2Ej
libcrackme.so:80505466 ADDS R3, #1
libcrackme.so:80505468
libcrackme.so:80505468 loc_80505468 ; CODE XREF: sub_80505430+28j
libcrackme.so:80505468 CMP R3, R6
libcrackme.so:8050546A BLT loc_8050545A ; 去掉密码字符'-'
libcrackme.so:8050546C MOVS R0, R5
libcrackme.so:8050546E ADD R1, SP, #0x118+var_114
libcrackme.so:80505470 BLX memcpy_0 ; 将去掉字符的密码拷贝存放在另一地方
libcrackme.so:80505474 LDR R2, [SP,#0x118+var_14]
//-------判断密码表是否创建
libcrackme.so:805059BC LDRB R2, [R3]
libcrackme.so:805059BE CMP R2, #0 ; 判断表是否创建了
//--------如果没有创建密码表,就开始创建
libcrackme.so:805059C0 BNE loc_80505A26 ; 没有就开始创建
libcrackme.so:805059C2 MOVS R0, #0x80
libcrackme.so:805059C4 ADDS R3, #1
libcrackme.so:805059C6 LSLS R1, R0, #1
libcrackme.so:805059C8
libcrackme.so:805059C8 loc_805059C8 ; CODE XREF: libcrackme.so:805059CEj
libcrackme.so:805059C8 STRB R0, [R2,R3] ; 填充0x80
libcrackme.so:805059CA ADDS R2, #1
libcrackme.so:805059CC CMP R2, R1 ; 判断是否完成 大小为0x100
libcrackme.so:805059CE BNE loc_805059C8 ; 填充0x80
libcrackme.so:805059D8
libcrackme.so:805059D8 loc_805059D8 ; CODE XREF: libcrackme.so:805059E2j
libcrackme.so:805059D8 ADDS R0, R1, R3
libcrackme.so:805059DA ADDS R0, #0x41 ; 密码表开始地址加上0x41
libcrackme.so:805059DC STRB R3, [R0] ; 循环填充
libcrackme.so:805059DE ADDS R3, #1
libcrackme.so:805059E0 CMP R3, #0x1A ; 判断是否结束
libcrackme.so:805059E2 BNE loc_805059D8
libcrackme.so:805059E4 ADDS R2, #0x62 ; 密码表开始地址加上0x62
libcrackme.so:805059E6
libcrackme.so:805059E6 loc_805059E6 ; CODE XREF: libcrackme.so:805059F2j
libcrackme.so:805059E6 STRB R3, [R2] ; 开始填充
libcrackme.so:805059E8 ADDS R3, #1
libcrackme.so:805059EA LSLS R3, R3, #0x18
libcrackme.so:805059EC LSRS R3, R3, #0x18
libcrackme.so:805059EE ADDS R2, #1
libcrackme.so:805059F0 CMP R3, #0x34 ; 判断是否完成
libcrackme.so:805059F2 BNE loc_805059E6 ; 开始填充
libcrackme.so:805059F4 LDR R2, =(byte_80515120 - 0x805059FA)
libcrackme.so:805059F6 ADD R2, PC ; byte_80515120
libcrackme.so:805059F8 ADDS R2, #0x31
libcrackme.so:805059FA
libcrackme.so:805059FA loc_805059FA ; CODE XREF: libcrackme.so:80505A06j
libcrackme.so:805059FA STRB R3, [R2] ; 填充
libcrackme.so:805059FC ADDS R3, #1
libcrackme.so:805059FE LSLS R3, R3, #0x18
libcrackme.so:80505A00 LSRS R3, R3, #0x18
libcrackme.so:80505A02 ADDS R2, #1
libcrackme.so:80505A04 CMP R3, #0x3E ; 判断是否完成
libcrackme.so:80505A06 BNE loc_805059FA ; 填充
libcrackme.so:80505A08 LDR R2, =(byte_80515120 - 0x80505A0E)
libcrackme.so:80505A0A ADD R2, PC ; byte_80515120
libcrackme.so:80505A0C MOVS R1, R2
libcrackme.so:80505A0E ADDS R1, #0x2C
libcrackme.so:80505A10 STRB R3, [R1]
libcrackme.so:80505A12 MOVS R3, R2
libcrackme.so:80505A14 ADDS R3, #0x30
libcrackme.so:80505A16 MOVS R1, #0x3F
libcrackme.so:80505A18 STRB R1, [R3]
libcrackme.so:80505A1A MOVS R3, R2
libcrackme.so:80505A1C ADDS R3, #0x3E
libcrackme.so:80505A1E MOVS R1, #0
libcrackme.so:80505A20 STRB R1, [R3]
libcrackme.so:80505A22 MOVS R3, #1
libcrackme.so:80505A24 STRB R3, [R2] ; 写入标志1,下次判断是否创建
密码每4个字节一组,然后将每字节加上密码表开始偏移得到表中数字.
将表中得到的数字进行逻辑运算得到3个数值,这样循环计算
libcrackme.so:80505A5A MOV R4, R12
libcrackme.so:80505A5C ADDS R0, R4, R3
libcrackme.so:80505A5E LDRB R4, [R0,R1] ; 取密码1字节
libcrackme.so:80505A60 LDR R0, [SP,#0x14]
libcrackme.so:80505A62 LDRB R4, [R0,R4] ; 将密码表当数组,密码当索引,
libcrackme.so:80505A64 ADD R0, SP, #0x1C
libcrackme.so:80505A66 STRB R4, [R1,R0] ; 存放取得密码表中的值
libcrackme.so:80505A68 LSLS R4, R4, #0x18
libcrackme.so:80505A6A BPL loc_80505A70
libcrackme.so:80505A6C MOVS R4, #0
libcrackme.so:80505A6E STRB R4, [R1,R0]
libcrackme.so:80505A70
libcrackme.so:80505A70 loc_80505A70 ; CODE XREF: libcrackme.so:80505A6Aj
libcrackme.so:80505A70 ADDS R1, #1
libcrackme.so:80505A72 CMP R1, #4 ; 每4字节一组
libcrackme.so:80505A74 BNE loc_80505A5A ; 判断是否结束
libcrackme.so:80505A76 ADD R1, SP, #0x1C ; 下面将从密码表中取得的值进行运算
libcrackme.so:80505A78 LDRB R0, [R1,#1]
libcrackme.so:80505A7A ADDS R7, #3
libcrackme.so:80505A7C ADDS R3, #4
libcrackme.so:80505A7E STR R0, [SP,#8]
libcrackme.so:80505A80 LDRB R4, [R1]
libcrackme.so:80505A82 ASRS R0, R0, #4
libcrackme.so:80505A84 LSLS R4, R4, #2
libcrackme.so:80505A86 ORRS R0, R4
libcrackme.so:80505A88 STRB R0, [R2]
libcrackme.so:80505A8A LDRB R4, [R1,#2]
libcrackme.so:80505A8C STR R4, [SP,#4]
libcrackme.so:80505A8E ASRS R0, R4, #2
libcrackme.so:80505A90 LDR R4, [SP,#8]
libcrackme.so:80505A92 LSLS R4, R4, #4
libcrackme.so:80505A94 STR R4, [SP,#8]
libcrackme.so:80505A96 ORRS R4, R0
libcrackme.so:80505A98 STRB R4, [R2,#1]
libcrackme.so:80505A9A LDR R0, [SP,#4]
libcrackme.so:80505A9C LDRB R1, [R1,#3]
libcrackme.so:80505A9E LSLS R4, R0, #6
libcrackme.so:80505AA0 ORRS R4, R1
libcrackme.so:80505AA2 STRB R4, [R2,#2]
libcrackme.so:80505AA4 ADDS R2, #3
libcrackme.so:80505AA6
libcrackme.so:80505AA6 loc_80505AA6 ; CODE XREF: libcrackme.so:80505A56j
libcrackme.so:80505AA6 LDR R1, [SP,#0x10]
libcrackme.so:80505AA8 CMP R3, R1 ; 判断是否结束,密码长度
libcrackme.so:80505AAA BLT loc_80505A58
将逻辑运算出来的值与账户值进制进行对比是否相同,相同显示成功。
libcrackme.so:8050548C sub_8050548C ; CODE XREF: libcrackme.so:80505ADEp
libcrackme.so:8050548C
libcrackme.so:8050548C var_1C= -0x1C
libcrackme.so:8050548C
libcrackme.so:8050548C PUSH {R0-R2,R4-R7,LR}
libcrackme.so:8050548E LDR R1, [R0,#0x34]
libcrackme.so:80505490 MOVS R6, R0
libcrackme.so:80505492 LDR R5, =(unk_80514F78 - 0x805054AA)
libcrackme.so:80505494 MOVS R0, R1
libcrackme.so:80505496 STR R1, [SP,#0x20+var_1C]
libcrackme.so:80505498 BLX strlen_0 ; 账户长度
libcrackme.so:8050549C MOVS R7, R0
libcrackme.so:8050549E MOVS R0, R6
libcrackme.so:805054A0 ADDS R0, #0x3C
libcrackme.so:805054A2 BLX strlen_0 ; 密码查表后逻辑运算出来的值
libcrackme.so:805054A6 ADD R5, PC ; unk_80514F78
libcrackme.so:805054A8 MOVS R4, #0
libcrackme.so:805054AA CMP R7, R0 ; 根据密码计算出来的值长度与账户长度比较
libcrackme.so:805054AC BEQ loc_805054E4 ; 判断是否结束
libcrackme.so:805054AE MOVS R0, #1
libcrackme.so:805054B0 BLX __cxa_allocate_exception
libcrackme.so:805054B4 MOVS R3, #1
libcrackme.so:805054B6 STRB R3, [R0]
libcrackme.so:805054B8 LDR R3, =0xFFFFFF48
libcrackme.so:805054BA MOVS R2, R4
libcrackme.so:805054BC LDR R1, [R5,R3]
libcrackme.so:805054BE B loc_805054DE
libcrackme.so:805054C0 ; ---------------------------------------------------------------------------
libcrackme.so:805054C0
libcrackme.so:805054C0 loc_805054C0 ; CODE XREF: sub_8050548C+5Aj
libcrackme.so:805054C0 LDR R1, [SP,#0x20+var_1C]
libcrackme.so:805054C2 ADDS R3, R6, R4
libcrackme.so:805054C4 ADDS R3, #0x3C
libcrackme.so:805054C6 LDRB R2, [R1,R4] ; 取账户值
libcrackme.so:805054C8 LDRB R3, [R3] ; 取密码查表后逻辑运算出来的值
libcrackme.so:805054CA CMP R2, R3 ; 比较是否相等
libcrackme.so:805054CC BEQ loc_805054E2
libcrackme.so:805054CE MOVS R0, #1
libcrackme.so:805054D0 BLX __cxa_allocate_exception
libcrackme.so:805054D4 MOVS R3, #1
libcrackme.so:805054D6 STRB R3, [R0]
libcrackme.so:805054D8 LDR R3, =0xFFFFFF48
libcrackme.so:805054DA
libcrackme.so:805054DA loc_805054DA ; CODE XREF: sub_8050548C+68j
libcrackme.so:805054DA LDR R1, [R5,R3]
libcrackme.so:805054DC MOVS R2, #0
libcrackme.so:805054DE
libcrackme.so:805054DE loc_805054DE ; CODE XREF: sub_8050548C+32j
libcrackme.so:805054DE BLX __cxa_throw
libcrackme.so:805054E2
libcrackme.so:805054E2 loc_805054E2 ; CODE XREF: sub_8050548C+40j
libcrackme.so:805054E2 ADDS R4, #1
libcrackme.so:805054E4
libcrackme.so:805054E4 loc_805054E4 ; CODE XREF: sub_8050548C+20j
libcrackme.so:805054E4 CMP R4, R7 ; 判断是否结束
libcrackme.so:805054E6 BLT loc_805054C0
libcrackme.so:805054E8 BNE loc_805054F6
libcrackme.so:805054EA MOVS R0, #4
libcrackme.so:805054EC BLX __cxa_allocate_exception
libcrackme.so:805054F0 LDR R3, =0xFFFFFF50
libcrackme.so:805054F2 STR R4, [R0]
libcrackme.so:805054F4 B loc_805054DA
libcrackme.so:805054F6 ; ---------------------------------------------------------------------------
libcrackme.so:805054F6
libcrackme.so:805054F6 loc_805054F6 ; CODE XREF: sub_8050548C+5Cj
libcrackme.so:805054F6 MOVS R0, #1
libcrackme.so:805054F8 POP {R1-R7,PC}
libcrackme.so:805054F8 ; End of function sub_8050548C
//-------强制修改比较值后显示成功。