Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

обращение к отладочным регистрам   Найти похожие ветки 

 
tar4   (2006-08-28 07:15) [0]

Известно, что прямое обращение к отладочным регистрам из 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 08:21) [1]

А с чего ты взял, что обращение к DR в твоем случае происходит именно в ring3 ?
Imho, система осуществляет управление контекстом потока не иначе как в режиме ядра, в который происходит переключение в момент выполнения ф-ции Get/SetThreadContext..

Пройдись дебагером по потрохам ф-ции SetThreadContext пошагово и убедись, что в некий момент там вызывается прогр.прерывание 2Eh.


 
tar4   (2006-08-28 08:42) [2]


>  некий момент там вызывается прогр.прерывание 2Eh.

Я это видел. Но почему тогда я не вижу в отладчике установленного бряка.


 
Сергей М. ©   (2006-08-28 09:49) [3]

В каком отладчике-то ? Уж не во встроенном ли в Делфи !?


 
Ketmar ©   (2006-08-28 10:11) [4]

а кто тебе сказал, что ты должен что-либо увидеть? ты что-то куда-то выводил? не замечаю.


 
tar4   (2006-08-28 10:38) [5]


>  каком отладчике-то ? Уж не во встроенном ли в Делфи !?

В OllyDbg

> ты что-то куда-то выводил? не замечаю.

Не понял, что значит выводил? А то, что я меняю состояние 0 и 7-го регистров, это не достаточно?


 
Ketmar ©   (2006-08-28 10:47) [6]

> [5] tar4   (28.08.06 10:38)
помедитируй. подумай, достаточно ли этого, если ты "ничего не видишь"?


 
Сергей М. ©   (2006-08-28 10:56) [7]


> tar4   (28.08.06 10:38) [5]


Так ты какой процесс-то рассматриваешь под OllyDbg  ?


 
tar4   (2006-08-28 11:05) [8]


> помедитируй. подумай, достаточно ли этого, если ты "ничего
> не видишь"?

Чего говоришь загадками? Если ты о состоянии регистров dr0 и dr7, то
я их состояние контролировал, если о чем-то другом - то выразись ясней. Я знаю, что где-то ошибка и если бы понимал, где ее искать - не спрашивал бы на форуме.


 
Ketmar ©   (2006-08-28 11:08) [9]

> [8] tar4   (28.08.06 11:05)
для начала ошибка -- это отлаживать подобный код под OllyDbg.


 
tar4   (2006-08-28 11:26) [10]


> для начала ошибка -- это отлаживать подобный код под OllyDbg.

Ты считаешь, что надо пользоваться СофтАйсом, почему?  Ведь OllyDbg позволяет ставить и снимать аппаратные бряки. И еще. Ведь установку
бряка, например в dr0,  можно контролировать и косвенно, при трассировке
в Дельфи, по состоянию регистра dr6.


 
Сергей М. ©   (2006-08-28 11:27) [11]


> tar4   (28.08.06 11:26) [10]


Для изобретателей велосипедов:

http://www.wasm.ru/article.php?article=1001030


 
Ketmar ©   (2006-08-28 11:45) [12]

> [11] Сергей М. ©   (28.08.06 11:27)
судя по всему, охота именно DRx. зачем -- не ясно, но охота пуще неволи.


 
tar4   (2006-08-28 12:16) [13]


> Для изобретателей велосипедов:

Я читал это.

> судя по всему, охота именно DRx. зачем -- не ясно, но охота
> пуще неволи.

В данном случае речь идет только об возможности установки аппаратного
бряка, например, в DR0 без использования флага "DEBUG_PROCESS" в CreateProcess и функции WaitForDebugEvent.


 
Сергей М. ©   (2006-08-28 12:19) [14]


> tar4   (28.08.06 12:16) [13]


Ты не ответил на вопрос [7]


 
Ketmar ©   (2006-08-28 12:21) [15]

> [13] tar4   (28.08.06 12:16)
расслабься. оно того не стоит.


 
Ketmar ©   (2006-08-28 12:21) [16]

или, может, всё-таки внятно пояснишь, зачем оно тебе? глядишь, придумаем чего.


 
Сергей М. ©   (2006-08-28 12:23) [17]


> tar4


Вот эта вот цифирь

$401d48

она откуда взялась ? В АП какого процесса она фигурирует ?


 
tar4   (2006-08-28 12:42) [18]


> Сергей М

Извини, я как-то случайно пропустил твой вопрос. Есть  1-й процесс,
из которого запускается "2 процесс" через CreateProcess. 1-й процесс я
и загружал в OllyDbg.
$401d48 - это ЕР 2-го процесса, взят просто из отладчика при загрузке в него 2-го процесса. Вообщем, я догадываюсь, что здесь вероятно ошибка.


> может, всё-таки внятно пояснишь, зачем оно тебе? глядишь,
>  придумаем чего.

Мне надо загрузить другой процесс и поставить где-нибудь в секции кода (пока не важно где) аппаратный бряк. При этом не используя Debug API.


 
Ketmar ©   (2006-08-28 12:48) [19]

> [18] tar4   (28.08.06 12:42)
> Мне надо загрузить другой процесс и поставить где-нибудь
> в секции кода (пока не важно где) аппаратный бряк. При этом
> не используя Debug API.

а я сразу и не догадался. всё раздумывал, зачем DRx используются. теперь кристалльно ясно. необходимость именно такого подхода пояснена чётко и доступно.


 
Сергей М. ©   (2006-08-28 12:54) [20]


> tar4   (28.08.06 12:42) [18]


> $401d48 - это ЕР


Что за "ЕР" ?


> 1-й процесс я
> и загружал в OllyDbg


угу ... а DR при этом модифицируешь совсем в другом потоке совсем другого процесса, т.е. вовсе не того, который ты отлаживаешь в тек.сессии OllyDbg

)


 
tar4   (2006-08-28 13:18) [21]


> всё раздумывал, зачем DRx используются. теперь кристалльно
> ясно. необходимость именно такого подхода пояснена чётко
> и доступно.

К чему ирония? Что ты еще хочешь узнать? Хочу написать загрузчик.
Для этого мне нужно научиться приостанавливать выполнения запущенного потока. Разве этого не достаточно? Почему не хочу использовать debug Api - так это тема для другого разговора.


>  а DR при этом модифицируешь совсем в другом потоке совсем
> другого процесса, т.е. вовсе не того, который ты отлаживаешь
> в тек.сессии OllyDbg

Но ведь  я получаю Context контекст запущенного потока
GetThreadContext(pi.hThread,State);  //читаем контекст потока
И в этом контексте меняю DR0
State.Dr0:=$401d48;    
Получается, что в текущей сессии OllyDbg я не могу посмотреть запускаемый процесс. А как быть?


 
Сергей М. ©   (2006-08-28 13:26) [22]


> в текущей сессии OllyDbg я не могу посмотреть запускаемый
> процесс. А как быть?


Ну, наверно, следует запустить еще один экз-р OllyDbg, снять в нем отладочную опцию использования аппаратных брейкпойнтов и выполнить аттач к стартованному тобой порожденному процессу.


 
tar4   (2006-08-28 13:28) [23]


> Что за "ЕР" ?

Забыл, ЕР - Entry Point 2-го процесса.


 
Ketmar ©   (2006-08-28 13:28) [24]

> [21] tar4   (28.08.06 13:18)
> нужно научиться приостанавливать выполнения запущенного потока
и зачем тут DRx?


 
tar4   (2006-08-28 13:44) [25]


> нужно научиться приостанавливать выполнения запущенного
> потокаи зачем тут DRx

А как у тебя предложения. Int3 ($CC) на 1 байт адреса? Или SuspendThread
по таймеру?


 
Сергей М. ©   (2006-08-28 13:50) [26]


> tar4   (28.08.06 13:44) [25]


Ты чего сотворяешь-то ? Отладчик что ли ?)


 
Ketmar ©   (2006-08-28 13:52) [27]

> [25] tar4   (28.08.06 13:44)
а почему бы и да? вполне нормальные методы. а если ты снимаешь с чего-то защиту, то опять же это лучше делать без DRx. загрузи, распакуй, пропатчи, запускай.


 
Ketmar ©   (2006-08-28 13:53) [28]

> [26] Сергей М. ©   (28.08.06 13:50)
есть подозрение, что то ли cheater для игрушки, то ли loader для какой-то защищённой системы. если последнее, то автору лучше не признаваться. %-)


 
tar4   (2006-08-28 14:11) [29]


> Ты чего сотворяешь-то ? Отладчик что ли ?)

Ну, что-то вроде этого.

> если ты снимаешь с чего-то защиту, то опять же это лучше делать без DRx
> загрузи, распакуй, пропатчи, запускай.

Да знаю я это. Ребята, посмотрите в название топика. Мы же вроде не обсуждаем методы отладки программ. Подскажите, если знаете, как можно
установить аппаратный бряк в контексте запускаемой программы.


 
Сергей М. ©   (2006-08-28 14:16) [30]


> tar4   (28.08.06 14:11) [29]


> что-то вроде этого


Ясно. Еще один велосипед)


> как можно
> установить аппаратный бряк в контексте запускаемой программы


Примерно так и установить.
Но к OllyDbg это не имеет отношения - он это умеет делать, причем весьма грамотно, как и многие другие не самые простые вещи, касаемые дебага.


 
tar4   (2006-08-28 14:45) [31]


> Ну, наверно, следует запустить еще один экз-р OllyDbg, снять
> в нем отладочную опцию использования аппаратных брейкпойнтов
> и выполнить аттач к стартованному тобой порожденному процессу.
>

Я нечто подобное делал, только не в OllyDbg. Запускал 1-й процесс в Дельфи, тормозил его после CreateProcess и искал 2-й процесс в списке процессов (через LOrdPE); его там не было. Сейчас попробывал сделать,
то что ты написал в OllyDbg. Отладчик "не видит" 2-й процесс до тех пор, пока не пройдешь ResumeThread. Тогда как присоединится к тому чего еще нет?


 
Ketmar ©   (2006-08-28 14:51) [32]

> [31] tar4   (28.08.06 14:45)
собственно, оно есть, но ещё не запущено. отдыхает в ливере виндов. протрассировать до возврата из виндовых dll -- и тогда цепляться.


 
Сергей М. ©   (2006-08-28 15:02) [33]


> tar4   (28.08.06 14:45) [31]


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


 
tar4   (2006-08-28 15:05) [34]

Ketmar,Сергей М
Спасибо за консультации.



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

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.036 c
2-1166675721
Marat
2006-12-21 07:35
2007.01.14
округлить число


4-1156614865
alexkram
2006-08-26 21:54
2007.01.14
Login после перезагрузки.


2-1166719823
Vasiliy_
2006-12-21 19:50
2007.01.14
Вопрос по базам данных paradox(Delphi, Database desktop).


3-1161609116
worldmen
2006-10-23 17:11
2007.01.14
Создение деревьев и работа с ними. Дайте ссылки.


2-1166637366
Slimer
2006-12-20 20:56
2007.01.14
Проблемма с индексами в таблице