Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

*.exe -> *.dll, или как еще вытащить функцию из *.exe

842
31 января 2009 года
sigmov
301 / / 16.09.2008
Проблема следующая - очень хочется вытащить функцию из *.exe файла, которая возможно там есть.
И встает 2 вопроса:
1) Как увидеть имена и параметры функции в *.exe файле[ для dll использую depends.exe] ?
2) Как преобразовать exe файл в dll или каким-то иным образом извлечь функцию ?
342
31 января 2009 года
Yos
209 / / 21.06.2003
1) сейчас уже не помню, но посмотрю, когда на работу выйду :)
2) EXE ничем особ не отличается от DLL и чтобы использовать функцию необходимо: она должна быть объявлена как EXPORT в самом EXE; потом делаем LoadLibrary и GetProcAddress и пользуемся на здоровье...
3
01 февраля 2009 года
Green
4.8K / / 20.01.2000
Что значит "извлечь функцию"?

EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.
842
01 февраля 2009 года
sigmov
301 / / 16.09.2008
Цитата: Green
EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить EXE, как DLL, необходимы три вещи:
1. Необходимо поставить соотв. флаг в PE-заголовке, что это DLL. Только тогда разрешится таблица импорта и секция релокаций.
2. Необходимо обнулить адрес EntryPoint, чтобы после загрузки управление не туда передалось.
3. EXE либо должен иметь таблицу релокаций, либо быть загружен по базовому адресу, что может быть затруднительным.



Что-то подобное я и предполагал. Но мне еще бы очень хотелось инструкцию о том, как это сделать, используя допустим IDA pro.

46K
01 февраля 2009 года
r9m
9 / / 01.02.2009
Если есть познания в ассемблере то почему бы и нет? Запускай иду, в режиме отладки ищи свою функцию, которую хочешь выловить, попутно анализируя, что она принимает и возвращает (стек). Именно на этом моменте расходуется больше всего времени. Как только чувствуешь, что что то нашол, пиши для себя комментарий! (очень полезно). Также, переименовывай метки в удобочитаемые, если таковые имеются в процедуре, которую нужно рипать, благо ида это позволяет. Как только осознал, что куда передаётся и что собственно процедура делает, выделяй нужный код, жми alt+f10 и сохраняй сорец. После неоднократной обработки и огранки напильником, можешь подцеплять его в свой проект.

Кстати, как отладчик IDA не очень одобна. Присмотрись к OllyDbg. Так же обрати внимание на HexRays, это декомпилятор, который может облегчить тебе твой труд

Decompilation gets real
И еще немного
Начато бета-тестирование декомпилятора Hex-Rays
Небольшой мануал
342
01 февраля 2009 года
Yos
209 / / 21.06.2003
Цитата:
EXE не загрузится, как DLL с помощью LoadLibrary.
Для того, чтобы загрузить 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) экспортируемая - и все замечательно работает.
Я подобным очень часто пользуюсь. Но для этого надо знать что экспортируется.
3
01 февраля 2009 года
Green
4.8K / / 20.01.2000
Цитата: Yos

MSDN еще никто не отменял


А при чем тут MSDN ?
Приведи конкретную цитату из MSDN, которая противоречит моим высказываниям.
Или ты просто решил меня напугать этим словом? :D

С каким из приведенных мною пунктов ты не согласен?

Цитата: Yos

Вот мой простой (проверенный) исходник который загружает EXE модуль
и все замечательно работает.


Твой "простой (проверенный) исходник" настолько прост, что ничего не доказывает.
Код возвращает константное целочисленное значение. Он не использует IAT, не обращается к данным по абсолютным адресам.

Для ДЕЙСТВИТЕЛЬНО ПОКАЗАТЕЛЬНОГО ТЕСТА попробуй вернуть данные из секции данных и/или результат вызова импортируемой ф-ции, например GetLastError.

Цитата: Yos

Я подобным очень часто пользуюсь.
(то чем реально пользуюсь сейчас выложить не могу - все на работе)


Советую перелопатить свой код (а особенно на работе), где ты "очень часто пользуешься" подобной нелепостью.
И учи матчасть, стыдно не знать элементарных вещей про PE-loader.

46K
01 февраля 2009 года
r9m
9 / / 01.02.2009
Green

Да ладно, чё ты на него так взьелся? Он вроде и не говорил что ты не прав )) А так резко на людей не нужно кидаться. Всегда в мире найдётся человек, который делает что-то лучше тебя (с) Homer Simpson. Я вот не понимаю таких людей, ну если чел не прав - обьясни ему, покажи в чём он не прав, научи как правильно. А матчасть каждый может посылать учить ;)
355
01 февраля 2009 года
<SCORP>
786 / / 21.10.2006
Цитата: r9m
обьясни ему, покажи в чём он не прав, научи как правильно. А матчасть каждый может посылать учить ;)



он жеж и учит. в данном конкретном случае матчасть - это то, чего "челу" не хватает.
понятно, что послать может каждый. но не каждого есть смысл посылать

3
01 февраля 2009 года
Green
4.8K / / 20.01.2000
Цитата: r9m

Да ладно, чё ты на него так взьелся?
А так резко на людей не нужно кидаться.


Я не взъелся и не кидался, но и не сюсюкался.

Цитата: r9m

Я вот не понимаю таких людей, ну если чел не прав - обьясни ему, покажи в чём он не прав, научи как правильно. А матчасть каждый может посылать учить ;)


В чем он не прав показал, объяснять и учить я не нанимался.
Голова есть, сам обучится, благо, направление задано.

P.S. Обсуждение того, как я должен был что-то сказать, и пр. нравоучения пишите в общий раздел форума. Будет время и желание, прочту и исправлюсь.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог