一个密码破解
jni层做了加密
伪代码层是这样的
接着来动态调试。双开ida。然后attach上之后整个app就会闪退
如何查看是否被调试呢
adb shell 下 ps|grep com.yao 包名。。
其中TracePid就是被调试的pid
检测机制最早的两个时机是.init_array 和Jni_onload
.init_array是最早加载的一个段信息。现在一般的so解密都是在这里的。
jni——onload是在system.loadlibrary调用时执行。执行时机要早于native方法 但是晚于.init_array
所以ida在attach的时候在debugger中选择debugger option 中勾选suspend on library load/unload
adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity
进入调试状态
但是这里会发现没有rx权限的so文件
毕竟还没有走system。loadlibrary
这时候用jdb命令去attach 等待的程序
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
注意这里的apk包要debug模式 加在application块中
这时候就跳到linker上面了
这时候我们静态找到jni onload的地址
动态找到基地址
相加找到具体的jni onload的地址
1b9c
b3ba4000
相加如上
打个断点
会发现从这个地方会退出
然后从静态那边找到地址是1c58
不过这边我不是很确定怎么找 onload里面有两个blx 其中一个下面有一个函数调用。估摸着是这么找的
改一下
然后替换 打包一个新apk
打上断点
调试到最后这个cmp
发现会跳转到下面的函数 那么断定这里就是密码比较的地方
cmp比较的是r3寄存器的值 值采用的是寄存器寻址方式 即r2的地址
可以看到是aiyou,bucuoo