![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос для шарящих (работа с адресным пространством)
alex134 © (2002-11-03 01:29:00)Прошу помочь новичку!
Такая задача:
Запущена некая программа, она работает с тремя переменными a, b и c. Я знаю, что a=1 b=2 c=3.
Так вот, мне надо определить какая часть адресного пространства выделена под эту прогу
(сегмент данных кажется называется). А там уже последовательно перебирая весь этот сегмент
найти адреса этих переменных по их значениям. Вот так ! Хоть чуток разъясните ситуацию :(
Snap (2002-11-03 23:08:00) [1]f:pointer
f:=ptr($400000);
f^:=4 байта
alex134 (2002-11-03 16:57:00) [2]P.S. : хочу прочитать 4 байта по адресу $400000
alex134 (2002-11-03 16:56:00) [3]Делаю так:
procedure TForm1.Button1Click(Sender: TObject);
var
WindowHandle : HWND;
ProcID, nProcID : DWord;
Buffer : ^DWord;
Addr : ^DWord;
Count : DWORD;
begin
WindowHandle := FindWindow(nil, "AlexProg");
if WindowHandle=0 then ShowMessage("AlexProg не найдена !");
GetWindowThreadProcessID(WindowHandle, ProcID);
nProcID := OpenProcess(PROCESS_VM_READ, False, ProcID);
New(Addr);
New(Buffer);
Addr^ := $400000;
if ReadProcessMemory(nProcID, Addr, Buffer, 4, Count) then
begin
ListBox1.Items.Add("Addr:"+IntToStr(Addr^)+" Buffer: "+IntToStr(Buffer^)+" Count:"+IntToStr(Count));
end
else
ListBox1.Items.Add("Addr:"+IntToStr(Addr^)+" Bad");
end;
Не работает :(
Юрий Зотов (2002-11-03 10:51:00) [4]> какая часть адресного пространства выделена под эту прогу
Все 100%. В Win32 у каждой "проги" СВОЕ собственное адресное пространство.
> (сегмент данных кажется называется).
В Win32 сплошная модель памяти. Все сегментные регистры содержат одно и то же значение. То есть, сегментации фактически нет, а данные могут располагаться по любому адресу. Иными словами, перебирать придется все 4 Гб за вычетом дипазона недоступных программе адресов (зависит от версии системы).
> найти адреса этих переменных по их значениям.
Для этого еще нужно знать длину каждой переменной и способ ее выравнивания. Но даже если это известно, то при переборе Вы обнаружите ОГРОМНОЕ количество чисел, равных 1, 2 и 3. Причем будет даже неизвестно, что это - данные, или к код.
И все это - даже не говоря о динамической памяти, которая в программе может перераспределяться. То есть, адреса могут еще и плавать.
Slatazan (2002-11-03 05:25:00) [5]У каждой переменки есть свое вхождение через @
@a @b @c
И зачем тебе иначе ?
Ломатель какой-нибудь делаеш - иначе не-знаю для чего... :)