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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2010, 19:40   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Использование функции чужого приложения/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 в 19:48.
coNsept вне форума Ответить с цитированием
Старый 29.12.2010, 19:49   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Такая штука называется "перехват api". В сети достаточно информации и примеров как перехватывать функции.
BOBAH13 вне форума Ответить с цитированием
Старый 29.12.2010, 21:44   #3
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

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

Последний раз редактировалось UltimaBeaR; 29.12.2010 в 22:12.
UltimaBeaR вне форума Ответить с цитированием
Старый 30.12.2010, 20:48   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Спасибо большое всем, мне нужны были перехваты как и сказал ВОВАН13.
coNsept вне форума Ответить с цитированием
Старый 31.12.2010, 08:20   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

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



Код:
/* --- 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, 15:31   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

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

У тебя идет вызов твоего указателя с параметрами 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 в 15:36.
UltimaBeaR вне форума Ответить с цитированием
Старый 31.12.2010, 16:07   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

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

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

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


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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