Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 29.12.2010, 20:40   #1
coNsept
Участник клуба
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Адрес: Republic of Moldova
Сообщений: 717
Репутация: 44

skype: mr.kernighan
По умолчанию Использование функции чужого приложения/OpenGL

Доброго времени суток всем уважаемым экспертам.
Собственно суть вопроса, есть некое скомпилированное *.exe приложение mmorpg игра которая содержит в себе библиотеку OpenGL и есть собственная *.dll динамически подгруженная в адресное пространство процесса (то есть в игру).
Собственно мне нужно как-то с взаимодействовать мою функцию с функцией glEnabled() игры. Для этого я нашел адрес glEnabled() в *.exe приложение по определенному адресу и попытался сделать такой вариант с макросом define MyGLEnabled ((void(*) (Type Func)) 0x00416D0D), но ничего не вышло.
#
// 0x00416D0D - адрес функции glEnabled()

Код:

void MyFunc()
{
 GLenum mode;

 if (mode == GL_BLEND)
  glDisable(GL_FOG);

 GLfloat fogColor[4] = {0.8, 0.8, 0.8, 0.0};
 
 glEnable(GL_FOG);
 glFogf(GL_FOG_DENSITY, 255.0f);
 glFogi(GL_FOG_MODE, GL_LINEAR);
 glFogfv(GL_FOG_COLOR, fogColor);
 glFogf(GL_FOG_START, 1.0f);
 glFogf(GL_FOG_END, 5.0f);
 glHint(GL_FOG_HINT, GL_NICEST);
}

Код:

void main()
{
 MyGLEnabled(MyFunc);
}

Этот вариант не рабочий, но я попытался продемонстрировать то чего я хочу, надеюсь идея ясна, за ранее всем благодарен кто будет помогать.

Последний раз редактировалось coNsept; 29.12.2010 в 20:48.
coNsept вне форума   Ответить с цитированием
Старый 29.12.2010, 20:49   #2
BOBAH13
Android Developer
ПрофессионалФорумчанин
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Адрес: Los Angeles, USA
Сообщений: 3,708
Репутация: 1457
По умолчанию

Такая штука называется "перехват api". В сети достаточно информации и примеров как перехватывать функции.
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 29.12.2010, 22:44   #3
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
Репутация: 8

icq: 225350014
По умолчанию

Да вроде както перехваты можно делать, я правдо незнаю как делать.
А тебе нужно походу ассемблер юзать - делаешь асм вставку, пишешь в стек параметры функции (чтоб узнать порядок надо узнать соглашение о вызове) и вызываешь call на нужный адрес, и далее если в соглашении требуется чистить стек то чистишь его..
ЗЫ: по поводу адреса - он не всегда будет таким, так как это на самом деле адрес базы экзешника в памяти + реальный адрес функции, в xp и 7ке помоему эти адреса разные, то есть тебе надо адрес базы узнать сначало а потом к нему прибавлять адрес функции относительный

Последний раз редактировалось UltimaBeaR; 29.12.2010 в 23:12.
UltimaBeaR вне форума   Ответить с цитированием
Старый 30.12.2010, 21:48   #4
coNsept
Участник клуба
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Адрес: Republic of Moldova
Сообщений: 717
Репутация: 44

skype: mr.kernighan
По умолчанию

Спасибо большое всем, мне нужны были перехваты как и сказал ВОВАН13.
coNsept вне форума   Ответить с цитированием
Старый 31.12.2010, 09:20   #5
coNsept
Участник клуба
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Адрес: Republic of Moldova
Сообщений: 717
Репутация: 44

skype: mr.kernighan
По умолчанию

Ребят, помогите, что-то у меня не совсем получается перехватить функцию. Вообщем программа даже перестает запускаться



Код:

/* --- MyDLL --- */
#define AddrGL 0x00407310 // Адрес вызова glEnabled в .exe
#define HookGL ((void(*)(void)) AddrGL)

void APIENTRY glFogEnabled(...)
{
 ... 
}

void HookGLProc
{
 HookGL(glFogEnabled(...));
}

void main()
{
 HookGLProc();
}
/* ------------- */

coNsept вне форума   Ответить с цитированием
Старый 31.12.2010, 16:31   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
Репутация: 8

icq: 225350014
По умолчанию

Чето ты мудришь очень с этими дефайнами, сам в них не путаешся?

У тебя идет вызов твоего указателя с параметрами void а ты в нег опри вызове передаешь что-то, конечно не будет компилится как минимум по этому

вот оформляй в таком плане:

Код:

#define GL_SOMEFUNC_ADDR 0x00407310
// void _cdecl glSomeFunc(int intParam, short shortParam)
#define GL_SOMEFUNC(intParam, shortParam) (((void(_cdecl *)(int, short))GL_SOMEFUNC_ADDR)((intParam), (shortParam)))

вызываешь так
Код:

int a = 5;
short b = 6;
GL_SOMEFUNC(a, b);

этот пример работает я проверил. И обрати внимание на _cdecl - это я поставил просто чтоб ты видел куда пихать солашения о вызове (узнай какие они у функции которую вызываешь)

Последний раз редактировалось UltimaBeaR; 31.12.2010 в 16:36.
UltimaBeaR вне форума   Ответить с цитированием
Старый 31.12.2010, 17:07   #7
BOBAH13
Android Developer
ПрофессионалФорумчанин
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Адрес: Los Angeles, USA
Сообщений: 3,708
Репутация: 1457
По умолчанию

Вы вообще читали хоть одну статью по перехвату API? Там адрес никогда не получается статическим. Получение адреса выходит благодаря GetProcAddress, где указывается имя экспортируемой функции и модуль (.dll, .exe) в котором она находится, но этот модуль должен быть загружен в тот же процесс в котором находится ваша dll. Читайте внимательно, ведь даже примеры есть.
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 31.12.2010, 17:15   #8
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
Репутация: 8

icq: 225350014
По умолчанию

А если эти функции не экспортируются?
ЗЫ Хотя тут вроде длл

Последний раз редактировалось UltimaBeaR; 31.12.2010 в 17:28.
UltimaBeaR вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Данные с чужого приложения Revenger Общие вопросы Delphi 3 12.08.2010 23:07
Hint чужого приложения Umberto Win Api 0 07.02.2010 19:41
Запрет на закрытие чужого приложения S@fer Win Api 2 12.07.2009 19:47
Как скопировать текст чужого приложения? Nikolay-niw32 Общие вопросы Delphi 17 12.03.2009 22:28
Как определить путь чужого приложения? VVM Win Api 3 02.12.2008 19:22


05:09.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru