Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
1

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

27.07.2009, 01:29. Показов 5503. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2009, 01:29
Ответы с готовыми решениями:

Поиск запущенного процесса Visual Studio C++
Добрый день форум!)хех Мне нужно что-бы при запуске консольного приложения писалось например что...

Офсеты и память запущенного процесса
Всем привет. Пишу бота для wow, пока что простенького, для рыбалки, и появилась определяющая всего...

Чтение строки из памяти стороннего процесса
Никогда не думал, что будут проблемы с чтением строки из памяти, но они есть :D Пишу так: cout...

Как узнать имя запущенного процесса
Как узнать имя запущенного процесса и записать его имя в строку (LPWSTR)?

1
229 / 67 / 11
Регистрация: 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.
2
27.07.2009, 18:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2009, 18:22
Помогаю со студенческими работами здесь

Поиск строки в памяти запущенного процесса и её изменение
Не могу решить задачку нужно считать строку из памяти процесса запущенной программы. RVA строки ...

Поиск адреса в памяти запущенного процесса
Здравствуйте, всем доброго здравия и времени суток! У меня есть вот такая тема, пишу программу...

Поиск и изменение значения в памяти(Не процесса)
Здравствуйте, я наслышан о том как тут любят кидать фекалиями в тех кто как либо делает незаконное...

Чтение памяти запущенного процесса
Уважаемые, подскажите, как и чем можно воспользоваться для чтения памяти запущенного процесса ? ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru