eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Вызов экспортируемой функции из exe
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Статус: Участник

Создано: 22 июля 2013 20:42 New!
Цитата · Личное сообщение · #1

Имеется exe файл собранный через gcc.
В exe файле есть такие функции:
__declspec(dllexport) int main(int argc, char *argv[])
__declspec(dllexport) int __stdcall mains(int argc, char *argv[])
__declspec(dllexport) void maint()
__declspec(dllexport) void __stdcall mainf()
И
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

Функции видно через dumpbin /EXPORTS, но вызвать их другой программой просто как из dll нельзя т.к. это не библиотека dll. Возможно ли как то вызвать одну из этих 4-х функций из другой программы?

Ранг: 617.3 (!)
Статус: Участник

Создано: 22 июля 2013 20:54 New!
Цитата · Личное сообщение · #2

А если в хидере поставить что это длл?


Ранг: 657.7 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 22 июля 2013 21:08 New!
Цитата · Личное сообщение · #3

Я почему-то всегда думал, что такое делается для обеспечения доступа к экспорту со стороны динамических библиотек. Т.е. ехе, который у вас есть, запускается. В его адресное пространство грузиться библиотека, и вот она эти экспорты может юзать, но в адресном пространстве процесса, созданного с проекции ехе. А так, чтоб в другом ехе имеющийся подгрузить как длл, то как же быть с ЕР? Даже если и есть BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) внутри ехешника, как же она получит управление? А без её вызова может и не работать.

Ранг: 112.9 (ветеран)
Статус: Участник

Создано: 22 июля 2013 21:15 · Поправил: vden New!
Цитата · Личное сообщение · #4

Как вариант загрузить свою dll в exe, например добавив в импорт, вызвать нужные функции и в конце ExitProcess. Но вообще это не всегда может сработать, зависит от требуемых функций, в моих случаях это удавалось.

Ранг: 2.0 (гость)
Статус: Участник

Создано: 22 июля 2013 21:20 New!
Цитата · Личное сообщение · #5

Мне нужно без создания процесса. Т.е. чтобы exe работал как dll.
Vovan666, в структурах exe и dll существуют принципиальные различия и так скорее всего не выйдет, но я попробую.


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 22 июля 2013 21:24 New!
Цитата · Личное сообщение · #6

Kadet89

Отличие только одно, один бит в хидере. Ну и есно прототип еп. Вот только экзе не загрузится корректно - сфейлит LdrpWalkImportDescriptor(). Посему флаг длл нужен полюбэ.

Далее экзе обычно не релокабельны, а значит будут ссылки вникуда, ежели память занята.

Ранг: 617.3 (!)
Статус: Участник

Создано: 22 июля 2013 21:26 New!
Цитата · Личное сообщение · #7

Kadet89 пишет:
Vovan666, в структурах exe и dll существуют принципиальные различия и так скорее всего не выйдет

Если в exe есть релоки, то может прокатить.

Ранг: 2.0 (гость)
Статус: Участник

Создано: 22 июля 2013 21:42 · Поправил: Kadet89 New!
Цитата · Личное сообщение · #8

Стала вылезать ошибка "dll либо не предназначен для выполнения под управлением Windows или содержит ошибку. ..." т.ч. не прокатило.

Я тут нагуглил:
One importand difference between EXE and DLL which is very hard to overcome are relocations. When EXE is loaded into memory, it can be stored on any address; but when a DLL is loaded, some addresses are already taken by the main program and previously loaded modules. Relocation Table is used to help in changing address at which DLL is loaded. But EXE file do not have the relocation table, and therefore loading it into different address may cause invalid memory references. Т.е. надо восстанавливать релоки...

Есть еще варианты?

Ранг: 112.9 (ветеран)
Статус: Участник

Создано: 22 июля 2013 22:00 · Поправил: vden New!
Цитата · Личное сообщение · #9

Какие у exe зависимости (что импортирует) ?
Размер?

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

Грубо говоря нужно чтобы exe прошел инициализацию, далее его функции можно вызывать.

Еще варианты не для новичков:

* рипать нужные функции
* делать dll из exe (на практике, на больших образах, это сложно)

Ранг: 617.3 (!)
Статус: Участник

Создано: 22 июля 2013 22:51 New!
Цитата · Личное сообщение · #10

vden пишет:
* рипать нужные функции
* делать dll из exe (на практике, на больших образах, это сложно)

* не использовать LoadLibrary, а использовать народные методы типа этого http://forum.antichat.ru/threadnav132116-1-10.html

Ранг: 377.9 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 23 июля 2013 18:22 New!
Цитата · Личное сообщение · #11

Kadet89 пишет:
Мне нужно без создания процесса. Т.е. чтобы exe работал как dll

Если я правильно понимаю, с другой стороны, вопрос в том, чтоб совместить ImageBase(0x400000) если релоков нету. Тогда имеет смысл Вашу программу, которая грузит, компильнуть с ImageBase != 0x400000 (+/- Image Size) и лоадлибрариех с флагами LOAD_LIBRARY_AS_DATAFILE или DONT_RESOLVE_DLL_REFERENCES.
Kadet89 пишет:
собранный через gcc.

Очевидно с компилятором существуют свои нюансы

Ранг: 2.0 (гость)
Статус: Участник

Создано: 23 июля 2013 20:35 New!
Цитата · Личное сообщение · #12

Вот прога со всеми необходимыми дллками http://rghost.ru/47618605 , я немного ее упростил, но могу и полную версию выложить. Грузить возможно буду из другой дллки чтобы не ковырять всё время экзешник.

Размер 418 кб, кучу либ требует ..10 штук.

Ранг: 617.3 (!)
Статус: Участник

Создано: 23 июля 2013 21:37 New!
Цитата · Личное сообщение · #13

как-то так наверное
http://rghost.ru/47620099

Ранг: 2.0 (гость)
Статус: Участник

Создано: 23 июля 2013 21:49 New!
Цитата · Личное сообщение · #14

Vovan666, а как с этим работать? Расскажите пожалуйста поподробнее

Ранг: 617.3 (!)
Статус: Участник

Создано: 23 июля 2013 21:57 New!
Цитата · Личное сообщение · #15

Kadet89
LoadEXEfromMem типа аналог LoadLibrary
GetProcAddr аналог GetProcAddress
при нажатии на ок
Code:
  1. mov eax,InputFile(SADD("prog.exe")) ;грузим файл в память
  2. invoke LoadEXEfromMem,eax,addr buffer ; грузим его как дллку
  3. Invoke GetProcAddr,eax,SADD("maint") ; ищем экспортную функу maint
  4. call eax ;выполняем maint

| Сообщение посчитали полезным: Kadet89


Ранг: 2.0 (гость)
Статус: Участник

Создано: 23 июля 2013 22:09 New!
Цитата · Личное сообщение · #16

О понял, и правда работает, большое спасибо.
Последний вопрос, а как вы собрали base.exe ?

Ранг: 617.3 (!)
Статус: Участник

Создано: 23 июля 2013 22:20 New!
Цитата · Личное сообщение · #17

Ранг: 2.0 (гость)
Статус: Участник

Создано: 25 июля 2013 21:38 · Поправил: Kadet89 New!
Цитата · Личное сообщение · #18

У меня проблема возникла, когда я меняю расширение программы prog.exe, всё перестает работать. Можно ли как то это исправить?


Ранг: 657.7 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 25 июля 2013 22:41 New!
Цитата · Личное сообщение · #19

Kadet89
Чувак, ты издеваешься?

Code:
  1. mov eax,InputFile(SADD("prog.exe")) //ну поменяй имя здесь, ну чего ты!!!

| Сообщение посчитали полезным: plutos, elch


Ранг: 2.0 (гость)
Статус: Участник

Создано: 26 июля 2013 19:16 · Поправил: Kadet89 New!
Цитата · Личное сообщение · #20

ARCHANGEL, в том и дело что я меняю в программе и у файла. Если поменять имя файла - всё нормально, но вот расширение....
Оказывается проблема была в программе.
 eXeL@B —› Вопросы новичков —› Вызов экспортируемой функции из exe

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS