dll-загрузчик своими руками
От: msourire  
Дата: 09.08.13 14:27
Оценка:
Добрый день!
Не уверен, что верно выбрал ветку, но всё же рискну.
Хочу попросить помощи в следующем вопросе.
Устраиваюсь на работу связанную с программированием на С и Assmbler'e.
Для этого необходимо выполнить тестовое задание:

"Написать приложение Win32, которое выводит Hello World через вызов спец функции.
Спец функция экспортируется тестовой dll (также самостоятельно написанной).
Пример экспортируемой функции

void ExportFunc(void)
{
MessageBox("Hello World");
}
Приложение должно загружать тестовую dll неявным образом, т. е. без использования функций LoadLibrary, GetProcAdreess и подобных, а также при отсутствии dll выводить сообщение об ошибке. Cделать собственную реализацию загрузчика dll."


Есть 2 вопроса:
1. что нужно знать и как подойти к написанию dll-загрузчика?
2. Его необходимо писать на С или Asm'e?

Извините за вопросы новичка. Но я пока учусь.

Спасибо.


11.08.13 23:56: Перенесено модератором из 'C/C++' — Кодт
Re: dll-загрузчик своими руками
От: xednay89 Россия  
Дата: 09.08.13 18:19
Оценка: -1
Здравствуйте, msourire, Вы писали:

M>Есть 2 вопроса:

M>1. что нужно знать и как подойти к написанию dll-загрузчика?
M>2. Его необходимо писать на С или Asm'e?

M>Извините за вопросы новичка. Но я пока учусь.


M>Спасибо.


Использование DLL в программе на Visual C++
Автор(ы):
Александр Шаргин


В статье рассматривается три способа подключения DLL к программе на Visual C++ — неявное подключение (implicit linking), явное подключение (explicit linking) и отложенная загрузка (delayed load) DLL. Для каждого способа демонстрируется использование переменной, функции и класса из подключаемой DLL. В разделе об отложенной загрузке также приводится дополнительная информация (описание обработки исключений и использования функций-ловушек).
Re[2]: dll-загрузчик своими руками
От: VladFein США  
Дата: 09.08.13 18:33
Оценка:
Здравствуйте, xednay89, Вы писали:

M>>1. что нужно знать и как подойти к написанию dll-загрузчика?


X>Использование DLL в программе на Visual C++
Автор(ы):
Александр Шаргин


В статье рассматривается три способа подключения DLL к программе на Visual C++ — неявное подключение (implicit linking), явное подключение (explicit linking) и отложенная загрузка (delayed load) DLL. Для каждого способа демонстрируется использование переменной, функции и класса из подключаемой DLL. В разделе об отложенной загрузке также приводится дополнительная информация (описание обработки исключений и использования функций-ловушек).


Эта статья не рассказывает как написать dll-загрузчик.
Re: dll-загрузчик своими руками
От: rg45 СССР  
Дата: 09.08.13 19:42
Оценка: 2 (1)
Здравствуйте, msourire, Вы писали:

M>Добрый день!

M>Не уверен, что верно выбрал ветку, но всё же рискну.
M>Хочу попросить помощи в следующем вопросе.
M>Устраиваюсь на работу связанную с программированием на С и Assmbler'e.
M>Для этого необходимо выполнить тестовое задание:

M>"Написать приложение Win32, которое выводит Hello World через вызов спец функции.

M>Спец функция экспортируется тестовой dll (также самостоятельно написанной).

M>Приложение должно загружать тестовую dll неявным образом, т. е. без использования функций LoadLibrary, GetProcAdreess и подобных, а также при отсутствии dll выводить сообщение об ошибке. Cделать собственную реализацию загрузчика dll."


M>Есть 2 вопроса:

M>1. что нужно знать и как подойти к написанию dll-загрузчика?
M>2. Его необходимо писать на С или Asm'e?


Начни с прочтения этих статей:

Загрузчик PE-файлов
Автор(ы): Максим М. Гумеров
Дата: 20.03.2003
Не вдаваясь в подробности, скажу лишь, что исследование было начато ради сокрытия использования программой на Delphi некоей DLL (написанной на VC++). То есть оператор видит один только Exe-файл, запускает его, а тот каким-то образом подключает функции, содержащиеся изначально (при компиляции проекта) в некоторой DLL.
.
Форматы РЕ и COFF объектных файлов
Автор(ы): Мэтт Питрек
Дата: 05.04.2001

В этой главе из известной книги Мэтта Питрека "Секреты системного программирования в Windows 95" даётся исчерпывающее описание форматов PE и COFF, принятых в качестве стандарта в системах Windows фирмы Microsoft.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: dll-загрузчик своими руками
От: msourire  
Дата: 10.08.13 01:47
Оценка:
Благодарю всех!
Re: dll-загрузчик своими руками
От: Kubyshev Andrey  
Дата: 10.08.13 16:03
Оценка:
Это не похоже на тестовое задание.
Это задание нетривиально. Этому нигде не учат, только через чтение-мучение.
Re[2]: dll-загрузчик своими руками
От: nen777w  
Дата: 10.08.13 21:39
Оценка:
KA>Это не похоже на тестовое задание.
KA>Это задание нетривиально. Этому нигде не учат, только через чтение-мучение.

Это обычное задание для компании занимающейся к примеру безопасностью или антивирусной компании или наоборот компании которая занимается написанием (вирусов/пакеров и т.п.)
Например когда я делал ТЗ для ESET (кстати наиболее интересное из всех что приходилось делать) мне просто дали экзечину
у которой было два поля Имя и Ключ и кнопка Check.
Cказали что на выходе должен быть алгоритм который геерирует по имени правильный ключ, что бы проверка прошла.
На деле там внутрях оказалась целая виртуальная машина со специфическим набором инструкций, которую пришлось разложить по кирпичикам, что бы еще
потом разобраться в алгоритме который там использовался для проверки соответсвия имени и ключа и написать обратный ему генератор.
На все про все ушла 1-на неделя.

з.ы. 2 топикстарету:
Что за контора если не секрет?
Re[3]: dll-загрузчик своими руками
От: msourire  
Дата: 10.08.13 22:12
Оценка:
nen777w

http://hh.ua/vacancy/8160305
Re[3]: dll-загрузчик своими руками
От: Kubyshev Andrey  
Дата: 11.08.13 04:00
Оценка:
N>Это обычное задание для компании занимающейся к примеру безопасностью или антивирусной компании или наоборот компании которая занимается написанием (вирусов/пакеров и т.п.)
N>Например когда я делал ТЗ для ESET (кстати наиболее интересное из всех что приходилось делать) мне просто дали экзечину
N>у которой было два поля Имя и Ключ и кнопка Check.

Где ЕСЕТ и где эта конторка. Ну и сравни, тебе дали задание сломать, а не написать такую проверку. Это разные вещи: написать проверить знания на искусственом примере.
Re: dll-загрузчик своими руками
От: BlackEric http://black-eric.lj.ru
Дата: 13.08.13 10:04
Оценка:
Здравствуйте, msourire, Вы писали:

Речь ведь идет только о динамической линковке?

В общем, я бы начал с того, что продублировал этот пост на stackoverflow.
https://github.com/BlackEric001
Re[2]: dll-загрузчик своими руками
От: ononim  
Дата: 13.08.13 12:17
Оценка:
KA>Это не похоже на тестовое задание.
KA>Это задание нетривиально. Этому нигде не учат, только через чтение-мучение.
Дык значит им нужен человек который уже умеет это делать.
Для человека, обладающими нужными знаниями, написать РЕ лоадер для данной на руки длл-ки — не сильно большая проблема.
Как много веселых ребят, и все делают велосипед...
Re: dll-загрузчик своими руками
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 13.08.13 12:42
Оценка:
Здравствуйте, msourire, Вы писали:

M>Есть 2 вопроса:

M>1. что нужно знать и как подойти к написанию dll-загрузчика?
M>2. Его необходимо писать на С или Asm'e?

Я такое когда-то давно на Turbo Pascal такое писал

1. Нужно знать формат PE файла. Собственно говоря, по минимуму тебе надо (а) прочитать список секций (б) загрузить в память секцию кода (в) настроить адреса в секции кода используя секцию релокации (г) найти в секции экспорта необходимую функцию, привести этот указатель к нужному типу фунции, и вызвать эту функцию.
2. Знание Asm тут без надобности. Конечно, будет чуть больше понимания, если знать такую инструцию как JMP, как оно все устроено. Но код можно целиком написать на C/C++.
Re[2]: dll-загрузчик своими руками
От: ononim  
Дата: 13.08.13 13:04
Оценка:
M>Я такое когда-то давно на Turbo Pascal такое писал
M>1. Нужно знать формат PE файла. Собственно говоря, по минимуму тебе надо (а) прочитать список секций (б) загрузить в память секцию кода
А лучше попросить винду загрузить все и сразу. Просили же не пользоваться LdrLoadDll, а NtCreateSection(..SEC_IMAGE..) и NtMapViewOfSection вроде никто не запрещал

M>(в) настроить адреса в секции кода используя секцию релокации

Опять же эту грязную работу почти целиком можно свалить на LdrProcessRelocationBlock.

M>(г) найти в секции экспорта необходимую функцию, привести этот указатель к нужному типу фунции, и вызвать эту функцию.

Ну эти мелочи и самому придутся ручками делать да.
Как много веселых ребят, и все делают велосипед...
Re[3]: dll-загрузчик своими руками
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 13.08.13 13:23
Оценка:
Здравствуйте, ononim, Вы писали:

O>А лучше попросить винду загрузить все и сразу. Просили же не пользоваться LdrLoadDll, а NtCreateSection(..SEC_IMAGE..) и NtMapViewOfSection вроде никто не запрещал

без использования функций LoadLibrary, GetProcAdreess и подобных

В результате можно нарваться на долгий-долгий флейм по поводу, подобные эти функции или нет. Вообще, на мой взгляд тут скрыто ерничество, когда человек назло найдет способ формально сделать по-своему.
Re[4]: dll-загрузчик своими руками
От: ononim  
Дата: 13.08.13 13:53
Оценка:
O>>А лучше попросить винду загрузить все и сразу. Просили же не пользоваться LdrLoadDll, а NtCreateSection(..SEC_IMAGE..) и NtMapViewOfSection вроде никто не запрещал
M>без использования функций LoadLibrary, GetProcAdreess и подобных
M>В результате можно нарваться на долгий-долгий флейм по поводу, подобные эти функции или нет. Вообще, на мой взгляд тут скрыто ерничество, когда человек назло найдет способ формально сделать по-своему.
Ну да, вопрос с подобностью очень важен. Просто очень расплывчато сформалировали задачу. Но если им прокатит NtCreateSection — почему бы и нет? Если же скажут что нам надо чтобы не стало чисто, а чтобы вы затрахались из системных сервисом обойтись одним NtReadFile'ом — то ладно, берем и дописываем. Лишней работы то мы тут ни грамма не совершим
Кстати интересно, а если вот взять и сделать виртуальную машину, не сильно крутую, но достаточную чтобы "приподнять" ntoskrnl из него и позвать оттуда NtCreateSection/NtMapViewOfSection, прокатит?
Как много веселых ребят, и все делают велосипед...
Re: dll-загрузчик своими руками
От: Свиридов Роман Россия  
Дата: 16.08.13 08:24
Оценка:
Здравствуйте, msourire, Вы писали:

[skip]

Тебе хватит вот этой книги Недокументированные возможности Windows 2000
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.