· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› CONTEXT.Eip при старте

Посл.отвђт Сообщен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