Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-37153
Ops
2002-12-29 16:52
2003.01.13
Текст в Memo разным цветом


1-37125
smok_er
2003-01-04 10:34
2003.01.13
2 вопроса про TMainMenu


1-37008
Palladin
2002-12-30 20:03
2003.01.13
Классы в длл


14-37335
__Avenger__
2002-12-22 06:41
2003.01.13
Статья


4-37440
Maksss
2002-11-24 17:54
2003.01.13
form2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский