Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

Помогите с отладчиком   Найти похожие ветки 

 
andsoft   (2004-09-14 18:03) [0]

Доброго всем времени суток.
Пытаюсь написат свой отладчик.
Компилирую приложение при помощи dcc32 с ключом -gd, получаю .exe файл и .map файл(файл с отладочной информацией).
Исходник :

program  test;
uses dialogs;
var a,b,c:string;
begin
 a:="Я люблю ";
 b:="маму!";
 c:=a+b;
 showmessage(c);
end.



В .map файле есть вся необходимая информация
//адреса глобальный переменных
0002:00001C44       a  
0002:00001C48       b
0002:00001C4C       c
//адреса строк исходного кода

Line numbers for test(test.dpr) segment .text

    4 0001:00051074     5 0001:00051092    
    6 0001:000510A1     7 0001:000510B0
    8 0001:000510C6     9 0001:000510E5

Теперь из своего отладчика запускаю процесс и ставлю останов на одной из строчек :

var
 sti: tstartupinfo;
 lpPi: tprocessinformation;
 DE: _Debug_event;
 Cont: _Context;
 s:string;
 i:cardinal;
const
b: array[0..1] of byte = (0, $CC);
....
 CreateProcess(nil, "test.exe", nil, nil, false, DEBUG_PROCESS
   or DEBUG_ONLY_THIS_PROCESS, nil, nil, StI, lpPI);
 readprocessmemory(lppi.hProcess, pointer($000510C6), @b[0],1,i);
 writeprocessmemory(lppi.hProcess, pointer($000510C6),@b[1],1,i);


ожидаю прерывание....

 while GetThreadContext(lppi.hThread, cont) do
 begin

   if not WaitForDebugEvent(de, 0) then
     application.ProcessMessages;

   if de.dwDebugEventCode = EXCEPTION_DEBUG_EVENT then
     if DE.Exception.ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT then
     begin
       GetThreadContext(lppi.hThread, cont);
       cont.EFlags := cont.EFlags or $100;
       setThreadContext(lppi.hThread, cont);
       

        writeprocessmemory(lppi.hProcess, pointer($000510C6), @b[0], 1, i);

        ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadid, DBG_CONTINUE);
        readprocessmemory(lppi.hProcess, pointer($00001C44), @s,sizeof(s),i);//!!!!!!!!!
       

     end
     else if DE.Exception.ExceptionRecord.ExceptionCode = EXCEPTION_SINGLE_STEP
       then
     begin
       cont.ContextFlags := CONTEXT_CONTROL;
       GetThreadContext(lppi.hThread, cont);
       cont.EFlags := cont.EFlags or $100;
       setThreadContext(lppi.hThread, cont);
       ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadid, DBG_CONTINUE);

     end;
     ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadid, DBG_CONTINUE);

 end;


и вот на месте //!!!!!!!! получаю пустую строку всегда...
Что я не так делаю? Может в адресе сегмент надо учитывать?


 
Verg ©   (2004-09-14 18:14) [1]

Ты читаешь всего лишь значение указателя (a) на блок памяти в АП отлаживаемого процесса где и распологается собственно строка.
Тебе же надо вытаскивать и всю строку и служебную структуру ею управляющую из АП того процесса в свой ( в свое АП ).


 
andsoft   (2004-09-14 18:17) [2]

2Verg : Расшифруй плиз. немного...


 
Verg ©   (2004-09-14 18:25) [3]

У тебя два процесса. У них совершенно разные адресные пространства (АП).

Указатели (чем по сути и являются string) указывают (содержат адрес) на блоки памяти в АП того процесса, в котором они используются. Значение этих указателей в АП другого процесса просто бессмыслены.

Если на ул. Строителей д12 кв45 (адрес в внутри дома (АП)) живет тов. Иванов, то это вовсе не значит, что позвонив в кв45 любого другого дома тебе откроет тот же самый тов.Иванов.


 
andsoft   (2004-09-15 11:29) [4]

2Verg :
Просто я думал что readprocessmemory читает данные именно из АП процесса, хендл которого указан как первый параметр...
Если это не так, то подскажи как попасть в АП отлаживаемого процесса или хотябы где про это почитать можно...


 
DiamondShark ©   (2004-09-15 11:45) [5]

Ты из другого процесса прочитал значение указателя: стринг -- это фактически указатель на динамическую память. Теперь тебе надо достать само содержимое, на которое указывает этот указатель.
Или ты всерьёз думал, что прочитав sizeof(string) байт прочитал всю строку?

ЗЫ
Кстати, ты берёшь адреса из мап-файла. А ты уверен, что исполняемый файл загружен по базовому адресу?


 
andsoft   (2004-09-15 13:58) [6]

Товарищи, советы конечно ценные , но размытые.
Предложите конкретные решения...
2DiamondShark : 1.Я читаю из отлаживаемого процесса с заданного адреса 4 байта и кладу их по адресу переменной моего процесса.
Почему там не должно быть содержимое перменной?
2. В мап файле данные из PE структуры исполняемого файла и адреса внутри процесса не должны менятся при новых запусках. Если я не прав , то поправь меня.


 
Digitman ©   (2004-09-15 14:23) [7]


> andsoft   (15.09.04 13:58) [6]


рановато тебе отладчики писать

в map-файле содержатся не "адреса" в ВАП процесса, а смещения адресов в пределах соответствующих секций

поэтому твои обращения вида

pointer($000510C6) //смещение в секции кода
pointer($00001C44) //смещение в секции неиниц.данных

есть попросту бред - по этим адресам нет того что ты ожидаешь


 
andsoft   (2004-09-15 14:47) [8]

2Digitman : Ну наконец - то.
Именно это я и пытался выудить.
Подскажи как правильно надо адресоваться к переменным.


 
Verg ©   (2004-09-15 16:54) [9]

0001C44
            $123                  |
              +-------------------|----------------------+
АП  Процесс1  \|/                  |                      |
+--------------|------------------\|/---------------------|-------------+
|             "Я люблю "           A ( = $123, например)--+             |
+---------------------------------/-------------------------------------+
                                /
                               x---- ReadProcessMemory()
                              /
AП  Процесс2 (Отладчик)      \|/
+-----------------------------|-----------------------------------------+
|             "?????"         S (>-$123)--+                             |
+--------------|-------------/|\----------|-----------------------------+
             /|\             |           |
              +--------------|-----------+
             $123            |
                            @S


 
Verg ©   (2004-09-15 16:56) [10]

Чет-то ничерта не получилось нарисовать.
Попробую еще раз...

                                0001C44
            $123                  |
              +-------------------|----------------------+
АП  Процесс1  \|/                  |                      |
+--------------|------------------\|/---------------------|-------------+
|             "Я люблю "           A ( = $123, например)--+             |
+---------------------------------/-------------------------------------+
                                /
                               x---- ReadProcessMemory()
                              /
AП  Процесс2 (Отладчик)      \|/
+-----------------------------|-----------------------------------------+
|             "?????"         S (>-$123)--+                             |
+--------------|-------------/|\----------|-----------------------------+
             /|\             |           |
              +--------------|-----------+
             $123            |
                            @S


 
Digitman ©   (2004-09-16 08:09) [11]


> andsoft   (15.09.04 14:47) [8]


берешь RVA секции, получаешь ее VA (RVAtoVA), складываешь полученное значение со смещением из MAP - получаешь абсолютный адрес идентификатора в ВАП отлаживаемого процесса



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.152 c
14-1095236857
yanval
2004-09-15 12:27
2004.10.03
вопрос по iis - помогите


1-1095685138
Геннадий
2004-09-20 16:58
2004.10.03
Самовольное завершение работы приложения


1-1095748241
PulSS
2004-09-21 10:30
2004.10.03
Help - помогите заполнить дв. массив по диагоналям, зигзагом


9-1086760482
*John*1987*
2004-06-09 09:54
2004.10.03
Delphix для Delphi6


3-1094191998
Chery
2004-09-03 10:13
2004.10.03
Как узнать в каком столбце сейчас находится курсор?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский