Форум: "Система";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизВопрос для шарящих (работа с адресным пространством) Найти похожие ветки
← →
alex134 (2002-11-03 01:29) [0]Прошу помочь новичку!
Такая задача:
Запущена некая программа, она работает с тремя переменными a, b и c. Я знаю, что a=1 b=2 c=3.
Так вот, мне надо определить какая часть адресного пространства выделена под эту прогу
(сегмент данных кажется называется). А там уже последовательно перебирая весь этот сегмент
найти адреса этих переменных по их значениям. Вот так ! Хоть чуток разъясните ситуацию :(
← →
Slatazan (2002-11-03 05:25) [1]У каждой переменки есть свое вхождение через @
@a @b @c
И зачем тебе иначе ?
Ломатель какой-нибудь делаеш - иначе не-знаю для чего... :)
← →
Юрий Зотов (2002-11-03 10:51) [2]> какая часть адресного пространства выделена под эту прогу
Все 100%. В Win32 у каждой "проги" СВОЕ собственное адресное пространство.
> (сегмент данных кажется называется).
В Win32 сплошная модель памяти. Все сегментные регистры содержат одно и то же значение. То есть, сегментации фактически нет, а данные могут располагаться по любому адресу. Иными словами, перебирать придется все 4 Гб за вычетом дипазона недоступных программе адресов (зависит от версии системы).
> найти адреса этих переменных по их значениям.
Для этого еще нужно знать длину каждой переменной и способ ее выравнивания. Но даже если это известно, то при переборе Вы обнаружите ОГРОМНОЕ количество чисел, равных 1, 2 и 3. Причем будет даже неизвестно, что это - данные, или к код.
И все это - даже не говоря о динамической памяти, которая в программе может перераспределяться. То есть, адреса могут еще и плавать.
← →
alex134 (2002-11-03 16:56) [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;
Не работает :(
← →
alex134 (2002-11-03 16:57) [4]P.S. : хочу прочитать 4 байта по адресу $400000
← →
Snap (2002-11-03 23:08) [5]f:pointer
f:=ptr($400000);
f^:=4 байта
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c