首页
社区
课程
招聘
[原创]R3读文件获取原始SSDT Shadow里地址
发表于: 2009-11-13 13:20 17169

[原创]R3读文件获取原始SSDT Shadow里地址

2009-11-13 13:20
17169

方法不是原创,先声明,免得被骂,代码是自己写的
        参考资料是:http://hi.baidu.com/robin_dev/blog/item/5a593fca5449ec18be09e6cf.html
          在这里郑重感谢!!!这个帖子给了个方法,无码,不过有这个了实现倒是不难,我自己写了一个,看到看雪论坛上也没这个方法的代码,所以在这分享出来,写得很烂,希望各位指正,喷我也没关系。
       我封装成了一个类(个人的习惯啊),比较简单,感谢教主等人的帮助。
       类声明:

//file:SDTShadowRestore.h

#ifndef SDTSHADOWRESTORE_H

#define SDTSHADOWRESTORE_H

#include <windows.h>
#include <Tchar.h>

typedef struct _SYSTEM_SERVICE_TABLE 
{ 
   PVOID   ServiceTableBase; 
   PULONG   ServiceCounterTableBase; 
   ULONG   NumberOfService; 
   ULONG   ParamTableBase; 
}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
	PVOID KiServiceTabe;
	PVOID W32pServiceTable;
	PVOID Reserved_1;
	PVOID Reserved_2;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;


class SDTShadowRestore
{
public:
	SDTShadowRestore(void)
	{
		m_dwWin32kBase = 0;
		m_dwW32pServiceTable = 0;
		m_KeServiceDescriptorTableShadow = 0;
		this->Init();
	}
	~SDTShadowRestore(void)
	{
		if(m_pKernelName)
		{
			::GlobalFree(m_pKernelName);
		}
	}
	bool Init();           //初始化该类
	DWORD FindW32pServiceTable();     //得到原始W32pServiceTable内存地址
	DWORD GetAddressSSDTShadow();            //得到KeServiceDescriptorTableShadow在内核中的内存地址
	DWORD GetServiceAddressById(DWORD ServiceId);        //获取服务原始地址
private:
	void AnsiToPTSTR(PTSTR DesStr, char *SourceStr, DWORD cbDesStr);
	
	DWORD GetProcFromIAT(LPCTSTR szProcName);      //根据函数名在IAT中查找函数地址
private:
	PIMAGE_OPTIONAL_HEADER m_pWin32kOptionalHeader;           //可选头的地址,非RVA
	HMODULE m_hWin32kModule;              //自己加载的Win32k.sys内核模块的模块句柄
	LPTSTR m_pKernelName;           //内核核心模块名
	HMODULE m_hKernelModule;            //内核核心模块ntoskrnl.exe或者ntkrnlpa.exe
	DWORD m_dwKernelBase;         //内核基址
	DWORD m_dwWin32kBase;         //Win32k.sys基址
	PSERVICE_DESCRIPTOR_TABLE m_KeServiceDescriptorTableShadow;         //内核中SSDT Shadow的真实内存地址
	DWORD m_dwW32pServiceTable;      //原始W32pServiceTaable表真实地址
};

#endif   

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我也菜鸟,楼主留个Q和你交流学习下吧
2009-11-13 14:17
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
R3倒不如R0简单
2009-11-13 18:20
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
R3能做的不在R0里做,而且也简单不到哪去
2009-11-13 19:51
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
是Ro下很简单
2009-11-15 14:46
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
this->m_hWin32kModule = ::LoadLibraryEx(_T("Win32k.sys"), 0, DONT_RESOLVE_DLL_REFERENCES);  
不会成功的,因为Win32k.sys的基址大于0x80000000,LoadLibaryEx无法满足这个要求
2009-12-3 15:46
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
晕。。。你自己试试就知道了
2009-12-3 21:22
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
只是加载到内存而已,要是LoadLibrary真能把它加载到那个位置就太牛了,一种新的突破各种XX保护的驱动加载方法诞生了
2009-12-3 22:06
0
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
我在程序中试过了,确实是不可以::LoadLibraryEx(_T("Win32k.sys"), 0, DONT_RESOLVE_DLL_REFERENCES)呀!!我感觉可以的?为什么呢?错误号ERROR_INVALID_ADDRESS
487 Attempt to access invalid address.
2009-12-3 23:10
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
diuboss应该是对的

LoadLibraryEx(_T("Win32k.sys"), 0, DONT_RESOLVE_DLL_REFERENCES);  
不会成功的
2009-12-3 23:15
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
LZ都说是用户态加载了........试试更健康
2009-12-4 11:04
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
晕 我怎么就行,加载到自己的内存,返回值hmodule是你进程用户态的地址~~(比如0x01020000)
2009-12-4 11:08
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
R0怎么做?
2009-12-4 11:12
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
难道是rp问题... 你的系统是什么?
2009-12-4 11:58
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
无语了,我用vista sp2就可以, 但用xp悲剧的返回0

但xp下用ImageLoad

PLOADED_IMAGE pLoad = ImageLoad("win32k.sys",NULL);

这样就可以
2009-12-4 12:29
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
还好 =_=  俺还以为...

估计要 Vista已后的系统才能成功加载吧
2009-12-4 15:05
0
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
我的系统版本下确实不行。。我感觉确实是跟OS Version 有关系 。。。无奈。。。
2009-12-4 20:06
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
18
说了这么久,楼主都没说自己是在哪个版本系统下测试成功的
2009-12-5 11:47
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
19
不知道为啥xp不能LoadLibrary win32k.sys 但是却能加载ntkrnlpa.exe~

所以还是用imageload或者createfilemapping加载文件,直接读取.data然后重定位更容易~比LZ代码少很多...

xp sp2~~vista sp2测试成功
2009-12-5 12:16
0
游客
登录 | 注册 方可回帖
返回
//