Android实战经验篇-内存踩踏(2)-分析方法

系列文章转如下链接:

系列文章转如下链接:

Android Display Graphics系列文章-汇总

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3570612385595473922#wechat_redirect

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系列文章-汇总

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3570612385595473922#wechat_redirect

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

系列文章关注公众号,持续更新中......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值