首页
社区
课程
招聘
[下载]发个获得SSDT函数名和索引号的代码
发表于: 2010-11-30 01:13 22335

[下载]发个获得SSDT函数名和索引号的代码

2010-11-30 01:13
22335
通过枚举ntdll.dll的导出表,先是判断是不是Nt开头的,是的话再判断第一要语句是不是mov eax,是的话再取得索引号。

具体见源码,没有什么技术含量。
只是觉得前面有很多人写过了,但是后面可能还有很多人写,所以丢出来,供大家娱乐一下。


// 使用说明例子
#include "GetSSDTInformation.h"
#include <stdio.h>

int main(void)
{
GetSSDTInformation ssdt ;
char szServiceName[MAXBYTE] = {0} ;
int nServiceID = 0 ;
int nCount = 0 ;
if (TRUE == ssdt.FindFirst(szServiceName, nServiceID))
{
printf("FunName: %-50s ServiceID: %d\r\n", szServiceName, nServiceID) ;
while (TRUE == ssdt.FindNext(szServiceName, nServiceID))
{
printf("FunName: %-50s ServiceID: %d\r\n", szServiceName, nServiceID) ;
++nCount ;
}
}
printf("SSDT Service Function Count: %d\r\n", nCount) ;

// 用完记得FindClose一下
ssdt.FindClose() ;
return 0 ;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (16)
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享。。。
2010-11-30 09:32
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
3
2010-11-30 13:52
0
雪    币: 107
活跃值: (172)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
来顶一下~~~~~~
2010-11-30 16:49
0
雪    币: 281
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
太强大了吧,
2011-8-29 13:35
0
雪    币: 4560
活跃值: (1037)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
不错不错,有代码就好,懒人路过
2011-8-29 13:57
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
7
最初见到这个方法的时候,是在某病毒的驱动中,用来恢复SSDT hook,不由感慨现在的病毒都做安全软件该做的事了。

这个东东应该写成内核模块,用来检测SSDT hook和重建SSDT,你这代码用来学习不错,想拿来直接用就很麻烦了。
2011-8-29 14:09
0
雪    币: 9
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
正需要,下了看看
2011-11-20 22:02
0
雪    币: 9
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
哎,不是完整代码啊,编译通不过
2011-11-20 22:14
0
雪    币: 9
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
隔了好些天再看,自己编译器设置的问题,是完整代码。感谢楼主了
2011-12-9 02:58
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
Mark~!~!~!~
2011-12-9 10:24
0
雪    币: 483
活跃值: (822)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
哈哈,我写成c++类就是想人家用起来方便....
2012-1-4 11:47
0
雪    币: 29
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
下载收藏备用
2012-12-15 13:04
0
雪    币: 18
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
发现个小问题哦。。
// 如果是Nt开头的话,说不定是SSDT的函数
if (NULL != strstr(pFunName, "Nt"))

这里你会多读出一个函数。
输出:
FunName: NtYieldExecution                                   ServiceID: 400
FunName: RtlGetLongestNtPathLength                          ServiceID: 269

RtlGetLongestNtPathLength,因为这个函数名中也有Nt字符串!
我改成了 :if (pFunName[0] == (char)'N' && pFunName[1] == (char)'t')

还有就是main函数中的 nCount 计数问题。

呵呵。。
2013-2-20 11:10
0
雪    币: 483
活跃值: (822)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
收到回复了,非常感谢指出问题。
2013-2-20 16:50
0
雪    币: 18
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
客气客气,呵呵。
最近在研究驱动编程,你的这段代码写了也有些年头,我只是仔细研读了一番。
还要多多膜拜大牛你呢。呵呵。
2013-2-21 10:21
0
雪    币: 483
活跃值: (822)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
17
膜拜就不必了,互相学习吧,我都好久没有写过代码了,呵呵...
2013-2-24 10:15
0
游客
登录 | 注册 方可回帖
返回