Windows x64平台 获取PEB表,并获取kernel32.dll的基址,并获取它的函数
参考了:https://www.cnblogs.com/aliflycoris/p/5185097.html
和另一位博主
话不多说,进入正题:
首先是获取PEB基址,先得懂怎么在64位平台嵌入汇编代码:参考这位博主https://blog.csdn.net/Giser_D/article/details/90670974
汇编代码:
.CODEGetPeb PROCmov rax,gs:[60h]retGetPeb ENDPEND
外部头文件引用:
extern "C" PVOID64 _cdecl GetPeb();
然后获取Kernel32基址:
HMODULE getKernel32Address()
{PVOID64 Peb = GetPeb();PVOID64 LDR_DATA_Addr = *(PVOID64**)((BYTE*)Peb+0x018); //0x018是LDR相对于PEB偏移 存放着LDR的基地址UNICODE_STRING* FullName; HMODULE hKernel32 = NULL;LIST_ENTRY* pNode = NULL;pNode =(LIST_ENTRY*)(*(PVOID64**)((BYTE*)LDR_DATA_Addr+0x30)); //偏移到InInitializationOrderModuleListwhile(true){FullName = (UNICODE_STRING*)((BYTE*)pNode+0x38);//BaseDllName基于InInitialzationOrderModuList的偏移if(*(FullName->Buffer+12)=='\0'){hKernel32 = (HMODULE)(*((ULONG64*)((BYTE*)pNode+0x10)));//DllBasebreak;}pNode = pNode->Flink;}return hKernel32;
}
然后就是根据上面方法得到的地址 ,函数名,获取对应函数的地址:
PVOID GetAddressFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName)
{PVOID get_address;ULONG ulFunctionIndex = 0;// Dos HeaderPIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress;// NT HeaderPIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew);// Export TablePIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress);// 有名称的导出函数个数ULONG ulNumberOfNames = pExportTable->NumberOfNames;// 导出函数名称地址表PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames);PCHAR lpName = NULL;// 开始遍历导出表for (ULONG i = 0; i < ulNumberOfNames; i++){lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]);// 判断是否查找的函数if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))){// 获取导出函数地址USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i);ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint);get_address = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr);break;}}return get_address;
}
ok,希望对大家有帮助,讲的不仔细,但是可以直接用。适用于64位平台,切记!
GetAddressFromExportTable获得的Kernel32.dll的ExitThread函数地址是跟实际有误差的,具体原因尚未知,不建议使用!
Windows x64平台 获取PEB表,并获取kernel32.dll的基址,并获取它的函数相关推荐
- Windows10 x64 获取PEB表,并获取ntdll基址
1.Windows通过TEB封装信息,TEB中包含PEB表,如图: (站在看雪大佬巨人的肩膀上才能看得更远) 具体过程是从teb->peb->ldr->InInitializatio ...
- php获取post表单数据_PHP get和post方法获取form表单数据
在 PHP 中使用 get 和 post 两种方法接收来自 form 表单的值,在 form 表单中可以定义 PHP 的接收方式和接收地址. get 和 post 方法主要有以下几点区别. get 是 ...
- vb 获取mysql表第一行数据_vb如何将远程获取的数据插入本机数据表中
双击按钮添加如下代码 Private Sub Command1_Click() Dim objRemoteConn As New ADODB.Connection Dim objLocal ...
- 获取kernel32.dll基址
获取kernel32.dll基址 一 原理和概述 找kernel32基地址的方法一般有三种:暴力搜索法.异常处理链表搜索法.PEB法. 暴力搜索法是最早的动态查找kernel32基地址的方法.它的原理 ...
- 浅谈Kernel32.dll(Windows平台下必有的动态库文件)
今天听了前辈的黑客攻击的知识分享,里面比较基础的元素就是Kernel32.dll,我对它感兴趣好久了,今天搜集一些资料,有关Kernel32的. 目录 编辑 一.Kernel32介绍 二.Kerne ...
- [Python黑帽] 一.获取Windows主机信息、注册表、U盘历史痕迹和回收站文件
最近开始学习网络安全和系统安全,接触到了很多新术语.新方法和新工具,作为一名初学者,感觉安全领域涉及的知识好广.好杂,但同时也非常有意思.这系列文章是作者学习安全过程中的总结和探索,我们一起去躺过那些 ...
- 纯 Win32 SDK程序为什么每次要获取设备描述表句柄
做过Win32 API程序的就会发现,要对窗口输出时,每次都要获取设备描述表句柄:都是对同一个窗口输出,设备描述表是一个:为什么每次都要获取设备描述表句柄呢?获取一次行吗? 做一个Win32 API程 ...
- 简单方便的获取所有表的条数
目录 文档用途 详细信息 文档用途 我们知道oracle里有一个系统表存的rownum.本文旨在介绍在HG数据库中简单方便的获取所有表的条数的方法. 详细信息 通过如下sql: select reln ...
- Windows下x86和x64平台的Inline Hook介绍
原文链接:https://blog.csdn.net/PeaZomboss/article/details/129095200?spm=1001.2014.3001.5501 前言 我在之前研究文明6 ...
最新文章
- 随手记一次用C#正则表达式获取下拉菜单html标签select以及相关属性值
- Python - 关于方法参数和字典更新(dict.update())方法
- 微型计算机温度控制系统课程设计,微机原理及其应用 微型计算机温度控制系统设计课程设计报告.doc...
- SQL2000中因为选定的用户拥有对象,所以无法除去该用户.
- 《一》php多进程编程:第一次fork
- 如何安装nginx_lua_module模块
- 100多千克的柠檬电池车可以开吗?
- 解决ff下JQuery无法监听input的keyup事件
- 股市像脱缰的“野牛”,谁是最好的“牛崽”?
- 【分享】自身经历谈一谈自然语言处理领域如何学习?
- 使用虚拟机搭建ClouderaManager平台,并自动部署一个hadoop集群(CDH)
- linux上chrome、vlc等程序root不能运行的解决办法
- 计算机重置指令,如何利用指令重置Win7网络设置
- python神奇的小海龟_Python绘图——认识turtle小海龟
- 个人邮箱地址格式,如何能够正确的书写?
- 学习Java的第六天:for循环,while循环,do-while循环
- 深度 DeepinXP-Lite V5.9
- 方程组变换+初等变换+矩阵等价+克莱姆法则
- win10专业版与家庭版区别分析
- Unity 灯光系统(一)