![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
обращение к отладочным регистрам [D7, WinXP]
tar4 © (2006-08-28 07:15:00)Известно, что прямое обращение к отладочным регистрам из ring-3 вызывает общую ошибку защиты. Ниже приведен кусок кода. Подскажите, почему у меня НЕ ВОЗНИКАЕТ ошибка?
var
STi:TSTARTUPINFO; //информация для запуска
PI:PROCESS_INFORMATION; //информация о процессе
state:Context;
BreakNum:byte;
Begin
BreakNum:=0;
if not CreateProcess(nil,szFileName,nil,nil,false, CREATE_SUSPENDED, nil,nil,STi,PI) then Exit;
State.ContextFlags:= CONTEXT_DEBUG_REGISTERS or CONTEXT_FULL;
GetThreadContext(pi.hThread,State); //читаем контекст потока
State.Dr0:=$401d48; //в dr0 -адрес EP запускаемой программы
State.Dr7:=1 shl BreakNum; //в 0-й бит пишем 1, HwE
State.ContextFlags:= CONTEXT_DEBUG_REGISTERS or CONTEXT_FULL;
SetThreadContext(pi.hThread,State); //пишем изм в контекст
ResumeThread(pi.hThread); //запускаем прогу
CloseHandle(PI.hThread);
closehandle(pi.hprocess);
end;
Сергей М. (2006-08-28 12:19:00) [21]
> tar4 (28.08.06 12:16) [13]
Ты не ответил на вопрос [7]
tar4 (2006-08-28 12:16:00) [22]
> Для изобретателей велосипедов:
Я читал это.
> судя по всему, охота именно DRx. зачем -- не ясно, но охота
> пуще неволи.
В данном случае речь идет только об возможности установки аппаратного
бряка, например, в DR0 без использования флага "DEBUG_PROCESS" в CreateProcess и функции WaitForDebugEvent.
Ketmar (2006-08-28 11:45:00) [23]> [11] Сергей М. © (28.08.06 11:27)
судя по всему, охота именно DRx. зачем -- не ясно, но охота пуще неволи.
Сергей М. (2006-08-28 11:27:00) [24]
> tar4 (28.08.06 11:26) [10]
Для изобретателей велосипедов:
http://www.wasm.ru/article.php?article=1001030
tar4 (2006-08-28 11:26:00) [25]
> для начала ошибка -- это отлаживать подобный код под OllyDbg.
Ты считаешь, что надо пользоваться СофтАйсом, почему? Ведь OllyDbg позволяет ставить и снимать аппаратные бряки. И еще. Ведь установку
бряка, например в dr0, можно контролировать и косвенно, при трассировке
в Дельфи, по состоянию регистра dr6.
Ketmar (2006-08-28 11:08:00) [26]> [8] tar4 (28.08.06 11:05)
для начала ошибка -- это отлаживать подобный код под OllyDbg.
tar4 (2006-08-28 11:05:00) [27]
> помедитируй. подумай, достаточно ли этого, если ты "ничего
> не видишь"?
Чего говоришь загадками? Если ты о состоянии регистров dr0 и dr7, то
я их состояние контролировал, если о чем-то другом - то выразись ясней. Я знаю, что где-то ошибка и если бы понимал, где ее искать - не спрашивал бы на форуме.
Сергей М. (2006-08-28 10:56:00) [28]
> tar4 (28.08.06 10:38) [5]
Так ты какой процесс-то рассматриваешь под OllyDbg ?
Ketmar (2006-08-28 10:47:00) [29]> [5] tar4 (28.08.06 10:38)
помедитируй. подумай, достаточно ли этого, если ты "ничего не видишь"?
tar4 (2006-08-28 10:38:00) [30]
> каком отладчике-то ? Уж не во встроенном ли в Делфи !?
В OllyDbg
> ты что-то куда-то выводил? не замечаю.
Не понял, что значит выводил? А то, что я меняю состояние 0 и 7-го регистров, это не достаточно?
Ketmar (2006-08-28 10:11:00) [31]а кто тебе сказал, что ты должен что-либо увидеть? ты что-то куда-то выводил? не замечаю.
Сергей М. (2006-08-28 09:49:00) [32]В каком отладчике-то ? Уж не во встроенном ли в Делфи !?
tar4 (2006-08-28 08:42:00) [33]
> некий момент там вызывается прогр.прерывание 2Eh.
Я это видел. Но почему тогда я не вижу в отладчике установленного бряка.
Сергей М. (2006-08-28 08:21:00) [34]А с чего ты взял, что обращение к DR в твоем случае происходит именно в ring3 ?
Imho, система осуществляет управление контекстом потока не иначе как в режиме ядра, в который происходит переключение в момент выполнения ф-ции Get/SetThreadContext..
Пройдись дебагером по потрохам ф-ции SetThreadContext пошагово и убедись, что в некий момент там вызывается прогр.прерывание 2Eh.