Форум: "Основная";
Текущий архив: 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