|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 15, 2004 14:03:05 создаю процесс с флагом CREATE_SUSPENDED. беру его контекст. по идее в CONTEXT.Eip должен содержаться адрес Entry Point? но там адрес внутри kernel32. или я че-то не правильно понимаю? после правки контекста делаю ResumeThread - процесс завершается. на чтобы я его не поменял. менял на 0 - вроде эксэпшн должен вылезти, а нифига - завершение и все... где я заблуждаюсь? |
|
|
Дата: Сен 15, 2004 15:53:27 Первый поток процесса начинается не с EntryPoint, а с KERNEL32!BaseProcessStart. Это - для подсистемы win32. Native-аппликухи рождаются в недрах ntdll. по идее в CONTEXT.Eip должен содержаться адрес Entry Point Идя неверна и основана на ложных допущениях :) |
|
|
Дата: Сен 15, 2004 17:01:59 ясно. а почему тогда модификация Eip не вызывает сбоя? |
|
|
Дата: Сен 15, 2004 18:43:12 Sickle может ты просто флаг CONTEXT_CONTROL не выставляешь? |
|
|
Дата: Сен 15, 2004 18:49:52 и CONTEXT_CONTROL, и CONTEXT_FULL пробовал - те же яйца, только в профиль... |
|
|
Дата: Сен 18, 2004 16:46:24 · Поправил: Gloomy Сорри что вопрос немного не в тему - не хочу создавать новую тему. Имеется код:
CONTEXT cnt = {0};
cnt.ContextFlags = CONTEXT_CONTROL;
wsprintf(buff, "EIP: %X", cnt.Rip);
Выдается ошибка: sdebug.cpp(72) : error C2039: 'Rip' : is not a member of '_CONTEXT' C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinNT.h(2201) : see declaration of '_CONTEXT' Results Но ведь cnt.Rip совпадает с описанием! :( |
|
|
Дата: Сен 18, 2004 17:57:37 Кусок из Winnt.h: // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_CONTROL. // DWORD Ebp; DWORD Eip; DWORD SegCs; // MUST BE SANITIZED DWORD EFlags; // MUST BE SANITIZED DWORD Esp; DWORD SegSs; Rip это 64-х битный регистр ip, откуда ему там быть? |
|
|
Дата: Сен 18, 2004 19:35:00 · Поправил: Gloomy Спасибо, с этим ясно. А как именуется флаг трассировки? В winnt.h я этого не нашел хотя очень стрался :( Пробовал написать: cnt.EFlags = 0x100; Но похоже это не тот параметр т.к. работающей пошаговой отладки не наблюдается. З.Ы. Отладчик пишу по этому примеру |
|
|
Дата: Сен 18, 2004 19:56:04 Правильно, 0x100 это флаг трассировки, значит ошибка в чём-то другом. |
|
|
Дата: Сен 18, 2004 19:58:08 Все написал 1:1 с примером:
while (TRUE)
{
WaitForDebugEvent(&de, INFINITE);
switch (de.dwDebugEventCode)
{
case EXIT_PROCESS_DEBUG_EVENT:
wsprintf(buff, "End process\nSteps: %u", steps);
MessageBox(0, buff, NULL, MB_ICONINFORMATION);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
ExitProcess(0);
break;
case CREATE_PROCESS_DEBUG_EVENT:
MessageBox(0, "Start debug process...", "Info", MB_ICONEXCLAMATION);
steps = 0;
break;
case EXCEPTION_DEBUG_EVENT:
switch (de.u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_BREAKPOINT:
// Запуск трейса!
cnt.ContextFlags = CONTEXT_CONTROL;
GetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
cnt.EFlags = 0x100;
SetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE);
continue;
case EXCEPTION_SINGLE_STEP:
// Тут будет бряк при каждом новом шаге!
steps++;
GetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
cnt.EFlags = 0x100;
SetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE);
continue;
}
break;
case CREATE_THREAD_DEBUG_EVENT:
MessageBox(0, "Begin new thread!", NULL, MB_ICONINFORMATION);
break;
case EXIT_THREAD_DEBUG_EVENT:
MessageBox(0, "Kill thread!", NULL, MB_ICONINFORMATION);
break;
}
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
}
|
|
|
Дата: Сен 18, 2004 20:34:53 cnt.EFlags = 0x100; Ты нарущаешь этим работу программы, зачем сбрасывать остальные флаги. Правильно будет cnt.EFlags |= 0x100; Больше ошибок вроде не видно, попробуй под отладчиком прогони(лучше под айсом), что функции GetThreadContext и SetThreadContext возвращают. |
|
|
Дата: Сен 18, 2004 20:42:30 Вместо de.u.CreateProcessInfo.hThread нужно было написать pi.hThread Все работает но как-то странно, отлаживаемая программа падает... |
|
|
Дата: Сен 18, 2004 21:04:58 так cnt.EFlags |= 0x100 прописал? Если да, то падать ничего не должно. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.117 |