首页
社区
课程
招聘
[旧帖] [求助]请问枚举内核模块这问题 0.00雪花
发表于: 2011-7-27 19:24 2076

[旧帖] [求助]请问枚举内核模块这问题 0.00雪花

2011-7-27 19:24
2076
[QUOTE=竹君;131458]#include "refresh.h"
void FindModuleByAddress( ULONG Address, PVOID buffer)
{
  NTSTATUS status;
  ULONG size;
  ULONG i;
  ULONG minAddress;
  ULONG maxAddress;
  PSYSMODULELIST List;

  ZwQuerySystemInformation( SystemModuleInformation ,&size,0,&size);
  KdPrint(("[FindModuleByAddress] size:0x%x\n",size));
  List=(PSYSMODULELIST)ExAllocatePool(NonPagedPool,size);
  if(List==NULL)
  {
    KdPrint(("[FindModuleByAddress] malloc memory failed\n"));
    return ;
  }

  status=ZwQuerySystemInformation(SystemModuleInformation,List,size,0);
  if(!NT_SUCCESS(status))
  {
    KdPrint(("[FindModuleByAddress] query failed\n"));
    //打印错误
    KdPrint(("[FindModuleByAddress] status: 0x%x\n",status));
    ExFreePool( List );
    return ;
  }
  //得到了模块链表
  //判断模块名
  for( i=0; i<List->ulCount; i++)
  {  
    //得到模块的范围
    minAddress = (ULONG)List->smi[i].Base;
    maxAddress = minAddress + List->smi[i].Size;
    //判断地址
    if( Address >= minAddress && Address <= maxAddress )
    {
      memcpy( buffer, List->smi[i].ImageName,sizeof(List->smi[i].ImageName));
      KdPrint(("[FindModuleByAddress] modulename: %s\n",buffer));
      break;
    }
  }
      //释放内存
      ExFreePool(List);
} [/QUOTE]

这个是枚举内核模块的例子 看雪前辈的
我怎么就找不到 PSYSMODULELIST  这结构呢
搜遍了WRK DDK WINSDK  BAIDU GOOGLE 都没有这结构体的定义
请问下在线的前辈们 这结构存在吗
可否给小菜看看它的定义呢

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
typedef struct _SYSTEM_MODULE_INFORMATION {
    ULONG   Reserved[2];
    PVOID   Base;
    ULONG   Size;
    ULONG   Flags;
    USHORT  Index;
    USHORT  Unknown;
    USHORT  LoadCount;
    USHORT  ModuleNameOffset;
    CHAR    ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
2011-7-27 19:34
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也正怀疑是这个啊
但是它何来ulCount呢
List->ulCount
2011-7-27 20:20
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
应该是 List-> LoadCount
结构自定义了一下
2011-7-27 20:25
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我用别的方式了

再问
NTSTATUS MyEnumKernelModule(IN CHAR* str,OUT ULONG *moduleadd,OUT ULONG *modulesie) 
{ 
	NTSTATUS status = STATUS_SUCCESS;
	BOOLEAN  tlgstst= FALSE; 
	ULONG   n       = 0; 
	ULONG   i       = 0; 
	PSYSTEM_MODULE_INFORMATION_ENTRY   module = NULL; 
	PVOID   pbuftmp = NULL; 
	ANSI_STRING    ModuleName1,ModuleName2;  

	status = ZwQuerySystemInformation(SystemModuleInformation, &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,(PCSZ)&module[i].ImageName); 

		if (RtlCompareString(&ModuleName1,&ModuleName2,TRUE) == 0) 
		{ 
			DbgPrint("MyEnumKernelModule:%s:%x \n",ModuleName2.Buffer,module[i].Base); 
			*moduleadd  =(ULONG) module[i].Base; //这句和下一句执行了会蓝屏
			*modulesie  = module[i].Size;        //注释起来就没事了
			tlgstst = TRUE; 
			break; 
		} 
	} 
	ExFreePool(pbuftmp); 
	if (tlgstst == FALSE) 
	{ 
		return  FAILED_TO_OBTAIN_FUNCTION_ADDRESSES; 
	} 
	return status; 
} 


BYTE *g_pTesSafeAddress = NULL; 
ULONG g_TesSafeSize = 0; 
MyEnumKernelModule("\\??\\C:\\WINDOWS\\system32\\TesSafe.sys", (ULONG*)g_pTesSafeAddress, &g_TesSafeSize); 


以上代码执行后会蓝屏

若果把                         *moduleadd  =(ULONG) module[i].Base;
                        *modulesie  = module[i].Size;
这两句注释起来就没事了 为什么呢 指针用错了吗
2011-7-27 20:36
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好吧

表示无奈

这里问完csdn问 还没解决
2011-7-27 20:54
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
7
指针没有空间就赋值

还有把那个自定结构体给你:

typedef struct _tagSysModuleList {
    ULONG ulCount;
    SYSTEM_MODULE_INFORMATION smi[1];
} SYSMODULELIST, *PSYSMODULELIST;
2011-7-27 21:30
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=RootSuLe;984946]指针没有空间就赋值

还有把那个自定结构体给你:

typedef struct _tagSysModuleList {
    ULONG ulCount;
    SYSTEM_MODULE_INFORMATION smi[1];
} SYSMODULELIST, *PSYSMODULEL...[/QUOTE]

指针没有空间  这句是什么意思

还要什么空间啊  可否解释下
2011-7-27 21:54
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=RootSuLe;984946]指针没有空间就赋值

还有把那个自定结构体给你:

typedef struct _tagSysModuleList {
    ULONG ulCount;
    SYSTEM_MODULE_INFORMATION smi[1];
} SYSMODULELIST, *PSYSMODULEL...[/QUOTE]

哦 我明白了

要不我在最后那段代码加上 BYTE ByData;
再用指针指针指向ByData 再传递 这样?
2011-7-27 21:56
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=RootSuLe;984946]指针没有空间就赋值

还有把那个自定结构体给你:

typedef struct _tagSysModuleList {
    ULONG ulCount;
    SYSTEM_MODULE_INFORMATION smi[1];
} SYSMODULELIST, *PSYSMODULEL...[/QUOTE]

或者应该这样也可吧

*modulesie  = module[i].Size;        //注释起来就没事了

change

modulesie  =&module[i].Size;        //注释起来就没事了

这样也可吧
2011-7-27 22:00
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=哇咔咔zs;984954]或者应该这样也可吧

*modulesie  = module[i].Size;        //注释起来就没事了

change

modulesie  =&module[i].Size;        //注释起来就没事了

这样也可吧[/QUOTE]

你很有意思
2011-7-27 22:02
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
啊 亲身试验 给蓝屏了
2011-7-27 22:10
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
哦 我搞错了  应该是第一个才对

呵呵 多谢了 吃点东西再回来弄
2011-7-27 22:12
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
[QUOTE=RootSuLe;984946]指针没有空间就赋值

还有把那个自定结构体给你:

typedef struct _tagSysModuleList {
    ULONG ulCount;
    SYSTEM_MODULE_INFORMATION smi[1];
} SYSMODULELIST, *PSYSMODULEL...[/QUOTE]

晕 它到底是弄错了取地址是ULONG还是他本意就是想写BYTE啊

既然他有能力写出这样的代码 照我想应该会看出这样的错误啊 但是它就写个BYTE 弄的我不知道他是真错还是这是他本意

RestartCheckFunction1HookPoint = pTesSafeAddress + 0x5f72;

他要是这样操作 那就是要地址啊 要地址应该是ULONG才对啊 但是他写BYTE

http://www.ghoffice.com/bbs/read-htm-tid-91059.html
2011-7-27 23:53
0
游客
登录 | 注册 方可回帖
返回
//