分析某个app,发现加了360的壳,
一 准备
调试之前的准备工作
adb shell am start -D -n 包名/MainActivity路径名
adb forward tcp:23946 tcp:23946
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
二 分析jiagu.so
加载完jiagu.so文件后,断在了linker区段
JNI_OnLoad处下断点断下后单步调试:_Z9__arm_a_1P7_JavaVMP7_JNIEnvPvRi ——> _Z9__arm_a_0v
——> _Z10__fun_a_18Pcj
函数 _Z10__fun_a_18Pcj流程图:
switch语句总共有四十多个case,不知道哪个是关键,全部case分支都下断点,n次F9后发现每一次分发都会经过case41。在加载完jiagu.so后,跟踪mmap函数,没有跟出内存中解密释放dex文件就已经崩溃了,所以还需要通过反调试。
三 反调试
单步调试,在 中发现了这个
当R1与0x40000000结果不为零时会跳转到R4,R4此时为退出进程或者堆栈平衡检查失败等函数,需要注意。
第n次进入case31时,BL LR跳转到这里
读取/proc/self/maps,循环对比每次获取到的模块信息,是否包含“/system/bin/linker”,然后手快F9过了。。。
- TracerPid
继续F9,每次进入Case31分支都需要查看或进入bl Lr。
第N次bl lr指令,LR:_Z10__arm_a_20v:
读取/proc/pid/status文件中的TracerPid字段值
循环获取本进程的status信息,adb命令对比查看:cat /proc/xxxxx/status
获取到tracerID后则跳出循环压栈保存,之后又是N次F9,
或者暂时去除case31外断点。再一次在case31断下。
此时r0为TracerPId,如果id不为0说明正在被调试,我把他修改为0。
同时查看LR寄存器地址为函数strtol,字符串转整形。
- 端口检查
打开/proc/net/tcp 获取文件指针,每次获取一行对比是否包含调试默认端口5D8A(23946),所以开启android_server时设置自定义端口为23333。