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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов экспорт-й функции из exe 
:(
    Опции темы
12usver12
Дата 8.4.2010, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не могу понять почему нормально не вызывается экспортируемая функция из екзешника 
Код

#include <windows.h>
#pragma comment(linker,"/fixed:no") 
#ifndef _DEBUG
#pragma comment(linker,"/ENTRY:WinMain") 
#endif
#define Dll __declspec(dllexport) 
extern "C" Dll int ExtMess(char* tr); 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    char* rt = "hello";
    return 0;
}

int ExtMess(char* tr)
{
    MessageBoxA(0,tr,tr,0);
    return 0;
}

такой конструкцией 
Код

    char mfuck[] = "fuck";
    HMODULE hmodexe = LoadLibraryA("E:\\exe_export.exe");
    FARPROC funcmes = GetProcAddress(hmodexe,"ExtMess");
((int (__stdcall*)(char*))madr)(mfuck);
/*
    __asm
    {
        push mfuck
            call funcmes
    }
*/

в чем может быть причина ? подозреваю  что-то связанное с импортом

Это сообщение отредактировал(а) 12usver12 - 8.4.2010, 23:08
PM MAIL   Вверх
GremlinProg
Дата 9.4.2010, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(12usver12 @  9.4.2010,  00:49 Найти цитируемый пост)
в чем может быть причина ? подозреваю  что-то связанное с импортом

да, подозреваю так же
Цитата(12usver12 @  9.4.2010,  00:49 Найти цитируемый пост)
((int (__stdcall*)(char*))madr)(mfuck);

либо надо убрать __stdcall, либо указать __stdcall в ExtMess

конечно, соглашение о вызове можно выставить и в настройках проекта (по умолчанию это __cdecl),
но если это не сделано, то это наиболее очевидная ошибка





--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
12usver12
Дата 9.4.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



основная проблема как оказалось, посмотрев под отладчиком, в том что при LoadLibrary или loadLibraryExA не обрабатываются релоки и слетает на вызове эксп функции так как таблица импорта не обработалась у подгружаемого екзе 
погуглив хорошенько, наткнулся на подобную тему... оказывается, что загрузчик обрабатывает релоки только если это длл файл а у екзешника отказывается производить стандартные действия которые выполняются при loadlibrary длл 
PM MAIL   Вверх
GremlinProg
Дата 9.4.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



релоки, в смысле Base Relocations?
LoadLibrary просто не может их не обрабатывать, если грузит образ именно для исполнения


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
12usver12
Дата 9.4.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



если у файла не стоит IMAGE_FILE_DLL в File Header то они почему то не обрабатываются, в этом вся и загвоздка...
когда выполняется уже в моем процессе
Код

int ExtMess(char* tr)
{
    MessageBoxA(0,tr,tr,0);
    return 0;
}
    а именно MessageBox     - >    .... call 402008 - фиксированый адрес импорта в exe_export.exe  , который несмотря на присутсвие relocation directory не обработался , а моем процессе  402008 - по этому адрессу мусор вследствие чего происходит Access violation 
PM MAIL   Вверх
xvr
Дата 10.4.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Смотрим MSDN на LoadLibraryEx:
Цитата

If the specified module is an .exe file, static imports are not loaded; instead, the module is loaded as if DONT_RESOLVE_DLL_REFERENCES was specified. See the dwFlags parameter for more information.

Цитата

DONT_RESOLVE_DLL_REFERENCES
If this value is used, and the executable module is a DLL, the system does not call DllMain for process and thread initialization and termination. Also, the system does not load additional executable modules that are referenced by the specified module. 
Можно предположить, что если referenced modules не загружаются, то и ссылки на них не разрешаются (даже если эти modules уже загруженны). Т.е. MessageBoxA в exe будет смотреть 'в никуда'  smile 
И вообще, попытка что то исполнить из exe, загруженного куда то, выглядит очень и очень подозрительно ненадежно. Встроенной функциональности LoadLibrary для обеспечения этого явно недостаточно  smile 

PM MAIL   Вверх
12usver12
Дата 10.4.2010, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



мне кажется что функциональности LoadLibrary с головой предостаточно , ну просто не хочет с екзешником заморачиваться и все... Когда-то игрался с кодом который является аналогом лоадлабрари, ручная обработка импортов релоков атрибутов секци и т.д. грузились как длл так и екзе..., ведь отличий по сути очень мало
пробовал вручную трасировать LoadLibraryEwW -> LdrLoadDll  на предмет проверки PE dll/exe, но к сожаленью асм не могу читать как открытую книгу  smile    

PM MAIL   Вверх
xvr
Дата 11.4.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(12usver12 @  10.4.2010,  22:37 Найти цитируемый пост)
мне кажется что функциональности LoadLibrary с головой предостаточно
Если мои предположения из предыдущего поста верные, то функциональность LoadLibrary по отношению к exe заключается в его загрузке в память, т.е. практически голый fread (точнее мэпирование файла в память, но для функциональности разницы нет). Ну еще секция экспорта символов обрабатывается, что бы GetProcAddress работал. Для получения исполняемого кода в памяти этого недостаточно
Цитата

Когда-то игрался с кодом который является аналогом лоадлабрари, ручная обработка импортов релоков атрибутов секци
Вот именно этого LoadLibrary для exe и не делает

Посмотрел в сорцы загрузчика - он явно проверяет на тип загружаемого имаджа (dll/не dll), и если грузится не dll то обработка секций импорта и релокаций явно блокируется.
Загрузчик находится в ядре и в user space (в ntdll.dll функции Ldr*)

PM MAIL   Вверх
ИванМ
Дата 11.4.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У exe слово по смещению 12h от начала COFF File Header'а обычно 010Fh / 0107h, у dll 2xxxh. Можно попробовать его изменить на нужное и потом уже работать с ним.
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.1608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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