![]() |
| ||
|
|
Новости |
Поиск |
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;
tar4 (2006-08-28 15:05:00) [1]Ketmar,Сергей М
Спасибо за консультации.
Сергей М. (2006-08-28 15:02:00) [2]
> tar4 (28.08.06 14:45) [31]
Прекращай заниматься херней и излагай подробно свое ТЗ.
Тогда и будут конкретные рекомендации.
А сейчас ты занят тем, чем занят сапожник, замещающий пирожника.
Ketmar (2006-08-28 14:51:00) [3]> [31] tar4 (28.08.06 14:45)
собственно, оно есть, но ещё не запущено. отдыхает в ливере виндов. протрассировать до возврата из виндовых dll -- и тогда цепляться.
tar4 (2006-08-28 14:45:00) [4]
> Ну, наверно, следует запустить еще один экз-р OllyDbg, снять
> в нем отладочную опцию использования аппаратных брейкпойнтов
> и выполнить аттач к стартованному тобой порожденному процессу.
>
Я нечто подобное делал, только не в OllyDbg. Запускал 1-й процесс в Дельфи, тормозил его после CreateProcess и искал 2-й процесс в списке процессов (через LOrdPE); его там не было. Сейчас попробывал сделать,
то что ты написал в OllyDbg. Отладчик "не видит" 2-й процесс до тех пор, пока не пройдешь ResumeThread. Тогда как присоединится к тому чего еще нет?
Сергей М. (2006-08-28 14:16:00) [5]
> tar4 (28.08.06 14:11) [29]
> что-то вроде этого
Ясно. Еще один велосипед)
> как можно
> установить аппаратный бряк в контексте запускаемой программы
Примерно так и установить.
Но к OllyDbg это не имеет отношения - он это умеет делать, причем весьма грамотно, как и многие другие не самые простые вещи, касаемые дебага.
tar4 (2006-08-28 14:11:00) [6]
> Ты чего сотворяешь-то ? Отладчик что ли ?)
Ну, что-то вроде этого.
> если ты снимаешь с чего-то защиту, то опять же это лучше делать без DRx
> загрузи, распакуй, пропатчи, запускай.
Да знаю я это. Ребята, посмотрите в название топика. Мы же вроде не обсуждаем методы отладки программ. Подскажите, если знаете, как можно
установить аппаратный бряк в контексте запускаемой программы.
Ketmar (2006-08-28 13:53:00) [7]> [26] Сергей М. © (28.08.06 13:50)
есть подозрение, что то ли cheater для игрушки, то ли loader для какой-то защищённой системы. если последнее, то автору лучше не признаваться. %-)
Ketmar (2006-08-28 13:52:00) [8]> [25] tar4 (28.08.06 13:44)
а почему бы и да? вполне нормальные методы. а если ты снимаешь с чего-то защиту, то опять же это лучше делать без DRx. загрузи, распакуй, пропатчи, запускай.
Сергей М. (2006-08-28 13:50:00) [9]
> tar4 (28.08.06 13:44) [25]
Ты чего сотворяешь-то ? Отладчик что ли ?)
tar4 (2006-08-28 13:44:00) [10]
> нужно научиться приостанавливать выполнения запущенного
> потокаи зачем тут DRx
А как у тебя предложения. Int3 ($CC) на 1 байт адреса? Или SuspendThread
по таймеру?
Ketmar (2006-08-28 13:28:00) [11]> [21] tar4 (28.08.06 13:18)
> нужно научиться приостанавливать выполнения запущенного потока
и зачем тут DRx?
tar4 (2006-08-28 13:28:00) [12]
> Что за "ЕР" ?
Забыл, ЕР - Entry Point 2-го процесса.
Сергей М. (2006-08-28 13:26:00) [13]
> в текущей сессии OllyDbg я не могу посмотреть запускаемый
> процесс. А как быть?
Ну, наверно, следует запустить еще один экз-р OllyDbg, снять в нем отладочную опцию использования аппаратных брейкпойнтов и выполнить аттач к стартованному тобой порожденному процессу.
tar4 (2006-08-28 13:18:00) [14]
> всё раздумывал, зачем DRx используются. теперь кристалльно
> ясно. необходимость именно такого подхода пояснена чётко
> и доступно.
К чему ирония? Что ты еще хочешь узнать? Хочу написать загрузчик.
Для этого мне нужно научиться приостанавливать выполнения запущенного потока. Разве этого не достаточно? Почему не хочу использовать debug Api - так это тема для другого разговора.
> а DR при этом модифицируешь совсем в другом потоке совсем
> другого процесса, т.е. вовсе не того, который ты отлаживаешь
> в тек.сессии OllyDbg
Но ведь я получаю Context контекст запущенного потока
GetThreadContext(pi.hThread,State); //читаем контекст потока
И в этом контексте меняю DR0
State.Dr0:=$401d48;
Получается, что в текущей сессии OllyDbg я не могу посмотреть запускаемый процесс. А как быть?
Сергей М. (2006-08-28 12:54:00) [15]
> tar4 (28.08.06 12:42) [18]
> $401d48 - это ЕР
Что за "ЕР" ?
> 1-й процесс я
> и загружал в OllyDbg
угу ... а DR при этом модифицируешь совсем в другом потоке совсем другого процесса, т.е. вовсе не того, который ты отлаживаешь в тек.сессии OllyDbg
)
Ketmar (2006-08-28 12:48:00) [16]> [18] tar4 (28.08.06 12:42)
> Мне надо загрузить другой процесс и поставить где-нибудь
> в секции кода (пока не важно где) аппаратный бряк. При этом
> не используя Debug API.
а я сразу и не догадался. всё раздумывал, зачем DRx используются. теперь кристалльно ясно. необходимость именно такого подхода пояснена чётко и доступно.
tar4 (2006-08-28 12:42:00) [17]
> Сергей М
Извини, я как-то случайно пропустил твой вопрос. Есть 1-й процесс,
из которого запускается "2 процесс" через CreateProcess. 1-й процесс я
и загружал в OllyDbg.
$401d48 - это ЕР 2-го процесса, взят просто из отладчика при загрузке в него 2-го процесса. Вообщем, я догадываюсь, что здесь вероятно ошибка.
> может, всё-таки внятно пояснишь, зачем оно тебе? глядишь,
> придумаем чего.
Мне надо загрузить другой процесс и поставить где-нибудь в секции кода (пока не важно где) аппаратный бряк. При этом не используя Debug API.
Сергей М. (2006-08-28 12:23:00) [18]
> tar4
Вот эта вот цифирь
$401d48
она откуда взялась ? В АП какогопроцесса она фигурирует ?
Ketmar (2006-08-28 12:21:00) [19]или, может, всё-таки внятно пояснишь, зачем оно тебе? глядишь, придумаем чего.
Ketmar (2006-08-28 12:21:00) [20]> [13] tar4 (28.08.06 12:16)
расслабься. оно того не стоит.