首页
社区
课程
招聘
[原创] PEB结构分析学习-无需调用系统api来调用函数
发表于: 2026-9-24 13:49 597

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

2026-9-24 13:49
597

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

 

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

 

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

参考VergiliusProject结构体查询网站:f28K9s2c8@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指向三个模块链表,这样就会做到一个循环(借用一个图)。


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2026-9-24 13:53 被窗外的三脚猫编辑 ,原因:
收藏
点赞 ・7
打赏
分享
最新回复 (2)
雪    币: 3566
活跃值: (7969)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2 楼
牛逼牛逼牛逼牛逼牛逼
2026-9-24 20:50
0
雪    币: 2790
活跃值: (7186)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3 楼
感谢分享
2026-9-27 04:20
0
游客
登录 | 注册 方可回帖
返回