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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2011, 16:22   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Import gl функций

Всем здравствуйте. Вообщем пишу некие графические дополнения к игре, использую библиотеку opengl с расширениями cg, glsl.
Трудности заключаются в том что исходников игры в наличие нема и приходится работать всегда с дизассемблером. Если внедрять какие либо свои действия приходится перехватывать уже задействованные функции, внедрять свой код и обратно переключаться на оригинал, но это мне немного надоело. Как-то копался на одном форуме и наткнулся на один *.dll файл где были подключены шейдеры к данной игре, отреверсив я увидел следующее:

Код анализировать не нужно, просто обратите внимание на вызов процедуры по адресу 00141F68
Код:
00141F50 >/$  8B4424 08     MOV EAX,DWORD PTR SS:[ESP+8]
00141F54  |.  83E8 00       SUB EAX,0                                ;  Switch (cases 0..1)
00141F57  |.  74 17         JE SHORT opengl32.00141F70
00141F59  |.  48            DEC EAX
00141F5A  |.  75 2E         JNZ SHORT opengl32.00141F8A
00141F5C  |.  A1 64BC1400   MOV EAX,DWORD PTR DS:[14BC64]            ;  Case 1 of switch 00141F54
00141F61  |.  50            PUSH EAX                                 ; /hLibModule => NULL
00141F62  |.  FF15 00701400 CALL DWORD PTR DS:[<&KERNEL32.DisableThr>; \DisableThreadLibraryCalls
00141F68  |.  E8 23220000   CALL opengl32.00144190
00141F6D  |.  C2 0C00       RET 0C
00141F70  |>  A1 64BC1400   MOV EAX,DWORD PTR DS:[14BC64]            ;  Case 0 of switch 00141F54
00141F75  |.  85C0          TEST EAX,EAX
00141F77  |.  74 11         JE SHORT opengl32.00141F8A
00141F79  |.  50            PUSH EAX                                 ; /hLibModule => NULL
00141F7A  |.  FF15 10701400 CALL DWORD PTR DS:[<&KERNEL32.FreeLibrar>; \FreeLibrary
00141F80  |.  C705 64BC1400>MOV DWORD PTR DS:[14BC64],0
00141F8A  |>  B8 01000000   MOV EAX,1                                ;  Default case of switch 00141F54
00141F8F  \.  C2 0C00       RET 0C
coNsept вне форума Ответить с цитированием
Старый 05.07.2011, 16:22   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Сюда мы перешли по прошлому вызову. Здесь получаем системную директорию и загружаем opengl32.dll, дальше получаем адреса всех функций.
Код:
00144190  /$  A1 64BC1400   MOV EAX,DWORD PTR DS:[14BC64]
00144195  |.  81EC 04010000 SUB ESP,104
0014419B  |.  85C0          TEST EAX,EAX
0014419D  |.  56            PUSH ESI
0014419E  |.  0F85 8A000000 JNZ opengl32.0014422E
001441A4  |.  53            PUSH EBX
001441A5  |.  57            PUSH EDI
001441A6  |.  68 04010000   PUSH 104                                 ; /BufSize = 104 (260.)
001441AB  |.  8D4424 10     LEA EAX,DWORD PTR SS:[ESP+10]            ; |
001441AF  |.  50            PUSH EAX                                 ; |Buffer
001441B0  |.  FF15 0C701400 CALL DWORD PTR DS:[<&KERNEL32.GetSystemD>; \GetSystemDirectoryA
001441B6  |.  83C9 FF       OR ECX,FFFFFFFF
001441B9  |.  33C0          XOR EAX,EAX
001441BB  |.  BF 40B61400   MOV EDI,opengl32.0014B640
001441C0  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
001441C2  |.  F7D1          NOT ECX
001441C4  |.  2BF9          SUB EDI,ECX
001441C6  |.  8BD9          MOV EBX,ECX
001441C8  |.  83C9 FF       OR ECX,FFFFFFFF
001441CB  |.  8BF7          MOV ESI,EDI
001441CD  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
001441D1  |.  8BFA          MOV EDI,EDX
001441D3  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
001441D5  |.  4F            DEC EDI
001441D6  |.  8BCB          MOV ECX,EBX
001441D8  |.  C1E9 02       SHR ECX,2
001441DB  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
001441DD  |.  8BCB          MOV ECX,EBX
001441DF  |.  83E1 03       AND ECX,3
001441E2  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
001441E4  |.  83C9 FF       OR ECX,FFFFFFFF
001441E7  |.  BF 30B61400   MOV EDI,opengl32.0014B630                ;  ASCII "opengl32.dll"
001441EC  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
001441EE  |.  F7D1          NOT ECX
001441F0  |.  2BF9          SUB EDI,ECX
001441F2  |.  8BD9          MOV EBX,ECX
001441F4  |.  83C9 FF       OR ECX,FFFFFFFF
001441F7  |.  8BF7          MOV ESI,EDI
001441F9  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
001441FD  |.  8BFA          MOV EDI,EDX
001441FF  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00144201  |.  8BCB          MOV ECX,EBX
00144203  |.  C1E9 02       SHR ECX,2
00144206  |.  4F            DEC EDI
00144207  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00144209  |.  8BCB          MOV ECX,EBX
0014420B  |.  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
0014420F  |.  83E1 03       AND ECX,3
00144212  |.  50            PUSH EAX                                 ; /FileName
00144213  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>; |
00144215  |.  FF15 08701400 CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; \LoadLibraryA
0014421B  |.  85C0          TEST EAX,EAX
0014421D  |.  5F            POP EDI
0014421E  |.  A3 64BC1400   MOV DWORD PTR DS:[14BC64],EAX
00144223  |.  5B            POP EBX
00144224  |.  75 08         JNZ SHORT opengl32.0014422E
00144226  |.  5E            POP ESI
00144227  |.  81C4 04010000 ADD ESP,104
0014422D  |.  C3            RET
0014422E  |>  8B35 04701400 MOV ESI,DWORD PTR DS:[<&KERNEL32.GetProc>;  kernel32.GetProcAddress
00144234  |.  68 28B61400   PUSH opengl32.0014B628                   ; /ProcNameOrOrdinal = "glAccum"
00144239  |.  50            PUSH EAX                                 ; |hModule
0014423A  |.  FFD6          CALL ESI                                 ; \GetProcAddress
...
Идея с импортом мне понравилась, потому что это как я понял дает возможность использовать функции без перехвата, что как раз очень, очень удобно в моем случае.
Импортить в ручную каждую функцию довольно не удобно, поэтому как мне кажется должен быть другой вариант импорта.
Не очень хочется писать кучу функций в ручную, собственно вот и вопрос, как импортнуть все функции в мою .dll?
Спасибо за ранее за любой толчок.
coNsept вне форума Ответить с цитированием
Старый 05.07.2011, 16:40   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

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

> как импортнуть все функции в мою .dll?

если нет хидера, то никак
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 16:47   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
если нет хидера, то никак
руками блин.
для статического испорта нужен еще и либ файл.

кстати, а чем вам не подходит статическая линковка на нужные вам функции?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2011, 17:00   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вопрос ведь был о списке всех экспортируемых функций из dll и их адресов, а не о линковке.
А что PE формат не прочитать? IMAGE_EXPORT_DIRECTORY
EUGY вне форума Ответить с цитированием
Старый 05.07.2011, 17:01   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Статической линковкой при использование какой либо gl функции, программа просто напросто вылетает. Поэтому я и решил попробовать динамически слинковать и посмотреть что с этого выйдет.

EUGY интересный вариант, спасибо за подсказку. (Не буду против если дашь и материал по поводу)
coNsept вне форума Ответить с цитированием
Старый 05.07.2011, 17:06   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Информации море, трудно что-то конкретное посоветовать.
Но в первую очередь Debug Help Library, Image Help Library в MSDN
EUGY вне форума Ответить с цитированием
Старый 05.07.2011, 17:12   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> руками блин.

головой, блин )
понятно, что руками, вопрос-то был: "Не очень хочется писать кучу функций в ручную..."

> IMAGE_EXPORT_DIRECTORY

это, конечно, классно, а где брать описание параметров и их типов?

Хотя для OpenGL проблем вобще быть не должно, там же все хидеры либы и прочие радости доступны в неограниченном количестве. В чём вобще проблема не ясно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 17:13   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Уже все ясно, спасибо большое за помощь.
coNsept вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
import dll c++ kaljan775 Помощь студентам 2 23.01.2011 18:52
import Java Syltan Общие вопросы по Java, Java SE, Kotlin 0 15.06.2010 17:54
@import Syltan HTML и CSS 1 15.04.2010 22:59
ощибка в import Yurka Общие вопросы по Java, Java SE, Kotlin 1 11.12.2008 14:20
import из excel Toxa Общие вопросы Delphi 2 25.03.2007 19:53