2014ali crackme2
image.png
一个密码破解
image.png
jni层做了加密
image.png
伪代码层是这样的
接着来动态调试。双开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
image.png
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块中
image.png
image.png
这时候就跳到linker上面了
这时候我们静态找到jni onload的地址
动态找到基地址
相加找到具体的jni onload的地址
image.png
1b9c
image.png
b3ba4000
image.png
相加如上
image.png
打个断点
image.png
会发现从这个地方会退出
image.png
然后从静态那边找到地址是1c58
不过这边我不是很确定怎么找 onload里面有两个blx 其中一个下面有一个函数调用。估摸着是这么找的
image.png
image.png
image.png
改一下
然后替换 打包一个新apk
image.png
打上断点
调试到最后这个cmp
image.png
发现会跳转到下面的函数 那么断定这里就是密码比较的地方
cmp比较的是r3寄存器的值 值采用的是寄存器寻址方式 即r2的地址
image.png
可以看到是aiyou,bucuoo