Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2011, 22:07   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Перехват GL Api

Доброго времени суток уважаемые гении. Вообщем возникла проблема с перехватом функций, не могу понять в чем проблема.
Обратите внимание, на функцию HookMyFoo() собственно проблема в том что когда пытаюсь перехватить две функции подряд, приложение падает, но если по отдельности, тогда все хорошо. То есть если закомментировать одну из функций в HookMyFoo, все работает отлично, я пробовал и первую и вторую функцию, все работало корректно. Или я чего-то не догоняю или глюк!?

Код:
typedef void (APIENTRY *ptr_glEnable)(GLenum);
ptr_glEnable glEnable_Real = (ptr_glEnable)&glEnable;

typedef void (APIENTRY *ptr_glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
ptr_glClearColor glClearColor_Real = (ptr_glClearColor)&glClearColor;

BYTE lpBuffer[6];
DWORD nBytesRead;
Trampoline MyJmp;

void Intercept_MyFoo(DWORD dwMyFoo_Real, DWORD dwMyFoo_Fake) {
	// ----
	MyJmp.Push = 0x68;
	MyJmp.Addr = dwMyFoo_Fake; 
	MyJmp.Ret = 0xC3;
	// ----
	ReadProcessMemory(GetCurrentProcess(), (void*)dwMyFoo_Real, (void*)&lpBuffer, 6, &nBytesRead);
	WriteProcessMemory(GetCurrentProcess(), (void*)dwMyFoo_Real, (void*)&MyJmp, sizeof(MyJmp), &nBytesRead);
}

BOOL APIENTRY glEnable_Fake(GLenum cap) 
{
	GLfloat rgba[4] = { 10, 10, 40, 1 };

	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

	WriteProcessMemory(GetCurrentProcess(), (void*)glEnable_Real, (void*)&lpBuffer, 6, &nBytesRead);

  // Здеся делаю свои действия с glEnable
	
	((BOOL (APIENTRY*)(GLenum cap))glEnable_Real)(cap); 
	WriteProcessMemory(GetCurrentProcess(), (void*)glEnable_Real, (void*)&MyJmp, 6, &nBytesRead);
	return TRUE;
}

unsigned int Textures[5];

BOOL APIENTRY glClearColor_Fake(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
	GLfloat rgba[4] = { 10, 10, 40, 1 };

	WriteProcessMemory(GetCurrentProcess(), (void*)glClearColor_Real, (void*)&lpBuffer, 6, &nBytesRead);

  // Здеся делаю свои действия с glClearColor

	WriteProcessMemory(GetCurrentProcess(), (void*)glClearColor_Real, (void*)&MyJmp, 6, &nBytesRead);
	return TRUE;
} 

void HookMyFoo() 
{
	Intercept_MyFoo((DWORD)glEnable_Real, (DWORD)glEnable_Fake);
	Intercept_MyFoo((DWORD)glClearColor_Real, (DWORD)glClearColor_Fake);
}
coNsept вне форума Ответить с цитированием
Старый 18.06.2011, 23:15   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Походу, два акробата не прыгают на одном батуте.
В функции glEnable_Real, задействован тот MyJmp, поля структуры которого заполнены в Intercept_MyFoo(...glClearColor_Rea l.
Короче, оформить бы все классом или создать массив Trampoline MyJmp[] под каждую перехватываемую функцию.
EUGY вне форума Ответить с цитированием
Старый 19.06.2011, 01:31   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ммм, даже на двух батутах не прыгают, не понятно ничего... Есть у кого еще какие соображения?
coNsept вне форума Ответить с цитированием
Старый 19.06.2011, 01:50   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

lpBuffer конечно же тоже свой для каждого перехвата?
EUGY вне форума Ответить с цитированием
Старый 19.06.2011, 02:12   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Хех, а я как-то не подумал, думал что байты перезаписываются, оказалось нет. Спасибо теперь работает.
coNsept вне форума Ответить с цитированием
Старый 19.06.2011, 02:20   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Сорри за флуд, вообще смешно, когда программист с хорошим уровнем наступает на детские грабли.
EUGY вне форума Ответить с цитированием
Старый 19.06.2011, 02:42   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
с хорошим уровнем
Уху, мне иногда смешно самому когда я забываю синтаксис. Помню момент был когда память выделить пытался и все никак у меня это не выходило (rofl)
На самом деле, пишу код в полу сонном состояние, в перерывах между экзаменами.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват API-функций, диски Vikenty Общие вопросы Delphi 0 31.07.2010 20:35
Перехват API BOBAH13 Win Api 12 10.05.2010 10:11
перехват API функций ассемблер123 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 29.04.2010 12:51
API перехват Irat Помощь студентам 13 11.02.2008 12:04
Перехват API функций satana Win Api 4 21.08.2007 20:12