360加固分析(一)

分析某个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。
    在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yusakul/article/details/86242858