-
-
[原创] PEB结构分析学习-无需调用系统api来调用函数
-
-
[原创] PEB结构分析学习-无需调用系统api来调用函数
想要不通过系统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小时前
被窗外的三脚猫编辑
,原因: