首页
社区
课程
招聘
[原创]用symbol来获得ShadowSSDT的原始地址和函数名
2009-7-30 17:26 16227

[原创]用symbol来获得ShadowSSDT的原始地址和函数名

2009-7-30 17:26
16227
在网上看了下,获得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_IMAGE
		IMAGEAPI
		ImageLoad(
		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);
}



先放张图片吧:


嗯,很成功~~~hoho~~~

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (19)
雪    币: 709
活跃值: (2210)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2009-7-30 18:28
2
0

雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
qihoocom 9 2009-7-30 18:39
3
0
太牛逼了,无法学习,只能膜拜
雪    币: 268
活跃值: (95)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
chimney 3 2009-7-30 18:51
4
0
学习!
雪    币: 84
活跃值: (51)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
nightxie 3 2009-7-30 18:56
5
0
菜鸟一只而已~~~
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haras 2009-7-30 19:09
6
0
我看行,再顶L
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
木桩 8 2009-7-30 20:12
7
0
SymLoadModule加载PDB啊,头一次见到这个方法。
之前我还手动复制了一份ShadowSSDT的函数名表到程序里... 学习了。
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
qihoocom 9 2009-7-30 21:31
8
0
太谦虚了,你写的不是代码,是寂寞
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你猜 2009-7-30 21:51
9
0
无语            123456
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zapline 2009-7-30 23:29
10
0
MJ回的不是贴,是寂寞
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
ImHolly 1 2009-7-31 10:48
11
0
寂寞
雪    币: 1227
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
boywhp 12 2009-8-2 08:13
12
0
唉 ,每个系统的pdb文件都不一样,你还不如硬编码呢
雪    币: 170
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
chzhn 2 2009-8-2 12:51
13
0
太强大了,如果没有pdb文件是不是可以从微软服务器下载下来再用呢?
雪    币: 8861
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2009-8-2 13:21
14
0
传说某工具就是那样的从服务器下载的~

但是万一我不小心把file给改了,就下载不到符号了~
雪    币: 7203
活跃值: (2928)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sisess 1 2010-2-14 13:02
15
0
强悍啊 这样也可以
雪    币: 101
活跃值: (104)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tmxfh 2010-2-18 19:04
16
0
偶没有成功,是全0.。
出错在SymLoadModule,总是不能成功
雪    币: 242
活跃值: (89)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pull 1 2010-9-21 18:15
17
0
KERNEL_PROCESS_HANDLE = 0xF0F0F0F0;
  KERNEL_64Value_HIGH       = 0xFFFFFFFF;
雪    币: 515
活跃值: (64)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
红尘岁月 2 2011-1-12 20:32
18
0
SymLoadModule
顶上来
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
goddkiller 2011-1-14 15:57
19
0
收下 ,感谢分享
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cjbclown 2011-1-14 16:16
20
0
ShadowSSDT到底是什么SSDT
游客
登录 | 注册 方可回帖
返回