在网上看了下,获得ShadowSSDT的函数名和原始地址的方法和文章不是很多。比较简单的应该算是设计张函数名表和用symbol的方法。

个人觉得用symbol来获得ShadowSSDT还是比较方便的,而且自己也不用去创建一张表,何乐而不为。^_^

这办法简单的原因是我只需要一个win32.sys,win32.pdb,以及调用不到10个的API就能完成工作。

好,来看看怎么调用这些函数。

1.调用SymInitialize初始化Dbghelp这系列的函数。
2.调用ImageLoad读取文件win32.sys。
3.调用SymLoadModule来读取pdb文件。
4.调用SymEnumSymbols枚举符号,其中一个参数是回调函数SymEnumSymbolsProc,that's the key。
SymEnumSymbolsProc中有一个系统会帮忙填充一个为PSYMBOL_INFO结构的参数。在这个结构中我主要用到的是Name和Address。
5.调用ImageUnload和SymCleanup做一些清理工作。

OK,看一下我的思路。

首先是获得W32pServiceTable的地址。熟悉ShadowSSDT都知道,W32pServiceTable是在内核初始化用来填充ShadowSSDT的表。
然后,知道了W32pServiceTable的地址,后面的事情也很容易。用SymEnumSymbolsProc把ShadowSSDT每个函数的地址和函数名保存下来。

说起来有点复杂,但代码很简单的。

#include <windows.h>
#include <stdio.h>
#include <Dbghelp.h>#pragma comment(lib, "Dbghelp.lib")
#pragma comment(lib, "Imagehlp.lib")extern "C" {PLOADED_IMAGEIMAGEAPIImageLoad(PCSTR DllName,PCSTR DllPath);BOOL IMAGEAPI ImageUnload(PLOADED_IMAGE LoadedImage  );}//
//用于存放得到的ShadowSSDT的函数和函数名
//
typedef struct _SHADOWFUNC
{CHAR FuncName[100];DWORD FuncAddr;}SHADOWFUNC, *PSHADOWFUNC;DWORD    g_W32pServiceTable = 0;
SHADOWFUNC  g_ShadowFunc[667] = {0};//
//回调函数,用于获得ShadowSSDT的函数和函数名
//
BOOL CALLBACK SymEnumSymbolsProc(PSYMBOL_INFO  pSymInfo,ULONG  SymbolSize,PVOID  UserContext)
{PDWORD  pW32pServiceTable = NULL;INT    i = 0;if (!UserContext){if (strstr(pSymInfo->Name, "W32pServiceTable")){printf("%s, %#x\n", pSymInfo->Name, pSymInfo->Address);g_W32pServiceTable = (DWORD)pSymInfo->Address;}}else{pW32pServiceTable = (PDWORD)UserContext;for (i = 0; i < 667; i++){if (*(pW32pServiceTable + i) == (DWORD)pSymInfo->Address){g_ShadowFunc[i].FuncAddr = (DWORD)pSymInfo->Address;lstrcpyn(g_ShadowFunc[i].FuncName, pSymInfo->Name, 100);        }}}return TRUE;
}void main()
{INT        i = 0;PDWORD      pW32pServiceTable = 0;HANDLE      hHandle = 0;PLOADED_IMAGE  ploadImage = {0};DWORD      dwload = 0;hHandle = GetCurrentProcess();SymInitialize(hHandle, NULL, TRUE);ploadImage = ImageLoad("win32k.sys", NULL);dwload = SymLoadModule (hHandle, ploadImage->hFile, "win32k.sys", "win32k.pdb", 0, ploadImage->SizeOfImage);SymEnumSymbols(hHandle, dwload, NULL, SymEnumSymbolsProc, NULL);if (g_W32pServiceTable){pW32pServiceTable = (PDWORD)(g_W32pServiceTable - dwload + (DWORD)ploadImage->MappedAddress);SymEnumSymbols(hHandle, dwload, NULL, SymEnumSymbolsProc, pW32pServiceTable);}for (i = 0; i < 667; i++){printf("%03d, 0x%08X, %s\n", i, g_ShadowFunc[i].FuncAddr, g_ShadowFunc[i].FuncName);}ImageUnload(ploadImage);SymCleanup(hHandle);
}

效果如下:

用symbol来获得ShadowSSDT的原始地址和函数名相关推荐

  1. linux函数地址获取函数名,函数名/函数地址/函数指针

    函数指针:1.指针变量 2.指针变量指向函数 这正如用指针变量可指向整型变量.字符型.数组一样. 在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址. 可利用该指针变量调用函数, ...

  2. 函数名地址、函数名取地址、函数名解引用问题

    以下,转载自http://blog.sina.com.cn/s/blog_6aafe9c90100xg2y.html 对一个函数进行 如下操作: 1.函数名地址 2.函数名取地址 3.函数名解引用 它 ...

  3. 根据函数指针地址获取函数名

    man backtrace_symbols_fd,里面有对应的实例,或也可参考 http://blog.csdn.net/snow168rain/article/details/52043719, 其 ...

  4. linux 查看软连接的源头,linux 软连接怎么查看原始地址

    满意答案 hjqalj 推荐于 2016.11.15 采纳率:50%    等级:13 已帮助:6264人 linux下查看软连接的信息使用命令 ls -L 最后一列就是原始地址 ls命令是linux ...

  5. 微信图文中出现了腾讯视频时,教你弄到不能直接获取的视频原始地址的方法~

    微信图文中出现了腾讯视频时,教你弄到不能直接获取的视频原始地址的方法~ 千古文章一大抄,在微信公众号的运营当中,免不了会复制别人的内容,不过很多时候遇到有视频的图文内容时,我总希望能找到视频原地址,然 ...

  6. linux查看软连接实际地址,linux 软连接怎么查看原始地址?

    linux下查看软连接的信息使用命令 ls -L 最后一列就是原始地址 ls命令是linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,下面我们就来一起看看ls的用 ...

  7. php100视频原始地址列表整理:

    php100视频原始地址列表整理: 教程名称 . 1:环境配置与代码调试 2:PHP的数据类型与源码调试 3:常用PHP运算类型介绍与应用 4: PHP条件语句介绍与应用 5:PHP循环语句的介绍与应 ...

  8. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in {uint8_t sinlen;(4个字节)sa_family_t sin_family;(4个字节)in_port_t sin_port ...

  9. qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

最新文章

  1. 克隆真人语音只要1句话,AI问诊超96.4%全科医生!科大讯飞年度黑科技大秀,余承东都来了...
  2. idea中不小心把文件夹删了
  3. php错误提示:date_default_timezone_get
  4. Access常用类型及查询语法 [Access]
  5. 最新卡通渲染效果图(附带一张次世代帅哥)
  6. C#:Dockpanel的一些入门的基本操作
  7. AntDesign Pro + .NET Core 实现基于JWT的登录认证
  8. python库快速安装_python的pip快速安装代码
  9. Linux常用命令(1)
  10. eclipse中配置heritrix1.14.3
  11. 抽象类和接口的主要区别
  12. 第09篇:Spring处理Mybatis事务
  13. 设备状态监测系统提升企业设备管理水平
  14. 企业工商信息数据API接口
  15. 用友U8案例教程目录
  16. mac 重启 ssh 服务
  17. Android 的 LiveReload — jimu Mirror
  18. java的springboot项目操作阿里云OSS下载文件、查看文件内容、上传文件,自定义工具类
  19. The Linux Kernel Module Programming Guide 2.4 中文版
  20. 常见室内观赏植物的管理技术大全

热门文章

  1. 推荐一些顶级的开源CI/CD工具
  2. MySQL集群(一)之主从复制
  3. glance系列二:glance部署及操作
  4. [asp.net core]project.json(1)
  5. Track与nqa联动 VS 静态路由优先级相同
  6. Javascript深入浅出
  7. BitSet 数字排序
  8. mac 安装swoole
  9. Solaris底下配置samba
  10. 正确、安全地停止springboot应用