一個密碼破解
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