Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Использование функций чужой DLL
Посл.ответ Сообщение

Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 07 июня 2006 18:58
· Личное сообщение · #1

Привет всем!

Хочу написать распаковщик к одной игре. Пробовал выдирать куски нужного кода из игры - получалось очень даже неплохо... Почти раскопал всю защиту. Но столкнулся с тем, что там помимо кодирования используется какое-то самопальное сжатие. Как вы понимаете, куча CALL'ов и ничего не понятно.
Было решено заюзать DLL, отвечающую за работу с форматом файлов. Там есть интересные функции - порядка 20.
А теперь сам вопрос. Я пишу на C/C++. Как мне лучше сделать прототипы этих функций? Чтобы потом использовать их в своей программе?
Очень интересно будет посмотреть на ваши решения.

Thanx!

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 15.6 (новичок)
Активность: 0.030
Статус: Участник

Создано: 07 июня 2006 19:11
· Личное сообщение · #2

В смысле тебе надо будет запускать функции этой DLL из своей проги?



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 07 июня 2006 19:14
· Личное сообщение · #3

[norwed]
ja!

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 15.6 (новичок)
Активность: 0.030
Статус: Участник

Создано: 07 июня 2006 19:24
· Личное сообщение · #4

USELIB("имя_библиотеки");
А дальше используешь её функции с такими же именами как и в библиотеке.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 07 июня 2006 20:25 · Поправил: Tim
· Личное сообщение · #5

Что-то не так... Бился, бился, но линкер говорил unresolved external... хотя я явно задавал прототип функции сам...

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 15.6 (новичок)
Активность: 0.030
Статус: Участник

Создано: 07 июня 2006 22:25
· Личное сообщение · #6

Ты в чём бился? В VS++ или BC++?




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 08 июня 2006 00:17 · Поправил: =TS=
· Личное сообщение · #7

Tim
вот так к примеру:

...
typedef ... /*function result type*/ ... (WINAPI *tfSome) (... /* function parameters*/...);
...
tfSome fSome;
HMODULE hLib;
...
hLib=LoadLibrary(szOurDll);
if (hLib)
{
fSome=(tfSome)GetProcAddress(hLib,"Some");
if (fSome)
{
...
fSome (...); //Use fSome
...
}
}


Это пример для конвенции WINAPI

[norwed]
ИМХО, флуд не по теме...

-----
DREAMS CALL US




Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 08 июня 2006 08:22
· Личное сообщение · #8

сначала нужно сделать либу (.lib) с этой dll для этого в состав С++ Builder входит такая улитка implib.exe а потом прицепить её к проекту и вызывать функции как из свей dll только имена функций надо точно знать



Ранг: 5.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 08 июня 2006 08:56
· Личное сообщение · #9

Вообще мона использовать dll написанную на любом языке, если она использует WinAPI функции(что 99,999% так)



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 июня 2006 09:50
· Личное сообщение · #10

Для использования функций из длл нужно знать довольно много:
порядок передачи параметров (справа налево или слева направо),
метод передачи параметров (через регистры, через стек),
способ передачи параметров (по значению или по ссылке).
О порядке передачи и методе передачи смотри соглашения о вызовах:
_fastcall - параметры передаются слева направо в ECX,EDX и через стек справа налево,
_stdcall - параметры передаются справа налево через стек,
_cdecl - параметры передаются справа налево через стек.
Упомянутое WINAPI объявлено как _stdcall.



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 июня 2006 09:53
· Личное сообщение · #11

Разница между _stdcall и _cdecl заключается в том, кто отвечает за восстановление стека после вызова функции. При использовании _cdecl за восстановление стека отвечает вызывающая программа.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 08 июня 2006 10:46
· Личное сообщение · #12

BeeCrey пишет:
Для использования функций из длл нужно знать довольно много:
порядок передачи параметров (справа налево или слева направо),

Все это можно понять просматривая дизасм функций. IDA вообще по-моему это на автомате делает.
Tim пишет:
Бился, бился, но линкер говорил unresolved external... хотя я явно задавал прототип функции сам...

Все наступают на эти грабли. В Visual Studio я использовал .def файл(если память не изменяет), в Борланде не делал. Ты должен указать линкеру, что вызов будет идти через таблицу импорта, а иначе он ищет в простых библиотеках.



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 июня 2006 11:42
· Личное сообщение · #13

Tim пишет:
Бился, бился, но линкер говорил unresolved external... хотя я явно задавал прототип функции сам...

Как сказал Alexus2006, следовало сделать .lib файл с длл. Этот файл содержит символьные имена функций и переменных, экспортируемых из длл. Укажешь линкеру на этот файл и можешь вызывать функции согласно своим прототипам. Вызов будет идти через таблицу импорта.
В данном случае .def файл и .lib файл имеют одно и тоже значение. Они содержат символы, экспортируемые из длл. Мне кажется, что использовать .lib файл лучше, т.к. его можно сделать автоматически (см. пост Alexus2006).
Из поста Tim я понял, что из длл нужно 20 функций. Мне кажется довольно утомительным делать
.def файл на 20 функций. Поэтому я предпочел бы использовать implib.exe.



Ранг: 3.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 июня 2006 12:07
· Личное сообщение · #14

О DLL и работе с ними лучше всего почитать Джеффри Рихтера "Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows" 4-е издание.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 08 июня 2006 13:19
· Личное сообщение · #15

Вау! Всем спасибо!

Я пишу в Borland C++. Делал либу, привязывал с помощью макроса USELIB. Но не получилось... Такое впечатление, что он их игнорирует. Буду пробовать MSVC.

Еще раз thanx.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 08 июня 2006 13:25
· Личное сообщение · #16

Tim пишет:
Я пишу в Borland C++.
Там есть утилита для переделки длл в либ так что переделал длл и начал использовать имена функции ссылаясь на эту либу если там манглед то тогда GetProcAddress




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 08 июня 2006 13:45 · Поправил: =TS=
· Личное сообщение · #17

tundra37 пишет:
В Visual Studio я использовал .def файл

Он нужен только если ты пишешь СВОЮ dll, а для днного случая не нужен вообще

Tim пишет:
Я пишу в Borland C++. Делал либу, привязывал с помощью макроса USELIB. Но не получилось... Такое впечатление, что он их игнорирует. Буду пробовать MSVC.


Какая в каком компиляторе? Зачем юзать макросы? Я же написал РАБОЧИЙ пример.
ЗЫ. Там FreeLibrary нужно делать еще после использования всех нужых функций...

Cigan пишет:
Там есть утилита для переделки длл в либ так что переделал длл и начал использовать имена функции ссылаясь на эту либу если там манглед то тогда GetProcAddress


С манглироваными именами не сталкивался при программировании,п оэтому подтверждать или отрицать не буду

-----
DREAMS CALL US




Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 08 июня 2006 16:05
· Личное сообщение · #18

=TS= пишет:
Я же написал РАБОЧИЙ пример.

=TS= пишет:
С манглироваными именами не сталкивался при программировании,п оэтому подтверждать или отрицать не буду

Вообщем ты и написал пример когда юзаетьтся манглед импорт, но если его нет то можно создать либу с протоипами фунций и юзать прортотипы без GetProcAddress



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 08 июня 2006 17:15
· Личное сообщение · #19

Это mangled?

_SFS_GetCacheBlockSize@8
_SFS_GetCacheSize@8
_SFS_IsFile@8
_SFS_Mount@12
_SFS_MountAs@16
_SFS_MountRes@12
_SFS_Mounted@12
_SFS_SetCacheBlockSize@8
_SFS_SetCacheSize@8
_SFS_UnMount@4
_SFS_UnMountPath@4
_SFS_close@4
_SFS_errno@0
_SFS_lseek@12
_SFS_open@8
_SFS_read@12
_SFS_write@12

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 08 июня 2006 19:30 · Поправил: Cigan
· Личное сообщение · #20

Нет.
_SFS_write ->Название функции
@12 Количество параметров а имено : DWORD, : DWORD, : DWORD

Манглед выглядит так:
?ha@@YAKPAUHWND__@@PBD1@Z@12




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 08 июня 2006 19:35
· Личное сообщение · #21

Cigan пишет:
можно создать либу с протоипами фунций и юзать прортотипы без GetProcAddress

А по-моему динамическая линковка рулит...

-----
DREAMS CALL US




Ранг: 38.9 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 08 июня 2006 20:46
· Личное сообщение · #22

Вот мой вариант (Delphi) для замены результатов работы функций:
Пробовал для функций по STDCALL и cdecl


PS вроде как все нормально получалось.

Для получения списка экспортируемых функций использовал
dll2spy.exe из Kerberos




504c_08.06.2006_CRACKLAB.rU.tgz - sanctuarylib.dpr



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 ноября 2006 01:24
· Личное сообщение · #23

Timпривет, пожалусто мне нужен читак для ил2 штурмовика, я те бабки заплочу токо помоги!!! мнебы хотяб самый простой с видом, чтобы кабину отключить можно было а зделать такой мультяшный вид с прицелом! и стрелокой


 eXeL@B —› Программирование —› Использование функций чужой DLL
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати