Главная страница
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.019 c
3-36944
Vick
2002-12-18 10:27
2003.01.13
Проблемы с русскими буквами в ClientDataSet при фильтрации


3-36970
Vladimir
2002-12-16 08:04
2003.01.13
Как поместить DataModule в DLL? И потом с ним работать?


14-37324
ScableR
2002-12-24 02:57
2003.01.13
D6 или D7


3-36958
Ольга
2002-12-16 17:17
2003.01.13
DbChart


1-37101
mao
2003-01-03 15:57
2003.01.13
БД. DBMemo1.DataSource???