|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 8, 2004 09:53:02 1) Открыл процесс.. со всеми провами записал по нужному адресу... CC соотсвено чтоб вызвать исключение далее вызываю дебагактивпроцесс и указываю ИД процесса соотсвенно 2) Ухожу в цикл с ожиданием событий от дебагера если ExceptionCode остановился на брекпоинте то получаю ExceptionAddress и вот тут чудеса... адрес вообще не тот =) ВООБЩЕ! даже рядом не стоит... то что он остановился именно на этой точке проверил просто не записывал CC не появляется... записал появилось но адрес блин... странна даже |
|
|
Дата: Июн 8, 2004 11:34:24 Ничего странного - скорее всего, ты поставил CC в зашифрованный кусок кода. При расшифровке твой CC вылез боком, и вместо нормального расшифрованного куска получился мусор, который и вызвал исключение. |
|
|
Дата: Июн 8, 2004 11:37:27 Программа ничем не зашифрована и не чем не сжата... причём адрес ООЧЕНЬ большой... странно даже откуда оно такое |
|
|
Дата: Июн 8, 2004 12:07:52 Вот выдержка из MSDN (DebugActiveProcess): After all of this has been done, the system resumes all threads in the process. When the first thread in the process resumes, it executes a breakpoint instruction that causes an EXCEPTION_DEBUG_EVENT debugging event to be sent to the debugger. All future debugging events are sent to the debugger by using the normal mechanism and rules. А вот из книжечки Debugging Applications John'а Robbins'а: The only Win32 debug event that needs special handling is the loader breakpoint. After the operating system sends initial CREATE_PROCESS_DEBUG_EVENT and LOAD_DLL_DEBUG_EVENT notifications for the implicitly loaded modules, the debugger receives an EXCEPTION_DEBUG_EVENT. This debug event is the loader breakpoint. The debuggee executes this breakpoint because the CREATE_PROCESS_DEBUG_EVENT indicates only that the process was loaded, not that it was executed. The loader breakpoint, which the operating system forces each debuggee to execute, is the first time the debugger knows when the debuggee is truly running. In real-world debuggers, the main data structure initialization, such as for symbol tables, is handled during process creation, and the debugger starts showing code disassembly or doing necessary debuggee patching in the loader breakpoint. Т.е. Вы получаете EXCEPTION_DEBUG_EVENT от loader, а не от Вашего брекпойнта, который сигнализирует о том, что отладка, собственно, началась. Просто пропускайте его, и все. |
|
|
Дата: Июн 8, 2004 12:08:49 Может тогда уж через ГетТридКОнтекст ... глядеть eip .. если эта фигню не то показывает |
|
|
Дата: Июн 8, 2004 12:13:51 Это я понимаю и его я проспускаю.... я говрю уже про реальный бряк... сори что не написал сразу... |
|
|
Дата: Июн 8, 2004 16:37:46 Приду домой поестю и предположим будет всё ОК... (предположим) вопрос номер 2... (первый не снимаю.. +)) как бы мне из моей программке передать отлаживаемую программу... новый буфер предположим... push edi //указатель на буфер я ставлю бряк... и задача сменить значение edi (сет трид контекст соотсвенно) на указатель на мой буфер... который в моей программе... либо как нибудь .. алокировать память в отлаживаемомм ... процессе и переписать туда мой буфер... хм.. вот |
|
|
Дата: Июн 8, 2004 17:53:39 Fallout вопрос номер 2... (первый не снимаю Раз уж ты первый вопрос не снимаешь, то переформулируй его так подробно, чтоб даже такой тормоз, как я, его понял: что в каком порядке делаешь, чего хочешь получить, что получаешь... А то пока я тебя понял так, что ты сначала пишешь в память другого процесса, а только потом цепляешь к нему отладчик. Что касается второго вопроса, то есть такая функция VirtualAllocEx. |
|
|
Дата: Июн 8, 2004 18:46:51 Хм.. всё прсото .. я вычесляю хендл окна по его классу .... далее получает его ПИД ... потом открываю ПИД со всеми праввами на чтения и на запись .. далее получив хендл... я пишу брек поинты туда куда захочу... ну незабыв сначала .. оригинальные байтики сохранить ... далее ДебагАктивПРоцесс вызываю... в параметр указываю ПИД .. ну и всё жду евента от дебагера .. в вечном цикле... ждём EXIT_pROCESS_DEBUG_EVENT сразу идёт срабатывания там будет евент помоему CREATE_pROCESS_DEBUG_EVENT нам оно не надо... нам надо EXCEPTION_BREAKPOINT соотсвенно .. после того как его получили можем получить и адрес ... и инфо о регистрах через геттридконтекст... ну вот... вообщем прихожу домой и всё рабоатет как надо +))) оболдеть ... как такое может быть?... странно даже ну ладно не важно работает и работает .. адреса все те где ставлю брек поинт всё ок .. толкьо вот новая напасть.... в структуре... DEBUG_EVENT.... DBEvent.u.CreateprocessInfo.hThread равен 0!!!! это что только мне так невезёт ?.. как же я получи контект трида если .. хендл его равен 0 +)... блин... ну чтож такое.... 2RobinFood за АПИ спасибо погляжу.... когда разберусь с ЧУДЕСАМИ... |
|
|
Дата: Июн 8, 2004 19:11:53 когда разберусь с ЧУДЕСАМИ... Чудо первое. Ты сначала патчишь процесс, а уже потом цепляешь к нему отладчик. Между этими твоими действиями процесс может успеть дойти до пропатченого участка, получить исключение, попытаться его обработать и начать "чудесить". Попробуй сначала прицепить отладчик, потом дождаться сообщения "помоему CREATE_pROCESS_DEBUG_EVENT", и уже только в его обработчике пропатчить то, что тебе надо. Чудо второе. Ты не написал, в какой момент ты пытаешься читать значение DBEvent.u.CreateProcessInfo.hThread. Если я правильно понимаю написанное тобой, то этот момент - реакция на EXCEPTION_BREAKPOINT, а в этот момент DBEvent.u.CreateProcessInfo недоступен. Попробуй при получении CREATE_THREAD_DEBUG_EVENT читать значение DBEvent.u.CreateThread.hThread, или пользоваться DBEvent.dwThreadId и OpenThread. Чудо третье. Сам себе удивляюсь - вроде и не пил с утра, а понимаю тебя с оч-чень большим напрягом, притом больше угадываю, чем понимаю. Если я тебя понять не могу, может быть, и у твоего компилятора такая же проблема, как у меня? Попробуй проверять орфографию перед отправкой сообщений. Или просто вместо путаных объяснений отправляй кусок своего кода. |
|
|
Дата: Июн 8, 2004 19:24:49 2) Угу так и сделаю... 5) Меня вообще сложно понять... странно но меня не понимают.. довно уже заметил... 1) Исключено ... в моём случаи... хотя ты верно заметил ... не надо делать пасхальных яиц на будующие... 3) Обсалютно верно тогда =) и ты опять прав =)... 4) Угу так и сделаю... прсото надо читать МСДН больше +) и чаще блин... но зато приятно что тебе всегда помогут =) |
|
|
Дата: Июн 8, 2004 21:33:25 Текс... ну что то опять туплю... Если DBEvent.u.Exception.ExceptionRecord.ExceptionAddress равен тому адресу... где мы поставили бряк то.. далее на С++ прсото так быстрее и удобнее.. тестить открываем трид с правами на получение и установку контекста... DWORD threadHD = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, FALSE, DBEvent.dwThreadId); соотсвенно заполняем структуру контекста GetThreadContext(threadHD, &tContext); записываем старый байтик на то место где писали ранее CC WriteProcessMemory(procHD, (void *)breakadress, &oldvalue, 1, NULL); уменьшаем на один .. соотсвено ... значение регистра Eip tContext.Eip--; устанавливаем контекст который мы обновили.... SetThreadContext( threadHD, &tContext); закрываем хендл открытого трида CloseHandle(threadHD); ну и продолжнаем нашь процесс... ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE); по моим мыслям проццес должен продолжить свою работу нормально... но получается то что как он был заморожен так и остался... =( может чтоб мне каждый раз не объяснять инфу почитать дадите ? +) |
|
|
Дата: Июн 8, 2004 21:42:57 Да и значение Eip у меня какое то немыслемое должно же быть такой же адрес как бряк... соотсвенно а у меня 0xBD123D3C =) |
|
|
Дата: Июн 8, 2004 21:47:45 Да чуть не забыл программа много поточная +) |
|
|
Дата: Июн 8, 2004 22:29:33 Я идиот +) Для начало надо было подумать +) контекст флаг забыл выставить =))) блин.... без коментариев.... теперь получился бесконечный луп +) ну ладно зато теперь яснее |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.082 |