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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Напечатать симметричные слова из строки http://www.cyberforum.ru/cpp-beginners/thread45160.html
Доброго времени суток. Имеется такая задача: "Дана последовательность слов. Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству: слово...
C++ прямоугольная матрица на С В каждой строке прямоугольной матрицы определить среднее арифметическое S ее элементов, после чего расположить в начале строки элементы А(i,j) < S, сохранив их исходную последовательность, а... http://www.cyberforum.ru/cpp-beginners/thread45152.html
C++ Задача с массивом
Здравствуйте!Подскажите пожалуйста в решении такой задачи. Например есть кусок кода: int main(){ int mas; for(int i=0;i<10;i++){ mas=i+1; cout<<mas<<endl;} } Результат...
C++ Снова динамические массивы и функции
int ** A=new int*; for (int i=0;i<(NN+1);i++) A=new int; void ZZ (char *E, int **A, int *N) // преобразует строку вида "1,123,124" в элементы массива ...
C++ решение массива http://www.cyberforum.ru/cpp-beginners/thread45124.html
Не сочтите за сложность помочь с такой задачей: Найти минимальное из чисел, встречающихся в целочисленном массиве X=(x1,x2,...,xn) ровно два раза. Если можно то пришлите алгоритм решения,...
C++ матрицы на с (одна задача) Уважаемые форумчане, подскажите пожалуйста, где у меня ошибка? /* Элементы каждой строки прямоугольной матрицы заменить их дополнениями до максимального элемента этой же строки.... подробнее

Показать сообщение отдельно
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92

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

27.07.2009, 01:29. Просмотров 2957. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru