# 关于BeaconEye里的一点小bug

BeaconEye这个工具很好通过检查程序heap中的特征来查看CS Payload效果也是非常好，但是这个工具有一个小bug在某些时候会无法查找到CS Payload

这个bug出现的主要是因为如下原因

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8mukOdNq_H2y9HRH%2Fimage-20210903110051717.png?alt=media\&token=7b498f7c-0a76-4277-a3a8-0da29452444e)

这是它收集heap块的算法看似好像没有啥问题，PEB里找到heap数组和数组个数后就开始循环读取。但是作者没有考虑到另一种情况作者认为每个heap都是只有一个heap段

我们来从windbg查看

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8mue2QrBg2G8mr6s%2Fimage-20210903111329739.png?alt=media\&token=ea2a21ab-7556-4d28-9df0-d58498b8991c)

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8mufCgQ_YeJ_ShGt%2Fimage-20210903111350466.png?alt=media\&token=fb086432-c7d1-4544-a978-c9e75e170a2c)

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8mugy2zGHEJKdXz3%2Fimage-20210903111409576.png?alt=media\&token=7b703cab-b366-407b-ac27-df809cf6909f)

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8muhdfH-bWgpFySD%2Fimage-20210903111433709.png?alt=media\&token=ff559cb5-6420-4e00-bd67-6198d4ab3f49)

问题就出现在这里，很明显这里某个堆中存在两个heap Segment，如果按照作者那样我们就只能收集到3个内存块，如果只是收集到三个内存块还好，怕就怕在如果CS Payload调用malloc分配内存时刚好使用了这第二个segment没有使用第一个那就会造成BeaconEye漏掉了这块内存也就无法扫到特征

我们来试着修复这个问题，先查看\_HEAP结构体

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8muiL3t3-Tm9fIpd%2Fimage-20210903112019007.png?alt=media\&token=d110404f-52e9-4979-b0f1-bbb9d1131df4)

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-Mie8eXiE_DdCOchAFD_%2F-Mie8muji7lfni4laVBS%2Fimage-20210903112119804.png?alt=media\&token=4c148d54-01a7-49ce-a714-11876eaf9535)

这是一个双向链表连接着所有的heap Segment，所以应该去遍历这个链表（忽视这个代码的垃圾吧）\
原先的遍历代码有问题这里我直接引用D\_infinite师傅的代码了

![](https://3226329500-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MDZyrMxFR2BnFjV82cS%2F-MiyGCTpXxwkdQ11GLas%2F-MiyGc1zWFu342cXy9eR%2F20210907112102.png?alt=media\&token=a3e7a987-25c2-402d-8c78-011f934a798d)

然后原先扫不到的现在就能扫到了

同时D\_infinite师傅也发现一个新的问题之前堆块并未遍历导致如果批量分配大量的heap会产生新的绕过，这块并不好搞因为堆的机制比较复杂而且部分地方heap结构是加密的最好的办法是扫全内存，因为heap实现本身就微软内部的事

D\_infinite师傅的文章：<https://mp.weixin.qq.com/s/_gSPWVb1b-xuvhU6ynmw0Q>
