首页
社区
课程
招聘
[原创] PEB结构分析学习-无需调用系统api来调用函数
发表于: 20小时前 250

[原创] PEB结构分析学习-无需调用系统api来调用函数

20小时前
250

想要不通过系统api拿到dll模块的函数地址,那么就不得不提通过PEB(Process Environment Block)结构拿到dllBase基址,再通过导出表拿到函数的RVA,最后相加就可以得到函数地址了。那好,了解大概方法之后,我们开始一步步实践。

 

微软将进程中的每个线程都设置了一个独立的结构数据。这个结构体内存储着当前线程大量的信息。这个结构被称为TEB(线程进程模块)。而线程模块下又有一个成员为PEB(进程环境模块),这个线程下就存储着整个进程的信息。

 

这里有一张图,详细指出了TEB的结构

参考VergiliusProject结构体查询网站:0a1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2$3k6i4u0Y4K9h3I4A6N6i4y4H3M7X3!0B7k6h3y4@1i4K6u0W2j5$3!0E0i4K6u0r3K9$3g2J5L8X3g2D9M7H3`.`.

可以看出TEB->PEB->PEB_LDR_DATA->LIST_ENTRY->LDR_DATA_TABLE_ENTRY这样一个关系

首先拿到TEB,TEB结构指针存储在fs寄存器中,那么怎样才能定位到这个位置呢?

TEB=fs:[0x18] 这是为什么呢? 已知TEB结构指针存储在fs寄存器中,那么通过看TEB中的这个结构,可以看到0x18为Self也就是指向自己,所以fs:[0x18]就是TEB

 

TEB结构下的 0x30为PEB地址

 

PEB结构 可以看到0x2为一个调试标志位 1时为正在被调试 可以用来检测调试器 但是也很容易被hook 接下来我们要重点关注LDR 在0xc偏移下存储着它的地址

 

在LDR下我们可以看到 有三个_LIST_ENTRY结构 我们选择使用第三个(选择哪一个都是对的)

 

该结构下有两个指针 Fink表示指针下一个链表 Blink指上一个链表

 

 

而LDR_DATA_TABLE链表的结构是这样的,大家可以发现它依然会通过_LIST_ENTRY指向三个模块链表,这样就会做到一个循环(借用一个图)。


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

最后于 20小时前 被窗外的三脚猫编辑 ,原因:
收藏
点赞 ・4
打赏
分享
最新回复 (1)
雪    币: 3539
活跃值: (7834)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2 楼
牛逼牛逼牛逼牛逼牛逼
13小时前
0
游客
登录 | 注册 方可回帖
返回