当前位置: 首页 > news >正文

可以搜任何网站的浏览器腾讯企点app

可以搜任何网站的浏览器,腾讯企点app,站长工具同大全站,怎么在微视上发视频赚收益在笔者的上一篇文章《内核特征码扫描PE代码段》中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址#xff0c;并通过ntimage.h头文件中提供的系列函数解析了指定内核模块的PE节表参数#xff0c;本章将继续延申这个话题#xff0c;实现…在笔者的上一篇文章《内核特征码扫描PE代码段》中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址并通过ntimage.h头文件中提供的系列函数解析了指定内核模块的PE节表参数本章将继续延申这个话题实现对PE文件导出表的解析任务导出表无法动态获取解析导出表则必须读入内核模块到内存才可继续解析所以我们需要分两步走首先读入内核磁盘文件到内存然后再通过ntimage.h中的系列函数解析即可。 PE结构Portable Executable Structure是Windows操作系统用于执行可执行文件和动态链接库DLL的标准格式。导出表Export Table是PE结构中的一个部分它记录了一个DLL中所有可供外部调用的函数和变量。 导出表通常位于PE结构的数据目录中。它包含两个重要的表格导出名称表格和导出地址表格。导出名称表格列出了DLL中所有导出函数和变量的名称而导出地址表格列出了这些函数和变量的内存地址。 当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入再根据DLL文件中函数的导出信息对可执行文件的导入表(IAT)进行修正。导出函数在DLL文件中导出信息被保存在导出表导出表就是记载着动态链接库的一些导出信息。通过导出表DLL文件可以向系统提供导出函数的名称、序号和入口地址等信息以便Windows装载器能够通过这些信息来完成动态链接的整个过程。 导出函数存储在PE文件的导出表里导出表的位置存放在PE文件头中的数据目录表中与导出表对应的项目是数据目录中的首个IMAGE_DATA_DIRECTORY结构从这个结构的VirtualAddress字段得到的就是导出表的RVA值导出表同样可以使用函数名或序号这两种方法导出函数。 导出表的起始位置有一个IMAGE_EXPORT_DIRECTORY结构与导入表中有多个IMAGE_IMPORT_DESCRIPTOR结构不同导出表只有一个IMAGE_EXPORT_DIRECTORY结构该结构定义如下 typedef struct _IMAGE_EXPORT_DIRECTORY {DWORD Characteristics;DWORD TimeDateStamp; // 文件的产生时刻WORD MajorVersion;WORD MinorVersion;DWORD Name; // 指向文件名的RVADWORD Base; // 导出函数的起始序号DWORD NumberOfFunctions; // 导出函数总数DWORD NumberOfNames; // 以名称导出函数的总数DWORD AddressOfFunctions; // 导出函数地址表的RVADWORD AddressOfNames; // 函数名称地址表的RVADWORD AddressOfNameOrdinals; // 函数名序号表的RVA } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;其中Name字段指向了该DLL的名称字符串Base字段为该DLL的加载基地址NumberOfFunctions和NumberOfNames分别表示导出函数和变量的数量AddressOfFunctions、AddressOfNames和AddressOfNameOrdinals则是三个表格的地址。 总的来说导出表是DLL中非常重要的一个部分它提供了一种方便的方法使其他程序可以调用DLL中的函数和变量。 上面的_IMAGE_EXPORT_DIRECTORY 结构如果总结成一张图如下所示 在上图中最左侧AddressOfNames结构成员指向了一个数组数组里保存着一组RVA每个RVA指向一个字符串即导出的函数名与这个函数名对应的是AddressOfNameOrdinals中的结构成员该对应项存储的正是函数的唯一编号并与AddressOfFunctions结构成员相关联形成了一个导出链式结构体。 获取导出函数地址时先在AddressOfNames中找到对应的名字MyFunc1该函数在AddressOfNames中是第1项然后从AddressOfNameOrdinals中取出第1项的值这里是1然后就可以通过导出函数的序号AddressOfFunctions[1]取出函数的入口RVA然后通过RVA加上模块基址便是第一个导出函数的地址向后每次相加导出函数偏移即可依次遍历出所有的导出函数地址。 其解析过程与应用层基本保持一致如果不懂应用层如何解析也可以去看我以前写过的《PE格式手写PE结构解析工具》里面具体详细的分析了解析流程。 首先使用InitializeObjectAttributes()打开文件打开后可获取到该文件的句柄InitializeObjectAttributes宏初始化一个OBJECT_ATTRIBUTES结构体, 当一个例程打开对象时由此结构体指定目标对象的属性此函数的微软定义如下 VOID InitializeObjectAttributes([out] POBJECT_ATTRIBUTES p, // 权限[in] PUNICODE_STRING n, // 文件名[in] ULONG a, // 输出文件[in] HANDLE r, // 权限[in, optional] PSECURITY_DESCRIPTOR s // 0 );当权限句柄被初始化后则即调用ZwOpenFile()打开一个文件使用权限FILE_SHARE_READ打开打开文件函数微软定义如下 NTSYSAPI NTSTATUS ZwOpenFile([out] PHANDLE FileHandle, // 返回打开文件的句柄[in] ACCESS_MASK DesiredAccess, // 打开的权限一般设为GENERIC_ALL。[in] POBJECT_ATTRIBUTES ObjectAttributes, // OBJECT_ATTRIBUTES结构[out] PIO_STATUS_BLOCK IoStatusBlock, // 指向一个结构体的指针。该结构体指明打开文件的状态。[in] ULONG ShareAccess, // 共享的权限。可以是FILE_SHARE_READ 或者 FILE_SHARE_WRITE。[in] ULONG OpenOptions // 打开选项一般设为 FILE_SYNCHRONOUS_IO_NONALERT。 );接着文件被打开后我们还需要调用ZwCreateSection()该函数的作用是创建一个Section节对象并以PE结构中的SectionALignment大小对齐映射文件其微软定义如下 NTSYSAPI NTSTATUS ZwCreateSection([out] PHANDLE SectionHandle, // 指向 HANDLE 变量的指针该变量接收 section 对象的句柄。[in] ACCESS_MASK DesiredAccess, // 指定一个 ACCESS_MASK 值该值确定对 对象的请求访问权限。[in, optional] POBJECT_ATTRIBUTES ObjectAttributes, // 指向 OBJECT_ATTRIBUTES 结构的指针该结构指定对象名称和其他属性。[in, optional] PLARGE_INTEGER MaximumSize, // 指定节的最大大小以字节为单位。[in] ULONG SectionPageProtection, // 指定要在 节中的每个页面上放置的保护。 [in] ULONG AllocationAttributes, // 指定确定节的分配属性的SEC_XXX 标志的位掩码。 [in, optional] HANDLE FileHandle // 可选指定打开的文件对象的句柄。 );最后读取导出表就要将一个磁盘中的文件映射到内存中内存映射核心文件时ZwMapViewOfSection()该系列函数在应用层名叫MapViewOfSection()只是一个是内核层一个应用层这两个函数参数传递基本一致以ZwMapViewOfSection为例其微软定义如下 NTSYSAPI NTSTATUS ZwMapViewOfSection([in] HANDLE SectionHandle, // 接收一个节对象[in] HANDLE ProcessHandle, // 进程句柄,此处使用NtCurrentProcess()获取自身句柄[in, out] PVOID *BaseAddress, // 指定填充地址[in] ULONG_PTR ZeroBits, // 0[in] SIZE_T CommitSize, // 每次提交大小 1024[in, out, optional] PLARGE_INTEGER SectionOffset, // 0[in, out] PSIZE_T ViewSize, // 浏览大小[in] SECTION_INHERIT InheritDisposition, // ViewShare[in] ULONG AllocationType, // 分配类型 MEM_TOP_DOWN[in] ULONG Win32Protect // 权限 PAGE_READWRITE(读写) );将如上函数研究明白那么代码就变得很容易了首先InitializeObjectAttributes设置文件权限与属性然后调用ZwOpenFile打开文件接着调用ZwCreateSection创建节对象最后调用ZwMapViewOfSection将磁盘文件映射到内存这段代码实现起来很简单完整案例如下所示 #include ntifs.h #include ntimage.h #include ntstrsafe.h// 内存映射文件 NTSTATUS KernelMapFile(UNICODE_STRING FileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) {NTSTATUS status STATUS_SUCCESS;HANDLE hFile NULL;HANDLE hSection NULL;OBJECT_ATTRIBUTES objectAttr { 0 };IO_STATUS_BLOCK iosb { 0 };PVOID pBaseAddress NULL;SIZE_T viewSize 0;// 设置文件权限InitializeObjectAttributes(objectAttr, FileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);// 打开文件status ZwOpenFile(hFile, GENERIC_READ, objectAttr, iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);if (!NT_SUCCESS(status)){return status;}// 创建节对象status ZwCreateSection(hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile);if (!NT_SUCCESS(status)){ZwClose(hFile);return status;}// 映射到内存status ZwMapViewOfSection(hSection, NtCurrentProcess(), pBaseAddress, 0, 1024, 0, viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE);if (!NT_SUCCESS(status)){ZwClose(hSection);ZwClose(hFile);return status;}// 返回数据*phFile hFile;*phSection hSection;*ppBaseAddress pBaseAddress;return status; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint(驱动卸载 \n); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark \n);NTSTATUS status STATUS_SUCCESS;HANDLE hFile NULL;HANDLE hSection NULL;PVOID pBaseAddress NULL;UNICODE_STRING FileName {0};// 初始化字符串RtlInitUnicodeString(FileName, L\\??\\C:\\Windows\\System32\\ntoskrnl.exe);// 内存映射文件status KernelMapFile(FileName, hFile, hSection, pBaseAddress);if (NT_SUCCESS(status)){DbgPrint(读取内存地址 %p \n, pBaseAddress);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }运行这段程序即可读取到ntoskrnl.exe磁盘所在文件的内存映像基地址效果如下所示 如上代码读入了ntoskrnl.exe文件接下来就是解析导出表首先将pBaseAddress解析为PIMAGE_DOS_HEADER获取DOS头并在DOS头中寻找PIMAGE_NT_HEADERS头接着在NTHeader头中得到数据目录表此处指向的就是导出表PIMAGE_EXPORT_DIRECTORY通过pExportTable-NumberOfNames可得到导出表的数量通过(PUCHAR)pDosHeader pExportTable-AddressOfNames得到导出表的地址依次循环读取即可得到完整的导出表。 NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark \n);NTSTATUS status STATUS_SUCCESS;HANDLE hFile NULL;HANDLE hSection NULL;PVOID pBaseAddress NULL;UNICODE_STRING FileName { 0 };LONG FunctionIndex 0;// 初始化字符串RtlInitUnicodeString(FileName, L\\??\\C:\\Windows\\System32\\ntoskrnl.exe);// 内存映射文件status KernelMapFile(FileName, hFile, hSection, pBaseAddress);if (NT_SUCCESS(status)){DbgPrint([LyShark] 读取内存地址 %p \n, pBaseAddress);}// Dos 头PIMAGE_DOS_HEADER pDosHeader (PIMAGE_DOS_HEADER)pBaseAddress;// NT 头PIMAGE_NT_HEADERS pNtHeaders (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader pDosHeader-e_lfanew);// 导出表PIMAGE_EXPORT_DIRECTORY pExportTable (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader pNtHeaders-OptionalHeader.DataDirectory[0].VirtualAddress);// 有名称的导出函数个数ULONG ulNumberOfNames pExportTable-NumberOfNames;DbgPrint([lyshark] 导出函数个数: %d \n\n, ulNumberOfNames);// 导出函数名称地址表PULONG lpNameArray (PULONG)((PUCHAR)pDosHeader pExportTable-AddressOfNames);PCHAR lpName NULL;// 开始遍历导出表(输出ulNumberOfNames导出函数)for (ULONG i 0; i ulNumberOfNames; i){lpName (PCHAR)((PUCHAR)pDosHeader lpNameArray[i]);// 获取导出函数地址USHORT uHint *(USHORT *)((PUCHAR)pDosHeader pExportTable-AddressOfNameOrdinals 2 * i);ULONG ulFuncAddr *(PULONG)((PUCHAR)pDosHeader pExportTable-AddressOfFunctions 4 * uHint);PVOID lpFuncAddr (PVOID)((PUCHAR)pDosHeader ulFuncAddr);// 获取SSDT函数IndexFunctionIndex *(ULONG *)((PUCHAR)lpFuncAddr 4);DbgPrint(序号: [ %d ] | Hint: %d | 地址: %p | 函数名: %s \n, i, uHint, lpFuncAddr, lpName);}// 释放指针ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress);ZwClose(hSection);ZwClose(hFile);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }代码运行后即可获取到当前ntoskrnl.exe程序中的所有导出函数输出效果如下所示 SSDT表通常会解析\\??\\C:\\Windows\\System32\\ntoskrnl.exeSSSDT表通常会解析\\??\\C:\\Windows\\System32\\win32k.sys 根据上方的函数流程将其封装为GetAddressFromFunction()用户传入DllFileName指定的PE文件以及需要读取的pszFunctionName函数名即可输出该函数的导出地址。 // 寻找指定函数得到内存地址 ULONG64 GetAddressFromFunction(UNICODE_STRING DllFileName, PCHAR pszFunctionName) {NTSTATUS status STATUS_SUCCESS;HANDLE hFile NULL;HANDLE hSection NULL;PVOID pBaseAddress NULL;// 内存映射文件status KernelMapFile(DllFileName, hFile, hSection, pBaseAddress);if (!NT_SUCCESS(status)){return 0;}PIMAGE_DOS_HEADER pDosHeader (PIMAGE_DOS_HEADER)pBaseAddress;PIMAGE_NT_HEADERS pNtHeaders (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader pDosHeader-e_lfanew);PIMAGE_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]);USHORT uHint *(USHORT *)((PUCHAR)pDosHeader pExportTable-AddressOfNameOrdinals 2 * i);ULONG ulFuncAddr *(PULONG)((PUCHAR)pDosHeader pExportTable-AddressOfFunctions 4 * uHint);PVOID lpFuncAddr (PVOID)((PUCHAR)pDosHeader ulFuncAddr);if (_strnicmp(pszFunctionName, lpName, strlen(pszFunctionName)) 0){ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress);ZwClose(hSection);ZwClose(hFile);return (ULONG64)lpFuncAddr;}}ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress);ZwClose(hSection);ZwClose(hFile);return 0; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint(驱动卸载 \n); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark \n);UNICODE_STRING FileName { 0 };ULONG64 FunctionAddress 0;// 初始化字符串RtlInitUnicodeString(FileName, L\\??\\C:\\Windows\\System32\\ntdll.dll);// 取函数内存地址FunctionAddress GetAddressFromFunction(FileName, ZwQueryVirtualMemory);DbgPrint(ZwQueryVirtualMemory内存地址 %p \n, FunctionAddress);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }如上程序所示当运行后即可获取到ntdll.dll模块内ZwQueryVirtualMemory的导出地址输出效果如下所示
http://wiki.neutronadmin.com/news/285745/

相关文章:

  • 物流行业网站建设市场分析免费成品网站
  • 网站ui设计基础中关村电脑网官方
  • 做百度网站每年的费用360度街景实景地图下载
  • 重庆工程招标网站有哪些兰州seo优化公司
  • 网站最合适的字体大小wordpress集成环境搭建
  • 网站建设公司国内技术最强dede珠宝商城网站源码
  • 阿里云建站视频教程福州做网站的公司有哪些
  • 有人做网站推广吗HTML转换WordPress文件
  • 普宁17网站一起做淘宝有什么网站可以做问卷调查
  • 保定建设网站及推广怎么生成网址链接
  • 北京网站设计公司cg成都柚米科技15帮别人发广告赚钱平台
  • 苏州专业网站建设开发公司做企业网站一般多少钱
  • 福建省住房和建设厅网站138ip查询网域名解析
  • 台州网站建设惠店科技推广模式怎么写
  • 河北城乡和住房建设厅官方网站泰安城市建设吧
  • 视频网站开发方法python网页版编程
  • 免费做网站教程软件公司网站模板
  • 网站源代码查看竞网做的网站怎么
  • 新乡商城网站建设哪家专业16种营销模式
  • 网站备案可以国际域名小程序图片制作
  • 做网站一定要psd吗自己开发app挣钱吗
  • 珠海网站制作公司传销网站开发系统维护
  • 信阳工程建设一体化平台网站互联网企业投诉服务平台
  • 扶贫网站开发的目的是什么免费的网站制作
  • 只用html5做网站自己建网站做那个模块好
  • 当当网网站建设需求分析网站源码是什么意思
  • 正规网站建设加盟合作网络推广的方式有哪些
  • 重庆网站优化建设做决定网站
  • 网站建设报告心得体会百度提交入口网址
  • 东莞市长安网站建设公司衡阳网站建设icp备