Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспорт функций из exe 
V
    Опции темы
insider92
Дата 23.2.2010, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.4.2008

Репутация: нет
Всего: нет



В общем, прошу извинить заранее, я во всем этом не очень разбираюсь.

Вступление:
Все знают, что в exe можно встроить интерпретатор Lua. Только, в большинстве случаев, сам интерпретатор находится в lua.dll, а программа лишь экспортирует функции из нее.
При запуске exe библиотека lua.dll грузится в память, при подключении C++-модуля внутри Lua скрипта он так же юзает фукции уже загруженной в память lua.dll

Теперь мой случай:
Есть exe со встроенным в него Lua-интерпретатором (писан не мной, исходников нет). Но никаких lua.dll, все нужные функции внутри самого exe. Необходимо внутри скрипта подключить C++-модуль. Т.к. модуль скомпилирован под использование lua.dll, то он, естественно, не загружается, ругаясь на ее отсутствие. Если просто подсунуть ему lua.dll, то он загрузится, но нормальная работа при этом невозможна. Т.к. основной скрипт будет выполняться в контексте exe, а модуль в контексте lua.dll. Т.е. функционал модуля по-прежнему недоступен для использования.

Что я хочу:
Подменить как-нибудь IAT модуля, чтобы он вместо вызова функций из lua.dll вызывал их из моего exe. Но нужен какой-нибудь немуторный способ, т.е. чтобы не сопоставлять руками каждую функцию и перебивать их адреса в HEX'е.

Либо, я тут рядом прочитал, что функции в exe можно сделать экспортируемыми. Если это возможно без исходников, то сделать нужные функции экспортируемыми, затем сгенерировать для них .lib и подсунуть его модулю на стадии компиляции.

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

Благодарю за внимание!
PM MAIL   Вверх
GoldFinch
Дата 23.2.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



ох ща возможно будут крики про незаконную декомпиляцию программ...
хотя работа с заголовком программы - это не декомпиляция.
а декомпиляция бесплатного кроссплатформенного lua - это вполне себе законно
----------------------------------------------------------------------------------------------------


Здесь может возникнуть принципиальная проблема - Lua линковался к .exe статически, и часть функций которая в .exe может отсутствовать вообще. Скорей всего так и будет, т.к. функции для работы внешних модулей скорей всего .exe не нужны.

В этом случае, наиболее естественным решением будет заставить .exe использовать Lua из lua.dll, а не встроенный.
Однако это может оказаться крайне трудоемкой задачей - найти в .exe все функции Lua.
Здесь скорее всего подойдет сигнатурный поиск: надо смотреть машинный код всех функций в lua.dll, и искать эти же функции в .exe
При это надо помнить, что код в .exe и в .dll обязательно будет отличаться, а именно будут отличаться все адреса, т.е. искать надо по маскам, содержащим только опкоды.
Далее, найдя все точки входа функций Lua в .exe, надо пропатчить там переходники на IAT

Подозреваю, что в этом может помочь скрипт для IDA который будет создавать сигнатуры всех экспортируемых функций lua.dll, и искать эти сигнатуры в .exe
Хотя подозреваю, что таких функций там будет не больше десятка, и возможно в .exe они все будут рядом.

Это сообщение отредактировал(а) GoldFinch - 23.2.2010, 00:56
PM MAIL ICQ   Вверх
insider92
Дата 23.2.2010, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.4.2008

Репутация: нет
Всего: нет



Цитата
Здесь может возникнуть принципиальная проблема - Lua линковался к .exe статически, и часть функций которая в .exe может отсутствовать вообще. Скорей всего так и будет, т.к. функции для работы внешних модулей скорей всего .exe не нужны.
Функции для внешних модулей там небыло, ее я перенес вручную из lua.dll и поправил адреса. Остальные вроде все есть (используются наверное). 

Допустим, у меня есть список функций, имеющихся в exe. Что мне делать дальше?
PM MAIL   Вверх
GoldFinch
Дата 23.2.2010, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



добавить Lua.dll в таблицу импорта .exe, добавить IAT с теми функциями которые есть в exe,
записать в начало каждой функции "jmp dword ptr [IAT_addr]"

тогда .exe будет использовать Lua из длл

Это сообщение отредактировал(а) GoldFinch - 23.2.2010, 01:56
PM MAIL ICQ   Вверх
insider92
Дата 23.2.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.4.2008

Репутация: нет
Всего: нет



Цитата
добавить Lua.dll в таблицу импорта .exe, добавить IAT с теми функциями которые есть в exe
Как это сделать? Есть какие-то специальные утилиты?
PM MAIL   Вверх
GoldFinch
Дата 23.2.2010, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



т.е. это будет выглядеть так:

Функция1_в_exe:
    jmp dword ptr [Функция1]
    ....

Функция2_в_exe:
    jmp dword ptr [Функция2]
    ....

ФункцияN_в_exe:
    jmp dword ptr [ФункцияN]
    ....

import_directory:
  .........
  0,0,0,rva Lua_IAT,rva aLua
  ......
  0,0,0,0,0

aLua db "LUA.DLL",0

Lua_IAT:
  Функция1 dd rva имя_Функции1
  Функция2 dd rva имя_Функции2
  ...
  ФункцияN dd rva имя_ФункцииN
  ...
  dd 0

имя_Функции1 db 0,0,"Функция1",0
имя_Функции2 db 0,0,"Функция2",0
...
имя_ФункцииN db 0,0,"ФункцияN",0
...

Добавлено через 2 минуты и 2 секунды
insider92, чем угодно сделать, хоть руками, хоть утилитами
если не знаешь как - проще руками
я наверное юзал бы фасм, но понятнее - руками

Добавлено через 3 минуты и 22 секунды
наверное, какие нить утилиты типа PETools или LordPE могут это сделать, но я никогда их для этого не юзал.

Добавлено через 9 минут и 43 секунды
кстати, надо отметить что эта тема к С++ никакого отношения не имеет.
PM MAIL ICQ   Вверх
insider92
Дата 23.2.2010, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.4.2008

Репутация: нет
Всего: нет



Хм
А как быть с теми функциями, которые lua не экспортирует? Или ничего с ними делать не стоит, т.к. они даже вызываться не будут?
Цитата
кстати, надо отметить что эта тема к С++ никакого отношения не имеет.
Прошу прощения, не знал, куда припахать...
PM MAIL   Вверх
GoldFinch
Дата 23.2.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(insider92 @  23.2.2010,  23:20 Найти цитируемый пост)
ничего с ними делать не стоит, т.к. они даже вызываться не будут?

да. 
на их месте можно разместить чтонить полезное, данные для импорта например
PM MAIL ICQ   Вверх
insider92
Дата 26.2.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.4.2008

Репутация: нет
Всего: нет



ступил

Это сообщение отредактировал(а) insider92 - 26.2.2010, 15:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.