*.exe -> *.dll, или как еще вытащить функцию из *.exe
И встает 2 вопроса:
1) Как увидеть имена и параметры функции в *.exe файле[ для dll использую depends.exe] ?
2) Как преобразовать exe файл в dll или каким-то иным образом извлечь функцию ?
2) EXE ничем особ не отличается от DLL и чтобы использовать функцию необходимо: она должна быть объявлена как EXPORT в самом EXE; потом делаем LoadLibrary и GetProcAddress и пользуемся на здоровье...
EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.
Что-то подобное я и предполагал. Но мне еще бы очень хотелось инструкцию о том, как это сделать, используя допустим IDA pro.
Кстати, как отладчик IDA не очень одобна. Присмотрись к OllyDbg. Так же обрати внимание на HexRays, это декомпилятор, который может облегчить тебе твой труд
Decompilation gets real
И еще немного
Начато бета-тестирование декомпилятора Hex-Rays
Небольшой мануал
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.
MSDN еще никто не отменял - Вот мой простой (проверенный) исходник который загружает EXE модуль (то чем реально пользуюсь сейчас выложить не могу - все на работе)
typedef DWORD (WINAPI *PExport)(void);
//*************************************************************
//*
//* Старт программы
//*
//*************************************************************
int main(int Count, char ** pArguments)
{
//****
HMODULE hExe;
PExport pExport;
//
hExe = LoadLibrary("export.exe");
if( hExe )
{
printf("EXE load\n");
pExport = (PExport)GetProcAddress(hExe,"Example");
if( pExport )
{
printf("EXE get address\n");
printf("Export function return value - %d\n",pExport());
}
//
FreeLibrary(hExe);
}
return 0;
}
А вот исходник EXE из которого импортируется функция
DWORD WINAPI Example(void)
{
return 123;
}
//*************************************************************
//*
//* Старт программы
//*
//*************************************************************
int main(int Count, char ** pArguments)
{
return 0;
}
При создании которого указывается что DWORD WINAPI Example(void) экспортируемая - и все замечательно работает.
Я подобным очень часто пользуюсь. Но для этого надо знать что экспортируется.
MSDN еще никто не отменял
А при чем тут MSDN ?
Приведи конкретную цитату из MSDN, которая противоречит моим высказываниям.
Или ты просто решил меня напугать этим словом? :D
С каким из приведенных мною пунктов ты не согласен?
Вот мой простой (проверенный) исходник который загружает EXE модуль
и все замечательно работает.
Твой "простой (проверенный) исходник" настолько прост, что ничего не доказывает.
Код возвращает константное целочисленное значение. Он не использует IAT, не обращается к данным по абсолютным адресам.
Для ДЕЙСТВИТЕЛЬНО ПОКАЗАТЕЛЬНОГО ТЕСТА попробуй вернуть данные из секции данных и/или результат вызова импортируемой ф-ции, например GetLastError.
Я подобным очень часто пользуюсь.
(то чем реально пользуюсь сейчас выложить не могу - все на работе)
Советую перелопатить свой код (а особенно на работе), где ты "очень часто пользуешься" подобной нелепостью.
И учи матчасть, стыдно не знать элементарных вещей про PE-loader.
Да ладно, чё ты на него так взьелся? Он вроде и не говорил что ты не прав )) А так резко на людей не нужно кидаться. Всегда в мире найдётся человек, который делает что-то лучше тебя (с) Homer Simpson. Я вот не понимаю таких людей, ну если чел не прав - обьясни ему, покажи в чём он не прав, научи как правильно. А матчасть каждый может посылать учить ;)
он жеж и учит. в данном конкретном случае матчасть - это то, чего "челу" не хватает.
понятно, что послать может каждый. но не каждого есть смысл посылать
Да ладно, чё ты на него так взьелся?
А так резко на людей не нужно кидаться.
Я не взъелся и не кидался, но и не сюсюкался.
Я вот не понимаю таких людей, ну если чел не прав - обьясни ему, покажи в чём он не прав, научи как правильно. А матчасть каждый может посылать учить ;)
В чем он не прав показал, объяснять и учить я не нанимался.
Голова есть, сам обучится, благо, направление задано.
P.S. Обсуждение того, как я должен был что-то сказать, и пр. нравоучения пишите в общий раздел форума. Будет время и желание, прочту и исправлюсь.