Поиск строки в памяти запущенного процесса и её изменение
27.07.2009, 01:29. Показов 5503. Ответов 1
Сообщение от polivets
т.е. это не отображается в окне программы? Задумайся у тебя есть переменная и она где-то в памяти, каждый раз когда ты ее изменяешь ты отображаешь эти изменения где-нибудь в Label или Edit. Допустим кто-то изменил твою переменную независимо от тебя, чтобы изменения отобразились в окне программы, нужно вызвать код, отображения данной переменной на контрол формы.
Ты уваерен, что это ненужные нули? Вдруг, они предназначены для padding'a какого-нибудь буфера и т.д.
Подскажи пожалуйста, что я делаю не так. Вот мой код.
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| #include "windows.h"
#include <iostream>
using namespace std;
int main()
{
int i;
BOOL tr;
const int Addr_Str1=0xB8004002;
DWORD pId, lpBuf;
HANDLE ProcHandle;
char *str=(char*)0xB8004002;
//char st[12];
str="Hello World";
cout<<"Enter PID process"<<endl;
cin>>i;
char sts[12];
char *st=sts;
if(i>0)
{
pId=i;
//ProcHandle=OpenProcess(PROCESS_ALL_ACCESS, false, pId);
ProcHandle=OpenProcess(PROCESS_VM_READ, false, pId);
if(ProcHandle==NULL)
{
cout<<"\aProcess cannot be read"<<endl;
return -10;
}
tr=ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), (LPVOID)st, 12, NULL);
//tr=ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), &lpBuf, sizeof(DWORD), NULL);
}
//sprintf(st, "%d", lpBuf);
cout<<st<<endl;
return 0;
} |
|
Я пытаюсь сосчитать строку из памяти("Hello World").
PID-id процесса нахожу с помощью утилиты Process Explorer
В результате в консоли выводит что-то вроде этого:
"||||||||||||||||4xA"
Что я делаю не так?
В чем проблема, уже много времени пытаюсь разобраться. Помогите
Добавлено через 22 часа 31 минуту 19 секунд
Сообщение от DjDram
Не могу решить задачку нужно считать строку из памяти процесса запущенной программы.
RVA строки $0036D0C8 нужен ведь RVA не VA
Процедура выглядит следующим образом, для проверки значений заносил их в edit
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| procedure TForm1.Button1Click(Sender: TObject);
var
hProc, PID, numberRead : DWORD;
hWnd : THandle;// Хэндл окна чата
IpBuf : string; // буфер куда поместиться наше значение
ipBase: ^dword; // точка входа в памяти
begin
hWnd:=findwindow('TfChatClient',nil); /// получаем хэндл окна программы
Edit1.Text:=inttostr(hWnd); // заносим в edit Handle
GetWindowThreadProcessId(hWnd, @PID); //получаем pid зная хэндл окошка интересующей нас программы
Edit2.Text:=inttostr(PID); // заносим в edit ID
hProc:=OpenProcess(PROCESS_VM_READ, False, PID); // подключаемся к процессу зная его ID
try
if hProc <> 0 then // условие проверки подключения к процессу
begin
Edit3.Text:=inttostr(hProc); // заносим в edit Process
ipbuf:=' '; // очищаем буфер
SetLength(ipbuf, 4);// устанавливаем длинну буфера
ipBase:=ptr($0036D0C8); // RVA слова в памяти
ReadProcessMemory(hProc, ipBase, Addr(ipbuf), 4, numberRead); // чтение из памяти строки
Edit4.Text:=PCHAR(ipbuf); // заносим в edit Buffer
end;
finally
CloseHandle(hProc); // отсоединяемся от процесса
end;
end; |
|
В результате получилось следующее хэндл, pid process считываються идеально, а вот переменная ipbuf куда должно занестись значение выдыдаёт какуето ерунду что не так где ошибки?
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
DWORD pID, hProc, numberRead;
HWND hWnd; // Хэндл окна
String ^IpBuf; // буфер куда поместиться наше значение
DWORD *ipBase; // точка входа в памяти
hWnd=FindWindow("TfChatClient", NULL); // получаем хэндл окна программы
txtBox1->Text=(hWnd.ToString()); // заносим в txtBox1 Handle
GetWindowThreadProcessId(hWnd, *pID); //получаем pid зная хэндл окошка
txtBox2->Text=(pID.ToString()); // заносим в txtBox2 PID
hProc=OpenProcess(PROCESS_VM_READ, false, pID); // подключаемся к процессу зная его ID
try
{
if(hProc!=0)
{
txtBox3->Text=(hProc.ToString());
IpBuf=""; //очищаем буфер
IpBuf.Length=4; // устанавливаем длину буфера
const int ipBase=0x0036D0C8; // RVA слова в памяти
ReadProcessMemory(hProc, ipBase, Addr(IpBuf), 4, numberRead); // чтение из памяти строки
txtBox4->Text=IpBuf; // заносим в txtBox4 Buffer
}
}
catch(...)
{
CloseHandle(hProc);
}
CloseHandle(hProc);
} |
|
C++ | 1
| const int ipBase=0x0036D0C8; // RVA слова в памяти |
|
Правильно ли я написал RVA на C++?
И пожалуйста расшифруйте аббревиатуру RVA
1
|