Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2013, 10:09   #1
kakawkin
Форумчанин
 
Регистрация: 21.09.2009
Сообщений: 431
По умолчанию Не выходить считать данные из памяти

Собственно для начала пытаюсь считать данные: ник из игры World of Warcraft. По программе Cheat Engine надо считать: WoW.exe+E3CB40

Считываю вот так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  hProc, PID : DWORD;
  hWnd : THandle; // Хэндл окна чата
  numberRead: SIZE_T;
  IpBuf : PWideChar; // буфер куда поместиться наше значение
  len : integer;
  ipBase: ^dword; // точка входа в памяти
  Buf : PChar;
  Write:cardinal;
begin
  hWnd:=findwindow(nil,'World of Warcraft'); /// получаем хэндл окна программы
  Edit1.Text:=inttostr(hWnd); // заносим в edit Handle
  GetWindowThreadProcessId(hWnd, @PID); //получаем pid зная хэндл окошка интересующей нас программы
  Edit2.Text:=inttostr(PID); // заносим в edit ID
  hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID); // подключаемся к процессу зная его ID
  if hProc <> 0 then // условие проверки подключения к процессу
  try
    len   := 200;
    ipBuf := AllocMem(len);
    Edit3.Text:=inttostr(hProc); // заносим в edit Process
    //ipBase:=ptr($00E3CB40); // RVA слова в памяти
    ipBase:=ptr($00E3CB40);
    //ReadProcessMemory(hProc, ipBase, ipBuf, len, numberRead); // чтение из памяти строки
    ReadProcessMemory(hProc, ipBase, ipBuf, len, numberRead);
    Edit4.Text:=string(ipbuf); // заносим в edit Buffer
  finally
    CloseHandle(hProc); // отсоединяемся от процесса
    FreeMem(ipBuf); // освобождаем память
  end;
end;
В итоге в Edit4 выходит: 쫐�ᶪ搘䛲艹鈭ā杋콠䪙⼰㿋ꃗ蠀)

Не подскажите где ошибка данного кода
kakawkin вне форума Ответить с цитированием
Старый 23.06.2013, 10:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
WoW.exe+E3CB40
не то же самое что и $00E3CB40

WoW.exe это базовый адрес модуля(он же хендл модуля в процессе, можно получить через PSAPI или ToolHelp)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2013, 11:27   #3
kakawkin
Форумчанин
 
Регистрация: 21.09.2009
Сообщений: 431
По умолчанию

Так подожди. Ведь я подключаюсь к процессу: hProc:=OpenProcess(PROCESS_ALL_ACCE SS, False, PID);

И считываю адрес $00E3CB40 с процесса: ipBase:=ptr($00E3CB40);
ReadProcessMemory(hProc, ipBase, ipBuf, len, numberRead);
kakawkin вне форума Ответить с цитированием
Старый 23.06.2013, 13:43   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы чем читали?
реальный адрес именно тот что он написал, WoW.exe(обычно база у exe идет 0x400000)+$00E3CB40.
что не ясного то?

через PSAPI или ToolHelp получаете модуль который WoW.exe(или же один раз сами смотрите) и составляете адрес.
патчил как то пользуясь этим приложением, оно пишет так на случай рандомизации исполняемого пространства, когда даже exe релоцируется.

PS: и к чему было в скайп добавлятся?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.06.2013, 07:42   #5
kakawkin
Форумчанин
 
Регистрация: 21.09.2009
Сообщений: 431
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вы чем читали?
реальный адрес именно тот что он написал, WoW.exe(обычно база у exe идет 0x400000)+$00E3CB40.
что не ясного то?

через PSAPI или ToolHelp получаете модуль который WoW.exe(или же один раз сами смотрите) и составляете адрес.
патчил как то пользуясь этим приложением, оно пишет так на случай рандомизации исполняемого пространства, когда даже exe релоцируется.

PS: и к чему было в скайп добавлятся?
Нашел базу - она не $400000 а другая. Вот мой код:
Код:
var   HandleWindow : cardinal;
ipBase: pointer;
hWnd : THandle;
PID, hProc, IpBuf : DWORD;
numberRead: SIZE_T;
buft:array [0..16] of WideChar;
begin
  HandleWindow:=FindWindow(nil,'World of Warcraft');
  GetWindowThreadProcessId(hWnd, @PID);
  hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  ipBase:=ptr($00BD0000);
   ReadProcessMemory(hProc, ipBase, @ipBuf, sizeof(ipBuf), numberRead);
   ReadProcessMemory(hProc, ptr(ipBuf+$00E3CB40), @buft, 10, numberRead);
  CloseHandle(hProc);
  form1.Edit1.Text:=WideCharToString(buft);
end;
$00BD0000 - база
$00E3CB40 - смещение

И возвращает пустую строку. Где ошибка не подскажешь ? А то искал похожие темы по выдёргиванию строки из памяти и результатов ноль
kakawkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как считать данные с файла? doctorvra4 Паскаль, Turbo Pascal, PascalABC.NET 1 22.11.2012 20:29
Считать данные с *.pcap файла grafjoker Фриланс 0 26.02.2012 00:17
Считать значение из памяти чужого процесса EvgenyZ Win Api 2 27.11.2009 09:29
Как считать данные с БД в WebBrowser? tsergey Общие вопросы Delphi 14 13.04.2009 03:56
Считать данные из *.wav Kor Мультимедиа в Delphi 0 05.10.2008 17:25