Я хочу знать, возможно ли «редактировать» код внутри уже скомпилированной DLL.
И.Е. представьте, что есть функция под названием sum(a,b)
внутри Math.dll
который добавляет два числа a
а также b
Допустим, я потерял исходный код моей DLL. Так что единственное, что у меня есть, это двоичный файл DLL.
Есть ли способ, которым я мог бы открыть этот двоичный файл, найти, где находится моя функция и заменить sum(a,b)
подпрограмма, например, с другой подпрограммой, которая возвращает умножение a
а также b
(вместо суммы)?
В заключение, возможно ли редактировать файлы двоичного кода?
может быть, с помощью инструментов обратного проектирования, таких как ollydbg?
Да, это определенно возможно (пока DLL не криптографически подписано), но это сложно. Вы можете сделать это с помощью простого шестнадцатеричного редактора, хотя в зависимости от размера DLL вам может потребоваться обновить множество разделов. Не пытайтесь читать необработанный двоичный файл, а просто запустите его через дизассемблер.
Внутри скомпилированного двоичного файла вы увидите множество эзотерических байтов. Все коды операций, которые обычно записываются на ассемблере в виде инструкций, таких как «вызов», «jmp» и т. Д., Будут преобразованы в зависимый байтовый эквивалент архитектуры машины. Если вы используете дизассемблер, дизассемблер заменит эти двоичные значения инструкциями по сборке, чтобы было намного легче понять, что происходит.
Внутри скомпилированного двоичного файла вы также увидите множество ссылок на жестко закодированные местоположения. Например, вместо того, чтобы видеть «call add ()», это будет «call 0xFFFFF». Значение здесь, как правило, является ссылкой на инструкцию, расположенную с определенным смещением в файле. Обычно это первая инструкция, принадлежащая вызываемой функции. В других случаях это код установки / очистки стека. Это зависит от компилятора.
Пока заменяемые инструкции имеют точно такой же размер, как и исходные инструкции, ваши смещения будут правильными, и вам не нужно будет обновлять оставшуюся часть файла. Однако, если вы измените размер заменяемых инструкций, вам нужно будет вручную обновить все ссылки на местоположения (это действительно утомительно, кстати).
Подсказка: если добавляемые вами инструкции меньше чем то, что вы заменили, вы можете дополнить остальные с помощью NOP, чтобы локации не выходили.
Надеюсь, что поможет, и счастливого взлома 🙂
Обходы, библиотека для инструментов произвольных функций Win32 на машинах x86. Обходы перехватывают функции Win32, переписывая изображения целевой функции. Пакет Detours также содержит утилиты для присоединения произвольных библиотек DLL и сегментов данных (называемых полезными нагрузками) к любому двоичному файлу Win32.
Скачать
Вы, конечно же, можете отредактировать DLL-библиотеку в соответствии с вашими пожеланиями и делать все что угодно. Но вопрос в том, зачем идти на все эти неприятности, если вы собираетесь заменить функцию для начала?
Создайте новую DLL с новый функция и изменить код, который звонки функция в старой DLL для вызова функции в новой DLL.
Или вы потеряли исходный код приложения? 😉
вам лучше использовать декомпилятор, такой как redgates .net рефлектор или реактивный декомпилятор jetbrains. Есть также открытые источники, такие как
http://www.jetbrains.com/decompiler/
Легко открывать файлы DLL при сохранении их в проекте MVisual или копировании кодов в файлы классов и cs