360加固分析(一)

分析某个app,发现加了360的壳,

一 准备

调试之前的准备工作
360加固分析(一)_第1张图片

adb shell am start -D -n 包名/MainActivity路径名

在这里插入图片描述

360加固分析(一)_第2张图片

adb forward tcp:23946 tcp:23946

360加固分析(一)_第3张图片

360加固分析(一)_第4张图片

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

360加固分析(一)_第5张图片

二 分析jiagu.so

加载完jiagu.so文件后,断在了linker区段
360加固分析(一)_第6张图片

360加固分析(一)_第7张图片

JNI_OnLoad处下断点断下后单步调试:_Z9__arm_a_1P7_JavaVMP7_JNIEnvPvRi ——> _Z9__arm_a_0v
——> _Z10__fun_a_18Pcj
函数 _Z10__fun_a_18Pcj流程图:
360加固分析(一)_第8张图片

switch语句总共有四十多个case,不知道哪个是关键,全部case分支都下断点,n次F9后发现每一次分发都会经过case41。在加载完jiagu.so后,跟踪mmap函数,没有跟出内存中解密释放dex文件就已经崩溃了,所以还需要通过反调试。

三 反调试

单步调试,在 中发现了这个
360加固分析(一)_第9张图片
当R1与0x40000000结果不为零时会跳转到R4,R4此时为退出进程或者堆栈平衡检查失败等函数,需要注意。

第n次进入case31时,BL LR跳转到这里
360加固分析(一)_第10张图片
读取/proc/self/maps,循环对比每次获取到的模块信息,是否包含“/system/bin/linker”,然后手快F9过了。。。

  • TracerPid
    继续F9,每次进入Case31分支都需要查看或进入bl Lr。
    第N次bl lr指令,LR:_Z10__arm_a_20v:
    360加固分析(一)_第11张图片
    读取/proc/pid/status文件中的TracerPid字段值
    循环获取本进程的status信息,adb命令对比查看:cat /proc/xxxxx/status
    360加固分析(一)_第12张图片
    360加固分析(一)_第13张图片

获取到tracerID后则跳出循环压栈保存,之后又是N次F9,
或者暂时去除case31外断点。再一次在case31断下。
360加固分析(一)_第14张图片
此时r0为TracerPId,如果id不为0说明正在被调试,我把他修改为0。
360加固分析(一)_第15张图片
同时查看LR寄存器地址为函数strtol,字符串转整形。

  • 端口检查
    打开/proc/net/tcp 获取文件指针,每次获取一行对比是否包含调试默认端口5D8A(23946),所以开启android_server时设置自定义端口为23333。
    360加固分析(一)_第16张图片

360加固分析(一)_第17张图片

你可能感兴趣的:(Android)