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

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

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

Создано: 22 июля 2013 20:42
· Личное сообщение · #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 (!), 677thx
Активность: 0.540
Статус: Участник

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

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

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

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

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

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

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



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

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

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

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

Kadet89

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

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



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

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

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

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



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

Создано: 22 июля 2013 21:42 · Поправил: Kadet89
· Личное сообщение · #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 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

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

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

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

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

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

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



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

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

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

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



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

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

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

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

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



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

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

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

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



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

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

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



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

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

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



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 23 июля 2013 21:57
· Личное сообщение · #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 (гость)
Активность: 0.010
Статус: Участник

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

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



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

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

--> WinASM <--



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

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

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

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

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

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


-----
Stuck to the plan, always think that we would stand up, never ran.


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

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

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

ARCHANGEL, в том и дело что я меняю в программе и у файла. Если поменять имя файла - всё нормально, но вот расширение....
Оказывается проблема была в программе.


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


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