本帖最后由 枫少丶夜 于 2019-3-1 10:43 编辑
第一、利用IDA静态分析native函数 1.isEquals函数分析
函数指令代码: 
简单分析指令代码:
1>、PUSH {r3-r7,lr} 是保存r3,r4,r5,r6,r7,lr 的值到内存的栈中;与之对应的是POP {r3-r7,pc} pc:程序寄存器,保留下一条CPU即将执行的指令
lr: 连接返回寄存器,保留函数返回后,下一条应执行的指令 2>、调用strlen,malloc,strcpy之前一般都是由MOV指令,用来传递参数值的,比如这里的R5里面存储的就是strlen函数的参数,R0就是is_number函数的参数;在后面的动态调试的过程中可以得到函数的入口参数值。 
3>、在每次调用有返回值的函数之后的命令,一般都是比较指令,比如CMP,CBZ,或者是strcmp等,这里是我们破解的突破点,因为一般加密再怎么厉害,最后比较的参数肯定是正确的密码(或者是正确的加密之后的密码)和我们输入的密码(或者是加密之后的输入密码),我们在这里就可以得到正确密码,或者是加密之后的密码:如上图。 到这里,我们就分析完了native层的密码比较函数:isEquals 2.可以使用F5键,查看他的C语言代码: 
3>、在每次调用有返回值的函数之后的命令,一般都是比较指令,比如CMP,CBZ,或者是strcmp等,这里是我们破解的突破点,因为一般加密再怎么厉害,最后比较的参数肯定是正确的密码(或者是正确的加密之后的密码)和我们输入的密码(或者是加密之后的输入密码),我们在这里就可以得到正确密码,或者是加密之后的密码:如上图。 到这里,我们就分析完了native层的密码比较函数:isEquals
|