Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
#1

Поиск строки в памяти запущенного процесса и её изменение - C++

27.07.2009, 01:29. Просмотров 2884. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2009, 01:29     Поиск строки в памяти запущенного процесса и её изменение
Посмотрите здесь:
C++ Офсеты и память запущенного процесса
Как узнать имя запущенного процесса C++
Чтение строки из памяти стороннего процесса C++
C++ Измененить значение в памяти процесса
Доступ к памяти другого процесса C++
C++ Освобождает ли память процесса менеджер памяти Windows?
Как найти не только числовую информацию в памяти процесса ? C++
Чтение из памяти стороннего процесса и запись в файл массива типа doouble C++
Поиск процесса по имени C++
Пример функции для изменения региона защиты памяти процесса с Read Only на Write Copy C++
C++ Изменение битов в оперативной памяти
Изменение динамической памяти, ошибка программы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
27.07.2009, 18:22     Поиск строки в памяти запущенного процесса и её изменение #2
rva - relative virtual addres
Для того, чтоб считать строку из другого процесса, тебе именно таки нужен va.

Не знаю я как ты получил rva, но если он верен, то далее все идет по такой схеме:

Читаеш заголовок ехе, узнаеш какой секции пренадлежит твой rva, нормируеш свой rva на секцию и имаджбазе, получаеш va, читаеш строку.

Вот дока http://wasm.ru/baixado.php?mode=doc&id=6, почитай файл pefmt003.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru