Сейчас на форуме: vsv1, Alf (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Подключение dll в исполняемый exe, редактируя таблицу импорта
Посл.ответ Сообщение

Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 октября 2015 00:02 · Поправил: Sunchey
· Личное сообщение · #1

Здравствуйте.

Наткнулся на статью Криса Касперски (https://www.evilfingers.com/publications/research_RU/dllmain.pdf), где он инжектит dll-ку следущего содержания:

Code:
  1. #include <stdio.h>
  2. #include <windows.h>
  3. // создаем фиктивную экспортируемую функцию,
  4. // которую потом будет импортировать дрозофила
  5. __declspec(dllexport) int function(){ return 0;}
  6. /* точка входа в dll, получающая управление при различных обстоятельствах*/
  7. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  8. {
  9. // приветствие, выводимое до запуска дрозофилы
  10. if (fdwReason==DLL_PROCESS_ATTACH) printf("Hello, world!\n");
  11. // приветствие, выводимое перед завершением работы дрозофилы
  12. if (fdwReason==DLL_PROCESS_DETACH) printf("good-bye, world!\n");
  13. }


в обычный exe файл. Кратко говоря, добавляем в этом exe файле в таблице импорта еще одну запись о нашей библиотеке, переносим таблицу импорта (уже с новой записью об импортируемой dll) в свободное пространство, где достаточно нулей, меняем ссылку на таблицу импорта и ее размер в DATA_DIRECTORY. Все должно работать. Но не работает...
Статья старая, но пробовал переносить и редактировать таблицу импорта и в 8-ке, и в XP. В первом случае просто подвисает и предлагает завершить процесс. А в XP вылазит другая ошибка:

Code:
  1. Application Error
  2. The application failed to initialize properly (0xc0000005). Click on OK to terminate the application.


А вот у другого файла в XP, созданного другим компилятором, выводит сообщения из библиотеки, но не выводит сообщения из файла, и все равно подвисает с ошибкой:

Code:
  1. Application Error
  2. The application failed to initialize properly (0xc0000142). Click on OK to terminate the application.


Гугление по ошибкам приводит к абстрактным описаниям общих ошибок. Пробовал расширять размер секции, в которой находится таблица иморта, но никакой реакции. Причем во всех случаях функцию находит, т.к. стоит поменять ее название в исходнике библиотеки и перекомпилировать - сразу ругается, что нет такой функции.

Потому и вопрос, вроде все по инструкции, и систему взял старую, а все равно не работает.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 21 октября 2015 03:07 · Поправил: plutos
· Личное сообщение · #2

Гляньте здесь, похоже на ваш случай:
http://deshack.net/windows-how-to-solve-application-error-0xc0000142-and-0xc0000005/

-----
Give me a HANDLE and I will move the Earth.





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 21 октября 2015 12:51 · Поправил: ajax
· Личное сообщение · #3

Sunchey
по этой теме много нюансов. на вопрос в такой форме, без файлов "до-после", можно посмотреть и забыть. варианты от кривой новой таблицы до вывода dll в консоль гуевому приложению

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 октября 2015 00:48 · Поправил: Sunchey
· Личное сообщение · #4

ajax пишет:
по этой теме много нюансов. на вопрос в такой форме, без файлов "до-после", можно посмотреть и забыть. варианты от кривой новой таблицы до вывода dll в консоль гуевому приложению


Приложение самое простое консольное, просто выводит строку, код библиотеки выше, но выложу файлы до-после, а также картинку новой таблицы импорта, она выделена цветом на рисунке.

6fe8_24.10.2015_EXELAB.rU.tgz - new_import_table.jpg

Добавлено спустя 10 минут
44ec_24.10.2015_EXELAB.rU.tgz - files_1.7z

Добавлено спустя 10 минут
0f1e_24.10.2015_EXELAB.rU.tgz - files_2.7z

Добавлено спустя 15 минут
Ну и добавлю тут вместе код приложения и код библиотеки.

Приложение:
Code:
  1. #include <stdio.h>
  2. void main ()
  3. { printf ("Hello main.exe!\n"); }


Библиотека:
Code:
  1. #include <stdio.h>
  2. #include <windows.h>
  3. // создаем фиктивную экспортируемую функцию,
  4. // которую потом будет импортировать дрозофила
  5. __declspec(dllexport) int function(){ return 0;}
  6. /* точка входа в dll, получающая управление при различных обстоятельствах*/
  7. WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  8. {
  9. // приветствие, выводимое до запуска дрозофилы
  10. if (fdwReason==DLL_PROCESS_ATTACH) printf("Hello, world!\n");
  11. // приветствие, выводимое перед завершением работы дрозофилы
  12. if (fdwReason==DLL_PROCESS_DETACH) printf("good-bye, world!\n");
  13. }


Добавлено спустя 26 минут
Все это компилировалось и редактировалось в Windows XP, компилятор VS2008.
Но в итоге опять ошибка 0xc0000005.



Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 24 октября 2015 06:33
· Личное сообщение · #5

Sunchey
Вот поправленный EXE, разницу сами увидите. И еще DllMain должна возвращать TRUE, без этого не загрузится.

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

Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 октября 2015 15:07
· Личное сообщение · #6

Спасибо, одной проблемой стало меньше, теперь выводится сообщения из библиотеки, но не выводится сообщение из самого приложения =)
И завершается с ошибкой, на этот раз
The application failed to initialize properly (0xc0000142).

Как я понял, вы занулили ссылку на таблицу имен импорта (INT) и ее размер в DATA_DIRECTORY. Старая версия hiew показывает это как резервное поле, в отличие от 8 версии.
Пробовал сделать ссылку OriginalFirstThunk на эту таблицу (INT) и расширить ее размер на 8 байт, т.к. нулей после таблицы хватает, но никакого эффекта не дало. Так что сделал как у вас - занулил ссылку на это дело в DATA_DIRECTORY.

И пока не знаю что еще можно сделать...



Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 24 октября 2015 17:06
· Личное сообщение · #7

Sunchey пишет:
И завершается с ошибкой, на этот раз The application failed to initialize properly (0xc0000142).


Так ведь писал уже:
DllMain должна возвращать TRUE, без этого не загрузится.



Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 октября 2015 18:03 · Поправил: Sunchey
· Личное сообщение · #8

Про библиотеку я забыл, заработало! Спасибо за ответы
Получается, вся проблема была как раз в том, что надо было убрать Import Table как структуру DATA_DIRECTORY, заменив ссылку и размер нулями, и в возвращении TRUE из библиотеки. Причем, работоспособно и в Windows 8.

Только мне осталось непонятным, почему нельзя было одну ссылку на новую функцию из внедряемой библиотеки добавить в эту таблицу INT и увеличить размер на 8 байт. У меня там 12 байт нулей свободного пространства, хотя может это к чему-нибудь уже относилось.

И еще вопрос, аналогичное внедрение ведь возмножно и в файлах ELF в unix-системе? Чистой правкой байт в редакторе.


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


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