hur.cn - 华软网

 热门搜索

问一下:ReadProcessMemory的问题.....

  作者:未知    来源:网络    更新时间:2011/10/5
int szPassBuff;
ReadProcessMemory(hProcess,(LPCVOID)0xB7026B0,&szPassBuff,4,0);
我用cout<<"szPassBuff"<<szPassBuff<<"\t"<<"&szPassBuff"<<&szPassBuff<<endl;
地址是没有错误的,对应的10进制是200,可是为什么输出的是0和00477740呢?
我怀疑是地址错误,就换了一个地址,地址也是对的,对应的是2500,可是为什么输出的还是0和00477740呢?

小弟不懂,请大神们教教啊...

---华软 网友回答---
初步怀疑进程句柄 hProcess 有误 
你检查下吧
---华软网友回复---
static HANDLE hProcess;
hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,Pid);

你看看对不对?
---华软网友回复---
真的哦,hProcess有误了,用了判断才知道的,可是错在哪里?
---华软网友回复---
OpenProcess后查看GetLastError()的值
---华软网友回复---
PROCESS_ALL_ACCESS, 需要先用 SeDebugPrivilege 提权。

msdn:
To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.
---华软网友回复---
这样输出可以吗?
cout<<GetLastError()<<endl;
不知道对不对,它只给一个6
---华软网友回复---
应该是要先提权
6是句柄无效
---华软网友回复---
对,你的pid是从任务管理器中获得的吧?
我进行了如下测试:
我从进程管理器中获得程序A的pid,程序A向地址xxxxxxxx写入内容,并用程序B对程序A地址xxxxxxxx进行读取
成功读取。
我的代码如下
C++">
         CWnd *ieWnd;
         HANDLE  hProcess = NULL;
DWORD dwprocessId;
DWORD dwRdBytes;
TCHAR szText[128];

         ieWnd = FindWindow(NULL,_T("我是谁")); 
   ::GetWindowThreadProcessId(ieWnd->GetSafeHwnd(),&dwprocessId);
hProcess = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ,FALSE,dwprocessId); 

ReadProcessMemory(hProcess,(LPVOID)0x004222e0,szText,128,&dwRdBytes);

---华软网友回复---
说了怎么多给你们看看我想做什么吧。
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
static HWND Hwnd;
static DWORD Pid;
static HANDLE hProcess;
static int szPassBuff;
Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
if(Hwnd)
{
cout<<"窗口寻找成功"<<endl;
}
else
{
cout<<"窗口寻找失败"<<endl;
}
Pid=GetWindowThreadProcessId(Hwnd,&Pid);
if(Pid)
{
cout<<"PID寻找成功."<<endl;
}
else
{
cout<<"PID寻找失败."<<endl;
}
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
if(hProcess)
{
cout<<"ID寻找成功."<<endl;
}
else
{
cout<<"ID寻找失败."<<endl;
}
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
cout<<GetLastError()<<endl;
cout<<"数据:"<<&szPassBuff<<endl;
return 0;
}

前面窗口和PID的成功的,后面ID就是失败了...你们帮我改改,可以吗?
---华软网友回复---
Pid=GetWindowThreadProcessId(Hwnd,&Pid);换成
GetWindowThreadProcessId(Hwnd,&Pid);
PROCESS_ALL_ACCESS换成PROCESS_VM_READ|PROCESS_VM_OPERATION
---华软网友回复---
哦,谢谢你了,成功了

数据也对了,真是谢谢你了...
---华软网友回复---
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
static HWND Hwnd;
static DWORD Pid;
static HANDLE hProcess;
static int szPassBuff;
Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
if(Hwnd)
{
cout<<"窗口寻找成功"<<endl;
}
else
{
cout<<"窗口寻找失败"<<endl;
}
GetWindowThreadProcessId(Hwnd,&Pid);
if(Pid)
{
cout<<"PID寻找成功."<<endl;
}
else
{
cout<<"PID寻找失败."<<endl;
}
hProcess=OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION,FALSE,Pid);
if(hProcess)
{
cout<<"ID寻找成功."<<endl;
}
else
{
cout<<"ID寻找失败."<<endl;
}
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
cout<<"数据:"<<szPassBuff<<endl;
return 0;
}

还有一个问题,就是我要关闭进程,这个怎么关闭?
---华软网友回复---
PROCESS_VM_READ|PROCESS_VM_OPERATION|PROCESS_TERMINATE
TerminateProcess(hProcess,0);
---华软网友回复---
结束进程是上面的,关闭句柄用CloseHandle(hProcess)
---华软网友回复---
我可以不可以这样输入数据?
int Num;
cin>>Num;
WriteProcessMemory(hProcess,(LPVOID)0xB92CAC0,&Num,4,0);

---华软网友回复---
可以/
---华软网友回复---
GetWindowThreadProcessId的返回值为线程ID,该函数的第二个参数返回的才是进程ID
另外对进程使用WriteProcessMemory函数,OpenProcess打开进程时需要增加PROCESS_VM_WRITE标志

即 OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,Pid)
---华软网友回复---
好像不行,你看看,错在哪里?
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
static HWND Hwnd;
static DWORD Pid;
static HANDLE hProcess;
static int szPassBuff;
int Num;
Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
if(Hwnd)
{
cout<<"窗口寻找成功"<<endl;
}
else
{
cout<<"窗口寻找失败"<<endl;
}
GetWindowThreadProcessId(Hwnd,&Pid);
if(Pid)
{
cout<<"PID寻找成功."<<endl;
}
else
{
cout<<"PID寻找失败."<<endl;
}
hProcess=OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION,FALSE,Pid);
if(hProcess)
{
cout<<"ID寻找成功."<<endl;
}
else
{
cout<<"ID寻找失败."<<endl;
}
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
cout<<"数据:"<<szPassBuff<<endl;
cout<<"输入要修改的数据:";
cin>>Num;
WriteProcessMemory(hProcess,(LPVOID)0xB92CAC0,&Num,4,0);
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
cout<<"数据:"<<szPassBuff<<endl;
TerminateProcess(hProcess,0);//结束进程
CloseHandle(hProcess);//关闭句柄
return 0;
}
目前数据是2100(10进制)
我输入数据1000
但是输出还是2100

为什么?
---华软网友回复---
哦,谢谢了,又学到知识了

睡觉了,谢谢各位大哥们对小弟的关照....
---华软网友回复---
OpenProcess打开进程时需要增加PROCESS_VM_WRITE标志

即 OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,Pid)
---华软网友回复---
等等,还有一个问题。问完了在睡!!!

static HWND Hwnd;
static DWORD Pid;
static HANDLE hProcess;
static int szPassBuff;
HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_CREATE:
SetTimer(hwnd,ID_Timer,200,NULL);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
if(Hwnd)
{
TextOut(hdc,0,0,TEXT("窗口寻找成功."),strlen("窗口寻找成功."));
}
else
{
TextOut(hdc,0,0,TEXT("窗口寻找失败."),strlen("窗口寻找失败."));
}
GetWindowThreadProcessId(Hwnd,&Pid);
if(Pid)
{
TextOut(hdc,0,18,TEXT("PID寻找成功."),strlen("PID寻找成功."));
}
else
{
TextOut(hdc,0,18,TEXT("PID寻找失败."),strlen("PID寻找失败."));
}
hProcess=OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, FALSE,Pid);
if(hProcess)
{
cout<<"ID寻找成功."<<endl;
}
else
{
cout<<"ID寻找失败."<<endl;
}
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

这是在win32建立的工程。
我只给窗口过程给大家看就行了
我想问问:
第一:我把数据显示在客户区里面?用TextOut还是什么函数?如果用TextOut怎么做?

第二:还有我想用SetTimer来控制检测时间。可是我不知道怎么做。
如果把函数放在PAINT消息中,一旦是退出游戏的话还是显示连接成功(表示没有和计时器关联)
我应该怎么做?
---华软网友回复---
SetTimer后处理WM_TIMER消息
---华软网友回复---
那WM_TIMER消息需要放什么代码
我之前想过,但是不知道带代码
---华软网友回复---
放你要定时做的事
---华软网友回复---
恩,得了,还有一个问题:
首先,我先打开程序,3个提示都是显示失败的,然后我打开植物大战僵尸,3个提示都显示成功
但是我不关闭程序,先关闭了植物大战僵尸,为什么PID寻找成功?其他的2个都是失败的,这是为什么呢?
---华软网友回复---
static HWND Hwnd,Hwnd1;
static DWORD Pid;
static HANDLE hProcess;
static int szPassBuff;
HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_CREATE:
SetTimer(hwnd,ID_Timer,200,NULL);
break;
case WM_TIMER:
hdc=GetDC(hwnd);
Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
if(Hwnd)
{
TextOut(hdc,0,0,TEXT("窗口寻找成功."),strlen("窗口寻找成功."));
}
else
{
TextOut(hdc,0,0,TEXT("窗口寻找失败."),strlen("窗口寻找失败."));
}
GetWindowThreadProcessId(Hwnd,&Pid);
if(Pid)
{
TextOut(hdc,0,18,TEXT("PID寻找成功."),strlen("PID寻找成功."));
}
else
{
TextOut(hdc,0,18,TEXT("PID寻找失败."),strlen("PID寻找失败."));
}
hProcess=OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_TERMINATE,FALSE,Pid);
if(hProcess)
{
TextOut(hdc,0,36,TEXT("ID寻找成功."),strlen("ID寻找成功."));
}
else
{
TextOut(hdc,0,36,TEXT("ID寻找失败."),strlen("ID寻找失败."));
}
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
ReleaseDC(hwnd,hdc);
// TerminateProcess(hProcess,0);//结束进程
CloseHandle(hProcess);//关闭句柄
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

问一下:为什么不能这样TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
显示数据?
我想显示我应该怎么做啊?
---华软网友回复---

szPassBuff是什么
---华软网友回复---
  class="deleted_message"> 该回复于2011-10-09 09:15:03被版主删除
---华软网友回复---
szPassBuff是int类型
ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
什么不能这样TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
显示数据?
我想显示我应该怎么做啊?
---华软网友回复---
szPassBuff的意义是什么
如果是那个进程的一个地址,你需要ReadProcessMemory读到当前进程才能显示
---华软网友回复---
那怎么做?
---华软网友回复---
你先说szPassBuff的意义是什么
---华软网友回复---
szPassBuff是存放读取数据缓冲区啊...
---华软网友回复---
szPassBuff的值代表什么,你要显示什么
---华软网友回复---
代表一个10进制的数值(如1000),10进制(1000)显示在客户区里(客户区什么位置都行)
---华软网友回复---
wchar_t a[32];
_itow(szPassBuff,a,10);
TextOutW(hdc,0,54,a,wcslen(a));
---华软网友回复---
恩,好了,你能解释给我一下吗?小弟不懂啊
---华软网友回复---
因为szPassBuff不是字符串
---华软网友回复---
哦,谢谢了      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。