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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2012, 12:30   #1
YCA4
Новичок
Джуниор
 
Регистрация: 18.02.2012
Сообщений: 3
Восклицание Delphi XE2 работа с памятью процесса

В общем, нужно получить базовый адрес модуля
делаю так:
PHP код:
BaseAddress:=GetModuleBase(WorkPID,'Module.dll')+$0077CDF8
BaseAddress, WorkPID: Cardinal;

WorkPID - присваивается после того как найдется PID. Для того чтобы потом не было проблем если запущено не одно окно данного приложения.

Вот сама процедура поиска:
PHP код:
{Ищем адрес модуля}
Function 
TBOT.GetModuleBase(WorkPIDCardinalmoduleNamePChar): dword;
var
   
snapshotTHandle;
   
modules:TModuleEntry32;
begin
  result 
:= 0;
  
snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULEWorkPID);
  
modules.dwSize := sizeof(TModuleEntry32);
  if 
Module32First(snapshotmodulesthen
    
While Module32Next(snapshotmodules) do
    if (
StrComp(moduleNamemodules.szModule)=0then
      begin
       CloseHandle
(snapshot);
       
result := dword(modules.modBaseAddr);
       
ShowMessage(inttostr(result));
       exit;
      
end;
   
CloseHandle(snapshot);
end
Результат на удивление не 0. Результатом выдает смещение $0077CDF8, только не в HEX. 7851512. НО, там есть ShowMessage, он не вылетает, т.е. до него даже не доходит.

Раньше, в XE работала отлично. Может ли это быть связанно с тем, что WorkPID уже намертво заданно значение. А раньше он искался перед поиском заного.

Т.е. не намертво задан. При запуске программы идет поиск всех окон, из списка выбирается нужный, а после выбора уже присвоение. Получается ID верный, но раньше я его из буфера передавал. Хотя попробовав передать из буфера как раньше, результат не поменялся.

Также для получения значени из адреса использовал:
PHP код:
 h:=OpenProcess(PROCESS_ALL_ACCESS,False,WorkPID);   {получаем доступ к процессу}
      
ReadProcessMemory(hPointer(BaseAddress), @buf4outbytes);  
closehandle(h); 
теперь при компиляции ругается что типы не сходятся. Почитал в гугле, что последние две переменные теперь типа SIZE_T. Пришлось убрать "4" и сделать отдельной переменной. Но результат 0 из-за BaseAddress, я считаю, хотя может там тоже что-то новое появилось?.

Я смотрю XE и XE2 сильно отличаются, создав проект в одном, в другой версии уже не открыть..

Последний раз редактировалось YCA4; 18.02.2012 в 12:33.
YCA4 вне форума Ответить с цитированием
Старый 18.02.2012, 13:33   #2
YCA4
Новичок
Джуниор
 
Регистрация: 18.02.2012
Сообщений: 3
По умолчанию

Ошибку нашел там, где вообще не ожидал её найти.
Я в процессе выбора нужного окна получаю и записываю его хэндл, для дальнейшего использования. Дак я хэндл в WorkPID записывал. Вот и не работало!
YCA4 вне форума Ответить с цитированием
Старый 18.02.2012, 19:26   #3
YCA4
Новичок
Джуниор
 
Регистрация: 18.02.2012
Сообщений: 3
По умолчанию

Объясните пожалуйста, те кто имел дело с XE2. Как там прочитать адрес из памяти?
Как не пробую, всегда получаю результат 0.
Хотя уже последние два параметра сделал SIZE_T.

Код:
 h:=OpenProcess(PROCESS_ALL_ACCESS,False,WorkPID);   {получаем доступ к процессу}
inbytes:=4;
      ReadProcessMemory(h, Pointer(BaseAddress), @buf, inbytes, outbytes);  
closehandle(h);
Раньше делал так:
Код:
 h:=OpenProcess(PROCESS_ALL_ACCESS,False,WorkPID);   {получаем доступ к процессу}
      ReadProcessMemory(h, Pointer(BaseAddress), @buf, 4, outbytes);  
closehandle(h);
UPD
Дело не в ReadProcessMemory а в OpenProcess. Он в H пишет 0, так что дело даже до прочтения памяти и не доходит. Где ошибка, вроде функция описана правильно.

MSDN:
Код:
HANDLE WINAPI OpenProcess(
  __in  DWORD dwDesiredAccess,
  __in  BOOL bInheritHandle,
  __in  DWORD dwProcessId
);
У меня:
Код:
h:=OpenProcess(
            PROCESS_ALL_ACCESS,
            False,
Cardinal WorkPID); также ставил DWORD, результат не меняется
H: HWND;

GetLastError пишет "Параметр задан неверно", но какой? Пойду пороюсь дальше.

ВСЕ! Проблему нашел. У меня в паблике еще был описан WorkPID, но не DWORD а кардинал. Обоим (в варе и паблике) поставил DWORD и заработало. Всем спасибо тема себя исчерпало все получилось, значение поймал.

Последний раз редактировалось YCA4; 18.02.2012 в 23:21.
YCA4 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с фреймами в Delphi XE2 kholoshchak Общие вопросы Delphi 2 16.02.2012 13:36
Embarcadero Delphi XE2 Partner DVD (Зборник компонентов для XE2) volod3000 Софт 2 01.11.2011 02:26
Проект (работа с БД) на Delphi XE2 на Windows 7 64. Будет ли эта программа корректно работать на Windows 7 32 ? Dux Общие вопросы Delphi 10 04.10.2011 19:33
Работа с памятью процесса JRcoker Win Api 10 18.07.2009 22:22
Работа с памятью запущенного процесса DeniCPP Общие вопросы C/C++ 2 09.04.2009 12:38