首页
社区
课程
招聘
[求助]ZwReadVirtualMemory 求助
发表于: 2010-10-25 01:48 5617

[求助]ZwReadVirtualMemory 求助

2010-10-25 01:48
5617
#ifdef __cplusplus
extern "C" {
#endif
//////////////////////////////
        typedef struct _ServiceDescriptorTable {
                PVOID ServiceTableBase;
                PVOID ServiceCounterTable;

                unsigned int NumberOfServices;
                PVOID ParamTableBase;}*psstd;

                extern psstd KeServiceDescriptorTable;
/////////////////////////////////////////
       
        typedef NTSTATUS _ZwReadVirtualMemory(
                IN HANDLE ProcessHandle,
                IN PVOID BaseAddress,
                OUT PVOID Buffer,
                IN ULONG BufferLength,
                OUT PULONG ReturnLength OPTIONAL
                );
_ZwReadVirtualMemory* ZwReadVirtualMemory;
//////////////////////////////////////////////////////
       

UINT ProcessID=0;
ULONG ProcessHandle=0;
#ifdef __cplusplus
}; // extern "C"
#endif
/////////openprocess//////////////////////////////
ULONG OpenProcess(ULONG ProcessID)
{
        HANDLE a=(HANDLE)0;
        CLIENT_ID id;
        OBJECT_ATTRIBUTES ObjectAttributes;
        ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
        ObjectAttributes.RootDirectory=0;
        ObjectAttributes.ObjectName = NULL;
        ObjectAttributes.Attributes = 0;
        ObjectAttributes.SecurityDescriptor = NULL;
        ObjectAttributes.SecurityQualityOfService =NULL;

        id.UniqueProcess=(HANDLE)ProcessID;
        id.UniqueThread=(HANDLE)0;
        ZwOpenProcess(&a,1040,&ObjectAttributes,&id);
        return (ULONG)a;
   

}
/////以上是声明部分////////////////////////////////////////////////////////////////////////

////以下是调用部分/////////////////////////////////////////////////////////////////////
ProcessHandle=OpenProcess((ULONG)ProcessID);///这里OpenProcess 调用成功的//
                        KdPrint(("收到大:%d   PId :%d",ProcessHandle,ProcessID));

///////////////读内存///////////////////////////////////////////////////////
                        ULONG a=0;
                        a=(ULONG)KeServiceDescriptorTable->ServiceTableBase;
                        //a=0x7A*4+a;
                        PULONG b=(PULONG)a;
                        a=*(PULONG)((ULONG)b+186*4);
                    ZwReadVirtualMemory=(_ZwReadVirtualMemory*)a;
                /////ZwReadVirtualMemory函数所取的地址是正确的///                                                       ULONG aa=0;
                        ULONG bb=0;
                       
                        ZwReadVirtualMemory((HANDLE)ProcessHandle,(PULONG)0x0007D2AC,&aa,4,&bb);

                       
                        KdPrint(("地址:%X    内容:%d",a,aa));

注:pid自已写的驱动加载代码传进去的,调试过,pid是正确的
   为什么内存读出来的都是0呢,正常是80(加载代码读的)'
   请高手们指点一下(用windbg跟了一下,也确实进入了NtReadVirtualMemory地址,参数也都有传进去了);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 168
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谁会的来帮帮我啊
2010-10-25 11:08
0
雪    币: 168
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
今晚把这些代码改了一下拿到C++里面去调用,没出什么问题,很正常.为什么在驱动里调用就不行呢,走过的路过的帮我说明一下,不懂的是不是驱动根本就不是进程,所以调用不成功
2010-10-25 21:38
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
OBJECT_ATTRIBUTES 这个结构里成员
PUNICODE_STRING ObjectName

这个ObjectName指的是什么? xx.exe吗?
2010-10-26 18:11
0
雪    币: 217
活跃值: (68)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
没看出什么错误,不过可以用另外一种思路实现读内存,ATTACH到目标进程中,直接用指针来读取内存
2010-10-29 11:40
0
游客
登录 | 注册 方可回帖
返回