ssdt函数索引号_BUG:SSDT函数名获取SSDT函数号
ULONG GetFunctionId(char* FunctionName)
/*++
Routine Description:
[已删除,请勿再提任何无理要求。]
Arguments:
FunctionName - 导出的函数名.
Return Value:
函数的服务号的地址.
--*/
{
NTSTATUS ntstatus;
HANDLE hFile = NULL;
HANDLE hSection = NULL;
OBJECT_ATTRIBUTES object_attributes;
IO_STATUS_BLOCK io_status = { 0 };
PVOID baseaddress = NULL;
SIZE_T size = 0;
//模块基址
// PVOID ModuleAddress = NULL;
//偏移量
ULONG dwOffset = 0;
PIMAGE_DOS_HEADER dos = NULL;
#ifdef _WIN64
PIMAGE_NT_HEADERS64 nt = NULL;
#else
PIMAGE_NT_HEADERS nt = NULL;
#endif
PIMAGE_DATA_DIRECTORY expdir = NULL;
PIMAGE_EXPORT_DIRECTORY exports = NULL;
ULONG addr;
ULONG Size;
PULONG functions;
PSHORT ordinals;
PULONG names;
ULONG max_name;
ULONG max_func;
ULONG i;
ULONG pFunctionAddress = 0;
ULONG ServiceId;
UNICODE_STRING DllName;
RtlInitUnicodeString(&DllName, L"\\SystemRoot\\system32\\ntdll.dll");
//初始化OBJECT_ATTRIBUTES结构
InitializeObjectAttributes(
&object_attributes,
&DllName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
//打开文件
ntstatus = ZwCreateFile(
&hFile,
FILE_EXECUTE | SYNCHRONIZE,
&object_attributes,
&io_status,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE |
FILE_RANDOM_ACCESS |
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if (!NT_SUCCESS(ntstatus))
{
KdPrint(("[GetFunctionAddress] error0\n"));
KdPrint(("[GetFunctionAddress] ntstatus = 0x%x\n", ntstatus));
return 0;
}
//创建区段
InitializeObjectAttributes(
&object_attributes,
NULL,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
#ifndef SEC_IMAGE
#define SEC_IMAGE 0x1000000
#endif
ntstatus = ZwCreateSection(
&hSection,
SECTION_ALL_ACCESS,
&object_attributes,
0,
PAGE_EXECUTE,
SEC_IMAGE,
hFile);
if (!NT_SUCCESS(ntstatus))
{
KdPrint(("[GetFunctionAddress] error1\n"));
KdPrint(("[GetFunctionAddress] ntstatus = 0x%x\n", ntstatus));
return 0;
}
//映射区段到进程虚拟空间
ntstatus = ZwMapViewOfSection(
hSection,
NtCurrentProcess(), //ntddk.h定义的宏用来获取当前进程句柄
&baseaddress,
0,
1000,
0,
&size,
(SECTION_INHERIT)1,
MEM_TOP_DOWN,
PAGE_READWRITE);
if (!NT_SUCCESS(ntstatus))
{
KdPrint(("[GetFunctionAddress] error2\n"));
KdPrint(("[GetFunctionAddress] ntstatus = 0x%x\n", ntstatus));
return 0;
}
//得到模块基址
dwOffset = (ULONG)baseaddress;
//验证基址
//KdPrint(("[GetFunctionAddress] BaseAddress:0x%x\n", dwOffset));
dos = (PIMAGE_DOS_HEADER)baseaddress;
#ifdef _WIN64
nt = (PIMAGE_NT_HEADERS64)((ULONG)baseaddress + dos->e_lfanew);
#else
nt = (PIMAGE_NT_HEADERS)((ULONG)baseaddress + dos->e_lfanew);
#endif
expdir = (PIMAGE_DATA_DIRECTORY)(nt->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT);
addr = expdir->VirtualAddress;//数据块起始RVA
Size = expdir->Size; //数据块长度
exports = (PIMAGE_EXPORT_DIRECTORY)((ULONG)baseaddress + addr);
functions = (PULONG)((ULONG)baseaddress + exports->AddressOfFunctions);
ordinals = (PSHORT)((ULONG)baseaddress + exports->AddressOfNameOrdinals);
names = (PULONG)((ULONG)baseaddress + exports->AddressOfNames);
max_name = exports->NumberOfNames;
max_func = exports->NumberOfFunctions;
for (i = 0; i < max_name; i++)
{
ULONG ord = ordinals[i];
if (i >= max_name || ord >= max_func)
{
return 0;
}
if (functions[ord] < addr || functions[ord] >= addr + Size)
{
if (strncmp((PCHAR)baseaddress + names[i], FunctionName, strlen(FunctionName)) == 0)
{
pFunctionAddress = (ULONG)((ULONG)baseaddress + functions[ord]);
break;
}
}
}
//KdPrint(("[GetFunctionAddress] %s:0x%x\n",FunctionName, pFunctionAddress));
ServiceId = *(PSHORT)(pFunctionAddress + 1);
//打印导出函数服务号
//KdPrint(("[GetServiceId] ServiceId:0x%x\n",ServiceId));
//卸载区段,释放内存,关闭句柄
ZwUnmapViewOfSection(NtCurrentProcess(), baseaddress);
ZwClose(hSection);
ZwClose(hFile);
return ServiceId;
}
ssdt函数索引号_BUG:SSDT函数名获取SSDT函数号相关推荐
- ssdt函数索引号_【NT】一行代码获取SSDT服务索引号
注:本文是以32位的windows7为实例. 今天在研究SSDT的过程中看到了一个大神写的教程,其中还附了一些代码,代码主要讲解的是SSDT hook过程,我在他的代码中没有看到任何有关服务函数的索引 ...
- python函数助手_转jmeter(十五)函数助手
由于时间和版本问题,其中有些内容和排版我做了修改和重新整理,使其更符合最新的jmeter版本. 一.使用jmeter函数助手 启动jmeter后,可以在JMeter的选项菜单中找到函数助手对话框(快捷 ...
- 使用WinDbg获取SSDT 系统服务描述表的函数服务号(索引)
今天研究了一下午SSDT的东东,最尴尬的是起初我不知道如何获取到SSDT的函数服务号,而这个玩意儿在不同版本的windows是不一样的,后面经过研究还是找到了正确的方法.这里简单的分享一下. · ...
- python函数装饰嵌套_python3--函数名本质,函数嵌套,闭包,装饰器
python函数的嵌套和作用域链 函数的嵌套调用def max2(x,y): m = x if x > y else y # 三元运算 return m def max4(a,b,c,d): ...
- python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题
python解决open()函数.xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题 参考文章: (1)python解决open()函数.xlrd.open_w ...
- CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。
CMSIS:Cortex Microcontroller Software Interface Standard CMSIS对异常和中断标识符.中断处理函数名以及中断向量异常号都有严格的要求.异常和中 ...
- 函数调用通过函数名字符串调用函数【C语言版】
在写这篇文章之前,xxx已经写过了几篇关于改函数调用主题的文章,想要了解的朋友可以去翻一下之前的文章 问题引入 在C中,函数先定义,后使用.举个简单的例子 /********************* ...
- java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...
问题描述: 某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(), ...
- c++ 如何不用decltype获取一个函数指针的类型名
举例,假设函数是 bool compareIsbn(const string &s1,const string &s2); 那么如何获取指向这个函数指针的类型?我们在map中要用到这 ...
- C语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数
某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(),可是fun_ ...
最新文章
- 对 Thinking in java 4th Edition I/O DirList.java的疑问
- 2018-3-2线性表
- 用Python做一个翻译软件,还怕英语不好?
- 在WAS中得到OracleConnection
- silverlight storyboard
- 配置Goldengate支持DDL
- MMM结合Semisync机制实现Mysql Master-Master高可用
- 【CodeForces - 27E】Number With The Given Amount Of Divisors (数论,数学,反素数)
- 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
- 个人分享:一些学者实用的网站
- 如何把TS视频文件转换为MP4格式?
- 7-13 寻找大富翁 (25 分)
- RNA保护液、FastAb佐剂、核酸提取试剂盒丨为您的实验锦上添花
- 惠普暗影精灵4pro安装ubuntu16.04
- [Python]根据ip地址计算子网掩码位数
- ArcGIS 10.2.2支持无损CityGML格式进行3D城市建模
- 工具之DBeaver安装及使用
- 滴滴柳青:一个比你有才,又比你努力的富二代!
- 港美股系统开发软件开发之证券交易软件供应商对比
- Kubernetes pod 状态出现 ImagePullBackOff 的原因