Как отредактировать dll-файл?
Недавно скачал чит для css, но во время игры он постоянно шлёт в чат ссылку на вк разрабов (как я понял, это из за того что это фри версия). Так вот, я хочу из этой dll-ки убрать этот текст (или хотя бы заменить на пробел), у меня даже получилось через IDA найти где эта строчка хранится. Но как мне её отредактировать и обратно скомпилировать dll-ку?
Ответы (1 шт):
Нет, нет и нет!!! Это не так делается! Вы не можете редактировать дизассемблированный текст в IDA напрямую! И тем более не выйдет рекомпилировать бинарник из дизассемблированных "исходников" - количество обязательных к исправлению ошибок, скорее всего, превысит миллион! Вместо этого вам следует отредактировать саму DLL непосредственно. Разумеется, вы можете это сделать только с согласия правообладателей этой самой DLL. Пиратство - фу, осуждаем!
Пропатчить DLL можно непосредственно силами IDA. Ниже приведу порядок действий, к которому прибегаю я сам, если требуется изменить строку в данных:
- Внимательно читаете лицензионное соглашение, чтобы убедиться в законности своих действий!
- Через любой соответствующий online-ресурс конвертируете в hex строку, на которую необходимо пропатчить строку в коде.
- В IDA устанавливаете курсор на строку в коде, которую необходимо пропатчить.
- Жмёте Edit -> Patch program -> Change byte...
- В поле Values вставляете вашу строку в виде разделённых пробелами 16-ричных байт, и жмёте OK.

- Жмёте Edit -> Patch program -> Apply patches to input file..., а затем OK.
Всё - строка в DLL изменена!
Важно: 1) патченная строка должна быть не больше по длине, чем исходная (иначе будут затёрты данные за строкой); 2) последний символ строки должен быть \0.
Если требуется отредактировать код, то действуйте аналогично: устанавливаете курсор в IDA на первую инструкцию блока, который нужно изменить, и патчите байты на необходимые машинные коды. Чтобы их получить, очень удобно воспользоваться этим online-ассемблером

Так же можно воспользоваться встроенным в IDA ассемблером, однако его функционал очень ограничен (я использую его для правки команд перехода и вызова процедуры): Edit -> Patch program -> Assemble. После правки не забыть применить патч ко входному файлу.
Важно: 1) патченный код не должен затереть собой ниже лежащие инструкции; 2) если между патченным кодом и следующей валидной инструкцией остаются мусорные байты от оригинального кода, их следует затереть инструкциями nop (код 0x90).
Важно для DLL: 1) ни в коем случае нельзя патчить инструкции, содержащие прямую адресацию (например, mov регистр,переменная) - их затирка приведёт к разрушению ralocation table и тем самым сломает DLL (такие места лучше обходить с помощью jmp, либо искать другое место для размещения патча); 2) в патченном коде следует использовать инструкции только с относительной адресацией (например, mov регистр,[регистр+смещение]), т.к. DLL может быть загружена по произвольному адресу, что сломает патчи с абсолютной адресацией.
Вот так это делается на практике, если кратко (хотя может кто-то это делает и каким-то иным способом).
И ещё раз: не делайте так, если это нарушает закон!
P.S. Редактирование бинарников (exe, dll) - процесс творческий и зачастую весьма тернистый. Например, бинарник может содержать код защиты от модификации. Как правило, это проверка CRC вкупе с шифрованием части ресурсов или других данных программы. В этом случае чтобы внести правку хотя бы в один байт, придётся изучать и править весь защитный механизм - задача для новичка в реверсинге довольно непростая. Но с другой стороны, её решение очень хорошо стимулирует работу мозга))