Здравствуйте, Indy, Вы писали:
I>Я не говорил что не нравится, а спросил по реализации. Отличить данные от кода это не решённая и актуальная задача. Без релоков нельзя даже быть уверенным что ссылка это ссылка, а не константа.
Евгений, уже сказал, что это библиотека сделана ровно в том объеме который был нужен мне. Да и я уже говорил, что мне надо было решить задачу вычленения функционала очень объемного драйвера режима ЯДРА и подключения этого функционала к своему драйверу.
Кстати именно по этому этот проект и называется makelib. То есть из чужого бинарника мне надо было сделать библиотеку которую я должен был использовать в своем драйвере. Но затем оказалось проще не делать промежуточную библиотеку (DLL) а сразу делать итоговый драйвер. И именно по этому, результирующий субпроект в проекте MAKELIB называется imagemerge2.
Чтобы было проще понять как оно работает, а мне показалось что из интересующихся не все поняли это, я расскажу пару слов.
Итак — есть проект "библиотека" ImageLib есть проект "исполняемый" ImageMerge2, и есть два демотестовых проекта — TestExe и TestEject.
ImageLib это некий движок чем-то отдаленно напоминающий IDA он умеет загружать образы и ВЫГРУЖАТЬ образы, а также умеет манипулировать внутренностями бинарников. Например добавить/удалить/перечислить релоки, добавить/удалить/перечислить секции, добавить/удалить/перечислить экспорты, добавить/удалить/перечислить импорты, поменять виртуальный адрес секции, и прочее/прочее там дохрена всего.
С помощью этой библиотеки можно сделать перемещение кода функции из одной секции в другую, но это уже надо делать в своем коде, нет таких функций в этой библиотеке. Но зато есть пример ImageMerge2 в котором это все делается. И сделать это очень просто.
ImageMerge2 это субпроект который с помощью библиотеки ImageLib как раз объединяет два екзешника. Один используется как базовый второй как инжектируемый, НО тут это слово не совсем верное. Так как ничего не инжектируется а как раз таки просто объединяется.
Этот "пример" берет два екзешника и объединяет их один выходной. В том который называется инжектируемый в нем можно _задавать_ с помощью макросов функции которые будут или заменены в базовом либо которые будут вызваны в базовом.
TestExe — это демотест который симулирует базовый образ. Его код вы можете менять по своему усмотрению
TestEject — это демотест котррый симулирует использование кода базового екзешника и использование макросов.
Все это подается на вход ImageMerge2 который производит выходной экзешник запустив который вы увидите результаты на экране.
==
Что же касается определения данных и кода, и того что все делает дизасемблер... Ну что тут сказать — вы понимаете что такое дизасемблер? Расскажу на всякий случай — это просто программа которая генерирует аcсемблерный листинг, программа которая парсит машинные команды. Я его использовал только для того чтобы не писать самому. Чтобы сэкономить время. Этих дизасемблеров как грязи. ))
То есть как определяется код от данных решает анализатор кода, и ВЫ(!!!) вы сами используя эту библиотеку можете запустить анализ на данные если считаете что это код или на оборот.