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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.012 c
3-1161759493
Kolan
2006-10-25 10:58
2007.01.14
Как скопировать БД.


2-1167143408
vain
2006-12-26 17:30
2007.01.14
Запуздыривание в трей.


15-1166640174
cando
2006-12-20 21:42
2007.01.14
Midi files


4-1156933156
apic
2006-08-30 14:19
2007.01.14
частоту монитора


2-1167118319
XTD
2006-12-26 10:31
2007.01.14
Результат пинга





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