系列文章转如下链接:
系列文章转如下链接:
Android Display Graphics系列文章-汇总
Android实战经验篇-系列文章汇总
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3772136109094944770#wechat_redirect
Android实战经验篇-玩转Selinux(详解版)
https://mp.weixin.qq.com/s/Diqiq6SLUZLS5QZAamcj2A?token=1849347256&lang=zh_CN
系列文章关注公众号,持续更新中......
本文主要包括部分:
一、分析思路
二、定位方法
2.1 方法1
2.2 方法2
2.3 方法3
2.4 方法4
2.5 方法5
2.6 方法6
- 分析思路
通用的分析思路如下:
1、根据log、db+vmlinux定位踩内存的位置。
2、根据当时的信息结合代码判断是被踩坏还是指针异常,指针异常看是否也被踩坏或bitflip等其他问题。
3、如果被踩坏,那么检查踩坏的范围,踩坏后的内容。
4、根据上面的分析得出可能的类别。
5、按下面提供的调试方案导入复现,最后定位问题。
前面对踩内存进行了剖析,那如何根据剖析的结果下对应的策略呢?根据前面时间轴看踩内存,最终是要找出P点,但抓到的现场是在C点,那么我们就必须想方设法让P点和C点重合,也就是踩内存时就崩溃,这样就容易找问题点了。
而根据剖析的结果下对应的策略的目的就是让P点和C点重合。如果下错策略,很可能起不到效果。
PS:目前最新的AOSP推荐使用address sanitizer工具来分析内存踩坏问题,如ASan、HWASan和MTE,功能和性能方面都很好。本章节讲述的内存踩坏的调试方法,底层思想和上述工具都是一致的,了解后可以加深对这些工具的理解。
- Debug技巧
方法1、和方法2适用于越界踩内存;
2.1 方法1
1. 越界踩内存
如何提前发现这个情况呢?
常见的方法是多申请内存,然后在前后加pattern(特殊的内容),在释放时判断pattern,检查是否还是申请时写入的值。这无法使P点和C点重合,但至少在释放时就知道是否存在越界,也可以结合代码逻辑反推。
下面用C大致描述原理:
原本是调用malloc、free来申请、释放内存,我们hook这2个函数,重新实现如下(32bit系统):
void *malloc(size_t size)
{
size_t *p;
p = real_malloc(size + 3 * sizeof(size_t)); //real_malloc为hook前申请内存的函数,我们多申请3个size_t的内存用于存放pattern和大小
if (p) {
p[0] = 0xAAAAAAAA; //前4个字节格式化为aaaaaaaa
p[1] = size;
*(size_t *)((char *)&p[2] + size) = 0xBBBBBBBB; //后4个字节格式化为bbbbbbbb
return &p[2];
}
return NULL;
}
void free(void *p)
{
size_t *ptr = &((size_t *)p)[-2];
if (!p)
return;
if (ptr[0] !=0xAAAAAAAA || *(size_t *)((char *)&p[2] + p[1]) != 0xBBBBBBBB) {
printf("%p overflow!!!\n",p);
return;
}
real_free((void *)ptr); //real_free为hook前释放内存的函数。
}
全文请关注如下链接
系列文章转如下链接:
Android Display Graphics系列文章-汇总
Android实战经验篇-系列文章汇总
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3772136109094944770#wechat_redirect
Android实战经验篇-玩转Selinux(详解版)
https://mp.weixin.qq.com/s/Diqiq6SLUZLS5QZAamcj2A?token=1849347256&lang=zh_CN
系列文章关注公众号,持续更新中......