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函数号相关推荐

  1. ssdt函数索引号_【NT】一行代码获取SSDT服务索引号

    注:本文是以32位的windows7为实例. 今天在研究SSDT的过程中看到了一个大神写的教程,其中还附了一些代码,代码主要讲解的是SSDT hook过程,我在他的代码中没有看到任何有关服务函数的索引 ...

  2. python函数助手_转jmeter(十五)函数助手

    由于时间和版本问题,其中有些内容和排版我做了修改和重新整理,使其更符合最新的jmeter版本. 一.使用jmeter函数助手 启动jmeter后,可以在JMeter的选项菜单中找到函数助手对话框(快捷 ...

  3. 使用WinDbg获取SSDT 系统服务描述表的函数服务号(索引)

    今天研究了一下午SSDT的东东,最尴尬的是起初我不知道如何获取到SSDT的函数服务号,而这个玩意儿在不同版本的windows是不一样的,后面经过研究还是找到了正确的方法.这里简单的分享一下. ·    ...

  4. python函数装饰嵌套_python3--函数名本质,函数嵌套,闭包,装饰器

    python函数的嵌套和作用域链 函数的嵌套调用def max2(x,y): m = x if x > y else y  # 三元运算 return m def max4(a,b,c,d): ...

  5. python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题

    python解决open()函数.xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题 参考文章: (1)python解决open()函数.xlrd.open_w ...

  6. CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。

    CMSIS:Cortex Microcontroller Software Interface Standard CMSIS对异常和中断标识符.中断处理函数名以及中断向量异常号都有严格的要求.异常和中 ...

  7. 函数调用通过函数名字符串调用函数【C语言版】

    在写这篇文章之前,xxx已经写过了几篇关于改函数调用主题的文章,想要了解的朋友可以去翻一下之前的文章 问题引入 在C中,函数先定义,后使用.举个简单的例子 /********************* ...

  8. java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...

    问题描述: 某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(), ...

  9. c++ 如何不用decltype获取一个函数指针的类型名

    举例,假设函数是  bool compareIsbn(const string &s1,const string &s2); 那么如何获取指向这个函数指针的类型?我们在map中要用到这 ...

  10. C语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数

    某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(),可是fun_ ...

最新文章

  1. 对 Thinking in java 4th Edition I/O DirList.java的疑问
  2. 2018-3-2线性表
  3. 用Python做一个翻译软件,还怕英语不好?
  4. 在WAS中得到OracleConnection
  5. silverlight storyboard
  6. 配置Goldengate支持DDL
  7. MMM结合Semisync机制实现Mysql Master-Master高可用
  8. 【CodeForces - 27E】Number With The Given Amount Of Divisors (数论,数学,反素数)
  9. 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
  10. 个人分享:一些学者实用的网站
  11. 如何把TS视频文件转换为MP4格式?
  12. 7-13 寻找大富翁 (25 分)
  13. RNA保护液、FastAb佐剂、核酸提取试剂盒丨为您的实验锦上添花
  14. 惠普暗影精灵4pro安装ubuntu16.04
  15. [Python]根据ip地址计算子网掩码位数
  16. ArcGIS 10.2.2支持无损CityGML格式进行3D城市建模
  17. 工具之DBeaver安装及使用
  18. 滴滴柳青:一个比你有才,又比你努力的富二代!
  19. 港美股系统开发软件开发之证券交易软件供应商对比
  20. Kubernetes pod 状态出现 ImagePullBackOff 的原因

热门文章

  1. 会玩,也是一种积极的生活态度
  2. Java回收对象的标记 和 对象的二次标记过程
  3. 如果你突然打了个喷嚏,那
  4. uni-app编译报caniuse-lite is outdated
  5. iOS 给三方日历加上农历
  6. 《软件测试过程改进》读书笔记
  7. Maya:解决丢失的贴图和引用
  8. 超炫酷html+css+javascript实现登录模板
  9. iOS MVVM + RxSwift 关键词zip 的调用时机问题
  10. LSTM Networks应用于股票市场探究