首页
社区
课程
招聘
[旧帖] ReadProcessMemory读取失败 0.00雪花
发表于: 2009-12-4 11:22 15280

[旧帖] ReadProcessMemory读取失败 0.00雪花

2009-12-4 11:22
15280
扫雷的雷区数据是从0x1005340开始的
为什么我从那个地址读取数据总是失败呢?
char addr[1];
ReadProcessMemory(hProcess,(LPCVOID)0x1005340,&addr,sizeof(addr),0);

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (27)
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
hProcess 这个你传递什么值 是否正确
2009-12-4 11:38
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
......
2009-12-4 11:53
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
扫雷的进程句柄
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
HANDLE Getpid();
void ReadDataFromProcess(HANDLE hProcess);
main(){
       HANDLE hProcess;
       hProcess=Getpid();
       ReadDataFromProcess(hProcess);
       system("pause");
       }
HANDLE Getpid(){
     DWORD pid;
     HWND hwnd=FindWindow(NULL,"扫雷");     //获取扫雷窗口句柄  
     GetWindowThreadProcessId(hwnd,&pid);                       //获取扫雷进程ID
     HANDLE handleid=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);        //获取扫雷进程句柄
     if(handleid) printf("got it!\n");
     return handleid;
     }
void ReadDataFromProcess(HANDLE hProcess){
     char addr[1];
     if(ReadProcessMemory(hProcess,(LPCVOID)0x1005340,&addr,sizeof(addr),0)) printf("读取成功\n");
     else printf("读取失败\n");
     }
     
2009-12-4 11:56
0
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
用getlasterro找出错的原因~
2009-12-4 11:56
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
代码本身有问题吗?
2009-12-4 13:13
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
if(ReadProcessMemory(hProcess,(LPCVOID)0x1005340,&addr,sizeof(addr),0)) printf("读取成功\n");

刚查看了下
  BOOL ReadProcessMemory(
  HANDLE hProcess,
  PVOID pvAddressRemote,
  PVOID pvBufferLocal,
  DWORD dwSize,
  PDWORD pdwNumBytesRead)
楼主注意观察第5个参数。
你用 0 意思是让系统把读取的数据个数(这里是1)赋值到 内存地址为0的地方
2009-12-4 15:12
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
定义一个局部变量

nbWritten    DD   0

后面调用
if(ReadProcessMemory(hProcess,(LPCVOID)0x1005340,&addr,sizeof(addr),&nbWritten )) printf("读取成功\n");
你尝试下。
2009-12-4 15:14
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还是不可以...
2009-12-4 15:32
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
那就不清楚了。
另:
                char addr[5];
                int  i;
                i= sizeof(addr[5]);
结果i=1  所以楼主sizeof(addr)这个最好改正下。 我第一次见这样用,以前都是sizeof(byte/word/dword/Uint64)

if(ReadProcessMemory(hProcess,(LPCVOID)0x1005340,&addr,sizeof(addr),&nbWritten )) printf("读取成功\n");...

红色标记没用。你确定每次加载都加载到0x1005340? 对这个不太懂。说错勿怪。
2009-12-4 15:43
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=怀特迈恩;721952]那就不清楚了。
另:
                char addr[5];
                int  i;
                i= sizeof(addr[5]);
结果i=1  所以楼主sizeof(addr)这个最好改正下。 我第一次见这样用,以前都是sizeof(byte/word/dword/Uint64)

if(Read...[/QUOTE]
晚上我再试试看 谢谢您 我是菜鸟 还请您多指教
2009-12-4 16:00
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
“扫雷”的标题在OllyDbg中看到的是 6B 62 F7 91,貌似是乱码.........
2009-12-4 16:27
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
先DUBUG提权

        HANDLE hToken;
        BOOL fOk=FALSE;
        if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
        {
                TOKEN_PRIVILEGES tp;
                tp.PrivilegeCount=1;
                if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid))
                        printf("Can't lookup privilege value.\n");
                tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
                if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL))
                        printf("Can't adjust privilege value.\n");
                fOk=(GetLastError()==ERROR_SUCCESS);
                CloseHandle(hToken);
        }
2009-12-4 17:57
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
因为OpenProcess 要先提权
2009-12-4 17:58
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
13楼很详细,学习了
2009-12-4 18:06
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
16
这个例子貌似并不需要提权
本来想拷贝楼主的代码编译调试,无奈楼主你的代码实在看不懂
下面是我的,测试成功

代码一复制到论坛就乱了,附件里面有源文件
XP sp2&VC++6.0
上传的附件:
2009-12-4 19:48
0
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
LZ你的代码,没有问题呀。我可以直接读取成功!!!
2009-12-4 20:03
0
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
LZ你的代码,没有问题呀。我可以直接读取成功!!!
2009-12-4 20:10
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
另:
char addr[5];
int i;
i= sizeof(addr[5]);
结果i=1

addr[5]是一个字节,i不就是1吗,我是要获得整个长度啊
先DUBUG提权

提权以后还是读不出来
这是我的提权代码
HANDLE Getpid(){
     DWORD pid;
     HWND hwnd=FindWindow(NULL,"扫雷");     //获取扫雷窗口句柄
     HANDLE hToken;                         //访问令牌指针 
     TOKEN_PRIVILEGES Privileges;
     LUID luid; 
     Privileges.PrivilegeCount=1; 
     OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);    //返回访问令牌指针 
     LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);                //获取LUID值 
     Privileges.Privileges[0].Luid=luid;
     Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
     if(AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL)); //修改访问令牌  
     GetWindowThreadProcessId(hwnd,&pid);                       //获取扫雷进程ID
     HANDLE handleid=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);        //获取扫雷进程句柄
     if(handleid) printf("got it!\n");
     CloseHandle(hToken);
     return handleid;
     }
2009-12-4 23:03
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
介似怎么回事 我的是win7
2009-12-4 23:04
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
[QUOTE=CamelLu;722062]这个例子貌似并不需要提权
本来想拷贝楼主的代码编译调试,无奈楼主你的代码实在看不懂
下面是我的,测试成功

代码一复制到论坛就乱了,附件里面有源文件
XP sp2&VC++6.0[/QUOTE]
您的程序在我这也是读不出来

http://bbs.pediy.com/attachment.php?attachmentid=35499&stc=1&d=1259939716
上传的附件:
2009-12-4 23:14
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
22
win7还没玩过
你会调试吗?调试一下不就知道为什么出错了,我晕
2009-12-5 10:16
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我用getlasterror看看吧 win7里不至于把扫雷还重写吧
2009-12-5 11:37
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
引用:
另:
char addr[5];
int i;
i= sizeof(addr[5]);
结果i=1
addr[5]是一个字节,i不就是1吗,我是要获得整个长度啊

LZ,不知道你什么意思。难道我错了,请买本C++程序设计看下 数组定义 那一章。

我的意思就是你直接 i=5; 没必要 i= sizeof(addr[5]);
2009-12-5 16:30
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我用getlasterror查看了下 错误代码是299 代表"仅完成部分的 ReadProcessMemoty 或 WriteProcessMemory 请求"
这个该怎么解决?
2009-12-6 00:20
0
游客
登录 | 注册 方可回帖
返回
//