Форум: "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