Добрый день!
Не уверен, что верно выбрал ветку, но всё же рискну.
Хочу попросить помощи в следующем вопросе.
Устраиваюсь на работу связанную с программированием на С и 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++' — Кодт
Здравствуйте, msourire, Вы писали:
M>Есть 2 вопроса: M>1. что нужно знать и как подойти к написанию dll-загрузчика? M>2. Его необходимо писать на С или Asm'e?
M>Извините за вопросы новичка. Но я пока учусь.
M>Спасибо.
Здравствуйте, 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?
KA>Это не похоже на тестовое задание. KA>Это задание нетривиально. Этому нигде не учат, только через чтение-мучение.
Это обычное задание для компании занимающейся к примеру безопасностью или антивирусной компании или наоборот компании которая занимается написанием (вирусов/пакеров и т.п.)
Например когда я делал ТЗ для ESET (кстати наиболее интересное из всех что приходилось делать) мне просто дали экзечину
у которой было два поля Имя и Ключ и кнопка Check.
Cказали что на выходе должен быть алгоритм который геерирует по имени правильный ключ, что бы проверка прошла.
На деле там внутрях оказалась целая виртуальная машина со специфическим набором инструкций, которую пришлось разложить по кирпичикам, что бы еще
потом разобраться в алгоритме который там использовался для проверки соответсвия имени и ключа и написать обратный ему генератор.
На все про все ушла 1-на неделя.
з.ы. 2 топикстарету:
Что за контора если не секрет?
N>Это обычное задание для компании занимающейся к примеру безопасностью или антивирусной компании или наоборот компании которая занимается написанием (вирусов/пакеров и т.п.) N>Например когда я делал ТЗ для ESET (кстати наиболее интересное из всех что приходилось делать) мне просто дали экзечину N>у которой было два поля Имя и Ключ и кнопка Check.
Где ЕСЕТ и где эта конторка. Ну и сравни, тебе дали задание сломать, а не написать такую проверку. Это разные вещи: написать проверить знания на искусственом примере.
KA>Это не похоже на тестовое задание. KA>Это задание нетривиально. Этому нигде не учат, только через чтение-мучение.
Дык значит им нужен человек который уже умеет это делать.
Для человека, обладающими нужными знаниями, написать РЕ лоадер для данной на руки длл-ки — не сильно большая проблема.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, msourire, Вы писали:
M>Есть 2 вопроса: M>1. что нужно знать и как подойти к написанию dll-загрузчика? M>2. Его необходимо писать на С или Asm'e?
Я такое когда-то давно на Turbo Pascal такое писал
1. Нужно знать формат PE файла. Собственно говоря, по минимуму тебе надо (а) прочитать список секций (б) загрузить в память секцию кода (в) настроить адреса в секции кода используя секцию релокации (г) найти в секции экспорта необходимую функцию, привести этот указатель к нужному типу фунции, и вызвать эту функцию.
2. Знание Asm тут без надобности. Конечно, будет чуть больше понимания, если знать такую инструцию как JMP, как оно все устроено. Но код можно целиком написать на C/C++.
M>Я такое когда-то давно на Turbo Pascal такое писал M>1. Нужно знать формат PE файла. Собственно говоря, по минимуму тебе надо (а) прочитать список секций (б) загрузить в память секцию кода
А лучше попросить винду загрузить все и сразу. Просили же не пользоваться LdrLoadDll, а NtCreateSection(..SEC_IMAGE..) и NtMapViewOfSection вроде никто не запрещал
M>(в) настроить адреса в секции кода используя секцию релокации
Опять же эту грязную работу почти целиком можно свалить на LdrProcessRelocationBlock.
M>(г) найти в секции экспорта необходимую функцию, привести этот указатель к нужному типу фунции, и вызвать эту функцию.
Ну эти мелочи и самому придутся ручками делать да.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>А лучше попросить винду загрузить все и сразу. Просили же не пользоваться LdrLoadDll, а NtCreateSection(..SEC_IMAGE..) и NtMapViewOfSection вроде никто не запрещал
без использования функций LoadLibrary, GetProcAdreess и подобных
В результате можно нарваться на долгий-долгий флейм по поводу, подобные эти функции или нет. Вообще, на мой взгляд тут скрыто ерничество, когда человек назло найдет способ формально сделать по-своему.
O>>А лучше попросить винду загрузить все и сразу. Просили же не пользоваться LdrLoadDll, а NtCreateSection(..SEC_IMAGE..) и NtMapViewOfSection вроде никто не запрещал M>без использования функций LoadLibrary, GetProcAdreess и подобных M>В результате можно нарваться на долгий-долгий флейм по поводу, подобные эти функции или нет. Вообще, на мой взгляд тут скрыто ерничество, когда человек назло найдет способ формально сделать по-своему.
Ну да, вопрос с подобностью очень важен. Просто очень расплывчато сформалировали задачу. Но если им прокатит NtCreateSection — почему бы и нет? Если же скажут что нам надо чтобы не стало чисто, а чтобы вы затрахались из системных сервисом обойтись одним NtReadFile'ом — то ладно, берем и дописываем. Лишней работы то мы тут ни грамма не совершим
Кстати интересно, а если вот взять и сделать виртуальную машину, не сильно крутую, но достаточную чтобы "приподнять" ntoskrnl из него и позвать оттуда NtCreateSection/NtMapViewOfSection, прокатит?
Как много веселых ребят, и все делают велосипед...
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.