Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.13;
Скачать: CL | DM;

Вниз

Вопрос для шарящих (работа с адресным пространством)   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-37309
Igit
2002-12-23 18:11
2003.01.13
Web браузер


14-37363
eLVik
2002-12-23 16:17
2003.01.13
KOL


14-37294
Дмитрий К.К.
2002-12-23 06:14
2003.01.13
Именинники 23 декабря


7-37393
Sego
2002-11-01 10:03
2003.01.13
Как включить клаву и мышку, после отключения?


4-37444
@Ujin
2002-11-25 16:53
2003.01.13
Как получить список экспорта библиотеки?