高通Android 7.1遇到cnss-daemo进程崩溃,分析过程如下:

Log信息:(红色是关键信息)
pid: 6577, tid: 6577, name: cnss-daemon  >>> /system/bin/cnss-daemon <<<
signal 6 (SIGABRT) , code -6 (SI_TKILL), fault addr --------
    x0   0000000000000000  x1   00000000000019b1  x2   0000000000000006  x3   0000000000000008
x4   000000000000006e  x5   0000000000800000  x6   0000007fb7736000  x7   0000000000000000
......
backtrace:
    #00 pc 000000000006b790  /system/lib64/libc.so (tgkill+8)
    #01 pc 0000000000068c14  /system/lib64/libc.so (pthread_kill+64)
    #02 pc 0000000000024180  /system/lib64/libc.so (raise+24)
    #03 pc 000000000001cbec  /system/lib64/libc.so (abort+52)
    #04 pc 0000000000002a4c  /system/bin/cnss-daemon
    #05 pc 00000000000004dc  [vdso:0000007fb7737000]
    #06 pc 0000000000002730  /system/bin/cnss-daemon
    #07 pc 0000000000002058  /system/bin/cnss-daemon
    #08 pc 000000000001a7d8  /system/lib64/libc.so (__libc_init+88)
    #09 pc 0000000000001e40  /system/bin/cnss-daemon

问题分析:

1、addr2line找问题代码行:
   addr2line -e cnss-daemon -f (pc地址)
执行命令
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -e out/target/product/msm8953_64_box3/obj/EXECUTABLES/cnss-daemon_intermediates/PACKED/cnss-daemon -f 0000000000002a4c
    wsvc_debug_init
/proc/self/cwd/vendor/qcom/proprietary/wlan/cnss-daemon/debug.c:139
定位代码在文件debug.c,函数wsvc_debug_init的139行。

debug.c文件

static void wsvc_debug_sigsegv_handler(int signum)
{wsvc_printf_err("SIGSEGV Crashed! %d\n", signum);abort();  // 139行return;
}

cnss-daemon截取了signal,看不到真正崩溃的位置,拿掉signal截取部分,复现问题,获取tombstone。
tombstone片段:
Fatal signal 11 (SIGSEGV), code 1,
      fault addr 0x8015912764 in tid 19936 (cnss-daemon)
继续使用addr2line找崩溃的代码行。
    nl_loop_process_msg

vendor/qcom/proprietary/wlan/cnss-daemon/nl_loop.c:261

(图:修改前后对比差异)

2、代码分析

崩溃在函数NLMSG_OK:
宏NLMSG_OK(nlh,len)用于判断消息是否有len这么长。

#define NLMSG_OK(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(sizeof(struct nlmsghdr)))

从函数NLMSG_OK 判断nlh指向非法内存地址,nlh从NLMSG_NEXT取到。宏NLMSG_NEXT(nlh,len)用于得到下一个消息的首地址,同时len也减少为剩余消息的总长度。

#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \(struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))

当len<=(nlh)->nlmsg_len,获取nlh指向非法地址。

3、解决方法

获取nlh前比较len和nlh->nlmsg_len。

if (u_len <= NLMSG_ALIGN(nlh->nlmsg_len)) {wsvc_printf_err("%s: no enough message, len: %u, nlmsg_len: %u",__func__,u_len, nlh->nlmsg_len);break;
}nlh = NLMSG_NEXT(nlh, u_len);

Android缺陷分析:cnss-daemo进程崩溃相关推荐

  1. android 行 64,android缺陷分析:内核空指针

    高通Android 7.1平台出现内核崩溃,log如下: (红色是关键信息) [ 65.862388] msm_isp_get_buf: bug mgr open cnt = 0 [ 65.87176 ...

  2. 【Android 逆向】Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )

    文章目录 一./proc/pid_num 进程号对应进程信息文件 1.进程查询 2.进程目录 3.进程启动命令 / 包名 4.oom_adj 进程优先级 5.maps 进程内存使用概况 6.smaps ...

  3. Android APP native 崩溃分析之 linker SIGBUS 崩溃

    原文地址:https://caikelun.io/post/2019-05-31-android-app-native-crash-linker-sigbus/ 这是 Android APP nati ...

  4. Android系统的心脏-Zygote进程启动流程分析

    简介: Android中,Zygote是整个Android系统的核心进程,是Android系统的心脏.所有的Android应用程序,包括Android框架层所在的进程system_server,都是由 ...

  5. Android 9(P)之init进程启动源码分析指南之一

         Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  6. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

  7. android7.0 进程管理,Android 7.0 ActivityManagerService(8) 进程管理相关流程分析(2) updateOomAdjLocked...

    前一篇博客进程管理相关流程分析(1)里, 我们介绍了AMS中updateLruProcessLocked函数相关的流程. updateLruProcessLocked只是按照进程中运行的组件,粗略地定 ...

  8. Android 安全分析和漏洞挖掘|工具集

    @tanprathan 最近在Github上放出了一份移动应用安全分析工具的清单(Cheat Sheet),里边工具比较齐全.Security Toolkit翻译了其中的Android部分,大家有兴趣 ...

  9. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

最新文章

  1. 【js】实现分页查询操作的步骤
  2. JVM致命错误日志(hs_err_pid.log)分析
  3. 你不会编程,不是你不行,很有可能是老师教的方法不好。科学家发现:对大脑而言,代码编程与语言学习不同...
  4. 【干货】救火必备:线上故障排查套路大全
  5. Linux 获取设备树源文件(DTS)里描述的资源
  6. 用jekyll制作高大上的网站(二)——实际应用
  7. linux下tomcat部署java web项目_在linux下用tomcat部署java web项目的过程与注意事项
  8. 安吉丽娜-朱莉曝光罕见少女照(图)
  9. 《缠中说禅108课》53:三类买卖点的再分辨
  10. 免费公网动态IP方案
  11. Win10运行红色警戒2尤里的复仇联机技巧+防守地图
  12. 微软打击盗版的“三部曲”
  13. 如何创建sis文件——PKG文件格式
  14. Re:从零开始的DS生活 轻松和面试官扯一个小时栈
  15. 生活记录:记录2020暑假前半部分时光
  16. 解除带宽限速,提升电脑网速
  17. 《“边缘计算+”技术白皮书》发布!
  18. 支撑电子政务平台的CMS内容管理系统
  19. [每天读一点英文:那些给我勇气的句子]George Soros—the financial crocodile
  20. 计算机基础之网络层的功能和服务

热门文章

  1. 【外网访问学校服务器】阿里云服务器+frp+内网服务器
  2. java双人对弈五子棋源码_JAVA高手接招————— 五子棋双人对弈程序
  3. Navicat 导出表生成PDM文件
  4. DB2-GPFS(General Parallel File System)并行文件系统简叙、安装使用及DB高可用
  5. 震旦复印机扫描到服务器文件夹,震旦打印一体机扫描文件上传到win2016共享文件夹,不能上传...
  6. Oracle 12.2新特性掌上手册 - 第一卷 Availability
  7. 路由器检测U盘,如果有则调用tcpdump,抓包文件到U盘
  8. “借壳”上市成功,戴尔首日收涨2%
  9. 石油币,世界第一个主权加密数字货币.md
  10. 杂谈SuperMap支持的三维数据