- 注册时间
- 2011-3-10
- 最后登录
- 1970-1-1
该用户从未签到
|
最近好多朋友研究TP,但编译出的结果令人不满意。。。本人愚钝,在文章这里的函数得到的结果错误,原文作者用了自定义函数如下:
//////////////////////////////////////////////////////////////////////
// 名称: MyEnumKernelModule
// 功能: 枚举内核模块
// 参数: str:内核模块名称
// moduleadd:该模块地址[传出]
// modulesie:该模块大小[传出]
// 返回:
//////////////////////////////////////////////////////////////////////
NTSTATUS MyEnumKernelModule(IN CHAR* str,OUT ULONG *moduleadd,OUT ULONG *modulesie)
{
NTSTATUS status = STATUS_SUCCESS;
ULONG n = 0;
ULONG i = 0;
PSYSTEM_MODULE_INFORMATION_ENTRY module = NULL;
PVOID pbuftmp = NULL;
ANSI_STRING ModuleName1,ModuleName2;
BOOLEAN tlgstst= FALSE; //如果找到了指定模块则设置为TRUE
//利用11号功能枚举内核模块
status = ZwQuerySystemInformation(11, &n, 0, &n);
//申请内存
pbuftmp = ExAllocatePool(NonPagedPool, n);
//再次执行,将枚举结果放到指定的内存区域
status = ZwQuerySystemInformation(11, pbuftmp, n, NULL);
module = (PSYSTEM_MODULE_INFORMATION_ENTRY)((PULONG )pbuftmp + 1 );
//初始化字符串
RtlInitAnsiString(&ModuleName1,str);
//
n = *((PULONG)pbuftmp );
for ( i = 0; i < n; i++ )
{
RtlInitAnsiString(&ModuleName2,&module.ImageName);
//DbgPrint("%d\t0x%08X 0x%08X %s\n",module.LoadOrderIndex,module.Base,module.Size,module.ImageName);
if (RtlCompareString(&ModuleName1,&ModuleName2,TRUE) == 0)
{
DbgPrint("MyEnumKernelModule:%s:%0X \n",ModuleName2.Buffer,module.Base);
*moduleadd = module.Base;
*modulesie = module.Size;
tlgstst = TRUE;
break;
}
}
ExFreePool(pbuftmp);
if tlgstst == FALSE)
{
return FAILED_TO_OBTAIN_FUNCTION_ADDRESSES;
}
return status;
}
但返回结果有错误。。。有可能是系统函数 ZwQuerySystemInformation被HOOK了吧。。。。为此,我只能用其他方法了。。
得到驱动的信息方法很多。。。我用的是遍历链表的方法,只要TP不断链表就一直有用。。。但在找很多文章里得到的结果依然错误。。。。。我就自己修改了部分。。终于OK了。。。至于特征码部分我并没有试验。。。我最不喜欢DNF的幼稚游戏。。。。也就没有TP,以下是新的 枚举内核模块 函数代码(遍历双向链表,学过c语言的人都会):
。。。。。。。。。。。。。。。。。。。。。。
本文参照了其他的一些代码。。如有误。。清大家指正。。。。 |
|