eXeL@B —› Вопросы новичков —› Тулза для изменения строк в PE-файлах |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 01 ноября 2016 12:48 · Личное сообщение · #1 Приветствую. Мне потребовалось написать тулзу, которая будет изменять указанную пользователем строку в PE-файлах (.exe, .dll). Казалось бы, что может быть проще -- берём любой hex-редактор по вкусу, находим необходимую строку и лёгким движением руки видоизменяем её так, как требуется. Проблема заключается в том, что строку необходимо *дополнять*, а для этого нам уже вполне может не хватить отведённого под неё изначально размера (разумеется, имеется ввиду место между окончанием нашей строки и началом следующих данных). В качестве подопытного я взял утилиту nslookup.exe из официального дистрибутива Windows 8 (на всякий случай прикрепил её к данному сообщению). Для примера я решил "дополнить" строку "Non-existent domain", выводяющуюся при попытке resolve'а несуществующего домена: Default Server: UnKnown Address: 192.168.1.1 > test Server: UnKnown Address: 192.168.1.1 *** UnKnown can't find test: Non-existent domain Открываем XVI32, ищем строку, находим её по "физическому" адресу 0x1A48 (это, вроде, raw address называется, поправьте меня, если я не прав). Здорово, значит, она действительно хранится в самом PE-файле, а не во внешних файлах ресурсов. Вопроса два: - Что делать дальше? Можно, наверное, найти все ссылки на эту строку и заменить их на другой адрес, по которому мы расположим "увеличенную" версию данной строки (заранее пробежавшись по PE-файлу и обнаружив незанятое место в виде NOP'ов или 0x00). Вот только как искать эти ссылки? - Почему указанная мной строка, если верить выхлопу PE Tools, хранится в секции .data? Она очень похожа на константную строку, почему же она тогда находится не в .rdata? Может, есть готовое решение для подобной задачи, кстати? Заранее благодарю. 1c12_01.11.2016_EXELAB.rU.tgz - nslookup.exe |
|
Создано: 01 ноября 2016 12:52 · Личное сообщение · #2 |
|
Создано: 01 ноября 2016 13:09 · Личное сообщение · #3 srm60171 пишет: OgreGui При попытке открыть всё тот же nslookup.exe: "Произошла критическая ошибка! Происходит выход. Обратитесь к разработчику программного обеспечения". Добавлено спустя 4 минуты Судя по всему, он не умеет работать с x64 приложениями. 32-битный .dll-файл открылся замечательно. Проверить само изменение строки, правда, пока не успел. |
|
Создано: 01 ноября 2016 13:56 · Личное сообщение · #4 если падает, иногда помогает посбивать галки в настройках. Пусть строка по raw address = 0x11223344 Ты преобразовал raw address в RVA (PE Tools это умеет) и результат равен 0xAABBCCDD Пусть новая строка по raw address = 0x55667788 Также преобразовал в RVA и результат равен 0x9900EEFF тогда тебе надо найти в программе все последовательности байт DD CC BB AA и заменить их на FF EE 00 99 |
|
Создано: 01 ноября 2016 14:09 · Поправил: unknownproject · Личное сообщение · #5 b0r3d0m пишет: (это, вроде, raw address называется, поправьте меня, если я не прав Нет.Это называется смещением или позицией от начала файла.Понятия адрес (как такового) для объекта, который не выгружается в оперативную память для выполнения, нет.Любой файл, открытый гекс-редактором - это просто двоичный файл.Форматным исполняемым файлом с адресацией он становится только при запуске под ОС и при условии, что является таковым. Алгоритм замены будет примерно такой: 1.Получить размер строки-замены и размер оригинальной строки. 2.Отсчитать разницу между размером оригинальной строки и строкой-заменой. 3.Сместить все данные после этой строки на разницу. 4.Перезаписать строку. 5.Пересчитать размер файла и перестроить PE с правкой нужных полей. ----- TEST YOUR MIGHT | Сообщение посчитали полезным: b0r3d0m |
|
Создано: 01 ноября 2016 14:11 · Личное сообщение · #6 Спасибо за пояснение. Попробовал проследовать вашей инструкции на примере всё того же nslookup.exe из первого сообщения. srm60171 пишет: Пусть строка по raw address = 0x11223344 В моём случае строка "Non-existent domain" имеет raw address == 0x1A48. srm60171 пишет: Ты преобразовал raw address в RVA (PE Tools это умеет) и результат равен 0xAABBCCDD Открыл File Location Calculator из состава PE Tools, ввёл 1A48 в "File Offset" и получил RVA == 0x00002648. Однако попытка отыскать последовательность байт 48 26 не увенчалась успехом. Я что-то не так понял? Добавлено спустя 1 минуту unknownproject пишет: Нет.Это называется смещением или позицией от начала файла Да, уже заметил по "File Offset" в PE Tools, спасибо. Добавлено спустя 9 минут unknownproject пишет: Алгоритм замены будет примерно такой А почему бы не пойти по тому пути, который предлагает srm60171? Т.е. заменить ссылки на изменяемую строку. |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 01 ноября 2016 15:20 · Личное сообщение · #7 |
|
Создано: 01 ноября 2016 15:33 · Личное сообщение · #8 |
|
Создано: 01 ноября 2016 15:48 · Личное сообщение · #9 b0r3d0m и там же "Как локализовать строки в коде" "Как увеличить длину жестко-закодированной строки" |
|
Создано: 01 ноября 2016 16:27 · Поправил: dosprog · Личное сообщение · #10 b0r3d0m пишет: Почему весь exe? Насколько я понял, потребуется изменить лишь те байты, которые представляли предыдущий адрес изменённой строки. Так и есть. Вдобавок, в программах на паскале перед собственно строкой идёт её длина (DWORD). Ссылки могут быть как на этот DWORD, так и на саму строку. Это надо тоже учитывать. Срециализированной тулзы для этой цели нет, да и быть не может. Сегодня вот тут пытались агрессивно рекламировать такую себе "bin ninja", вот пускай разобравшиеся расскажут, как в ней сделать такое. | Сообщение посчитали полезным: b0r3d0m |
|
Создано: 01 ноября 2016 16:41 · Личное сообщение · #11 dosprog пишет: Так и есть Так вы тоже согласны с тем, что поменять адрес строки проще, чем изменять PE header? Кстати, судя по тому, что я вижу, ссылки на строку представляют собой не RVA, а VA, как говорил srm60171 вот в dosprog пишет: Вдобавок, в программах на паскале перед собственно строкой идёт её длина (DWORD) Интересуют только незащищённые программы на C++, компилируемые MSVC. Добавлено спустя 6 минут LinXP пишет: Radialix + ida Спасибо за совет, гляну. Жаль, command line интерфейса нет, так бы написал свою небольшую обёртку для конкретно нашего использования. |
|
Создано: 01 ноября 2016 17:03 · Поправил: LinXP · Личное сообщение · #12 b0r3d0m пишет: Интересуют только незащищённые программы на C++, компилируемые MSVC 74c8_01.11.2016_EXELAB.rU.tgz - nslookup_test.rar |
|
Создано: 01 ноября 2016 17:08 · Личное сообщение · #13 LinXP пишет: тогда ida не понадобится, попробуй, изменил строку "Non-existent domain" А что именно вы сделали? Оригинальная строка, судя по XVI32, осталась прежней. Вы поместили видоизменённую строку в другое место и поменяли ссылки на неё в секции .text? fc /b слишком большой дифф показывает, из него не совсем понятны изменения. |
|
Создано: 01 ноября 2016 17:31 · Личное сообщение · #14 |
|
Создано: 01 ноября 2016 17:34 · Личное сообщение · #15 |
|
Создано: 01 ноября 2016 17:46 · Личное сообщение · #16 |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 01 ноября 2016 17:49 · Личное сообщение · #17 b0r3d0m пишет: Почему весь exe? Насколько я понял, потребуется изменить лишь те байты, которые представляли предыдущий адрес изменённой строки. почти весь, если придерживаться вот этого алго: unknownproject пишет: 1.Получить размер строки-замены и размер оригинальной строки. 2.Отсчитать разницу между размером оригинальной строки и строкой-заменой. 3.Сместить все данные после этой строки на разницу. 4.Перезаписать строку. 5.Пересчитать размер файла и перестроить PE с правкой нужных полей. судя по этому, человек предлагает перезаписывать старую строку новой, предварительно увеличив размер файла на разницу строк. Если я всё правильно понял, то остальные данные съедут вперёд (ну либо назад), из-за этого загадим ссылки на другие строки, а если строка будет находиться в секции кода, тогда съедет и он, в таком случае фикс релоков только самое малое, что нужно будет сделать. dosprog пишет: Сегодня вот тут пытались агрессивно рекламировать такую себе "bin ninja", вот пускай разобравшиеся расскажут, как в ней сделать такое. размер очень влияет на функционал проги. впредь никогда не буду качать софт весом больше метра. ты меня вдохновил, учитель, пишу из дос. |
|
Создано: 01 ноября 2016 17:55 · Поправил: b0r3d0m · Личное сообщение · #18 MasterSoft пишет: почти весь, если придерживаться вот этого алго Упомянутый вами алгоритм действительно потребует перестроить почти весь исполняемый файл. Я же говорил про алгоритм, указанный И да, остались непонятыми два момента: - В секции .text ссылки на данные из секций .data / .rdata хранятся в виде RVA или VA? Всё в том же - Куда лучше всего помещать свои собственные "увеличенные" строки? В какую именно секцию? Имеет ли это вообще какое-то значение? |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 01 ноября 2016 18:06 · Поправил: MasterSoft · Личное сообщение · #19 b0r3d0m пишет: - Куда лучше всего помещать свои собственные "увеличенные" строки? В какую именно секцию? Имеет ли это вообще какое-то значение? убедиться, что в конце файла нет оверлея. создать новую секцию, поставить ей нужные права. пихать в неё новые строки, потом всё так как говорил srm60171 b0r3d0m пишет: - В секции .text ссылки на данные из секций .data / .rdata хранятся в виде RVA или VA? Всё в том же алгоритме srm60171 говорил про RVA, но на практике получается, что необходимо изменять всё же VA. тот же OgreGui кажется умеет искать и VA и RVA ссылки. Если заглянуть в хэлп: Что такое RVA и VA? Это способ указания адреса для некоторого блока данных, процедуры, текстовых данных, таблицы и т.д. Обычно используются для этого виртуальные адреса (VA). В системных областях программы используются относительные виртуальные адреса (RVA) - они указывают на ресурсы, таблицы импорта, экспорта и т.д. |
|
Создано: 01 ноября 2016 18:11 · Личное сообщение · #20 MasterSoft пишет: убедиться, что в конце файла нет оверлея. создать новую секцию, поставить ей нужные права А почему именно так? Что плохого в помещении обновлённой строки в одну из существующих секций? MasterSoft пишет: тот же OgreGui кажется умеет искать и VA и RVA ссылки Блин, т.е. в бинарнике могут встретиться и VA, и RVA ссылки на одну и ту же строку? Если да, то зачем так делают? |
|
Создано: 01 ноября 2016 18:29 · Поправил: dosprog · Личное сообщение · #21 b0r3d0m пишет: А почему именно так? Что плохого в помещении обновлённой строки в одну из существующих секций? Да ничего плохого нету. Если найти пространство. А его может и не быть. Тогда придётся добавлять секцию, как тут писали выше. Адреса в виде RVA обычно не встречаются. Компилятор для данных в программе генерирует смещения VA. MasterSoft пишет: размер очень влияет на функционал проги. впредь никогда не буду качать софт весом больше метра. ты меня вдохновил, учитель, пишу из дос. ) Слушай, не начинай, а? Размер не влияет на функционал, но размер при сходном функционале часто является показателем, как сопутствующий фактор. А что до ниньзи - так пускай бы энтузиасты и рассказали, как в ней проделать требуемый поиск и замены строк. Это было бы вполне уместно. |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 01 ноября 2016 18:30 · Поправил: MasterSoft · Личное сообщение · #22 b0r3d0m пишет: А почему именно так? Что плохого в помещении обновлённой строки в одну из существующих секций? не обязательно свободное место в конце секции для выравнивания и не обязательно в секции с данными только данные для чтения. нули могут быть под какой-то буфер и в итоге строку твою кто-то перезапишет. К тому же, что делать, когда свободное место кончиться, а переводить ещё много - всё-равно придётся лепить новую секцию. VA ищи. dosprog пишет: Слушай, не начинай, а? сорян, не удержался, я не со зла. |
|
Создано: 01 ноября 2016 18:39 · Личное сообщение · #23 dosprog пишет: Если найти пространство Да, разумеется, с учётом достаточного кол-ва свободного места. MasterSoft пишет: не обязательно свободное место в конце секции для выравнивания Это да, согласен. MasterSoft пишет: нули могут быть под какой-то буфер и в итоге строку твою кто-то перезапишет Это верно, но разве кто-то в реальных проектах пишет в секцию с данными? Компилятор такое без лишних ухищрений может сгенерить? Звучит просто скорее как исключение из правила, нежели правило, причём только в тех случаях, если разработчик явно сам того захотел. MasterSoft пишет: К тому же, что делать, когда свободное место кончиться, а переводить ещё много - всё-равно придётся лепить новую секцию Мне всего одну строку видоизменить надо в каждом PE-файле, так что не думаю, что это будет проблемой. В крайнем случае выведу ошибку и предложу написать мне, чтобы разрешить этот вопрос. MasterSoft пишет: VA ищи RVA на данные из .data / .rdata не встречаются или просто настолько редки, что на них можно забить? ===================== Кстати, File Location Calculator из PE Tools не умеет работать с 64-битными адресами? Выглядит так, по крайней мере. |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 01 ноября 2016 19:10 · Личное сообщение · #24 b0r3d0m пишет: Кстати, File Location Calculator из PE Tools не умеет работать с 64-битными адресами? Выглядит так, по крайней мере. возьми Добавлено спустя 0 минут b0r3d0m пишет: RVA на данные из .data / .rdata не встречаются или просто настолько редки, что на них можно забить? dosprog пишет: Адреса в виде RVA обычно не встречаются. Компилятор для данных в программе генерирует смещения VA. Добавлено спустя 6 минут b0r3d0m пишет: Это верно, но разве кто-то в реальных проектах пишет в секцию с данными? Компилятор такое без лишних ухищрений может сгенерить? Звучит просто скорее как исключение из правила, нежели правило, причём только в тех случаях, если разработчик явно сам того захотел. я бы не стал доверять кодерам, да и компиляторам тоже бы не стал. | Сообщение посчитали полезным: b0r3d0m |
|
Создано: 01 ноября 2016 20:31 · Поправил: difexacaw · Личное сообщение · #25 Давайте проанализим. Есть регион памяти(без разницы содержимое) и нам необходимо этот регион расширить. Есно он будет перекрываться с другим, за пределами исходного размера. Изменить данные за пределами исходного размера нельзя. Поэтому решение должно быть основано не на содержании, а на выборке данных. Тоесть нужно изменить ссылку на данные. Найти ссылку на целевой блок памяти и изменить её. A. Изменить ссылку в модуле, прежде как то найти её. Это статический анализ, который разворачивается далее в виде очень сложной задачи(если нет прямой ссылки в виде фиксапа). Необходим полный анализ модуля или его рекомпиляция в общем случае, что сделать автоматикой невозможно(без ошибок). B. Отследить выборку данных по ссылке, это динамика. Возможны разные решения, это софтверный останов(эмуляция), хардверный останов в разных вариантах. ----- vx |
|
Создано: 01 ноября 2016 23:21 · Личное сообщение · #26 b0r3d0m пишет: Кстати, File Location Calculator из PE Tools не умеет работать с 64-битными адресами? Выглядит так, по крайней мере. В |
|
Создано: 01 ноября 2016 23:30 · Личное сообщение · #27 MasterSoft пишет: возьми это Спасибо, не знал, что там Address Converter есть! difexacaw пишет: A. Изменить ссылку в модуле, прежде как то найти её. Это статический анализ, который разворачивается далее в виде очень сложной задачи А что сложного? Я думал, что достаточно вычислить VA / RVA и найти обращение к соответствующему адресу в секции .text. Из подводных камней разве что тот факт, что в .text может происходить обращение не напрямую к этому адресу, а к вычисленному при помощи адресной арифметики. Вы это и имели ввиду или я что-то ещё упустил? ========================================= А такой вопрос... Как оказалось, строка "Non-existent domain" из nslookup.exe находится в секции .text: Спрашивается, как так-то? Что она делает в секции, которая, в общем-то, предназначена для исполняемого кода? |
|
Создано: 02 ноября 2016 04:27 · Личное сообщение · #28 |
|
Создано: 02 ноября 2016 05:16 · Поправил: dosprog · Личное сообщение · #29 |
|
Создано: 02 ноября 2016 05:39 · Личное сообщение · #30 dosprog пишет: вот пускай разобравшиеся расскажут, как в ней сделать такое. как полыхает, идите на работу к Маску, ему как раз пригодится ракетный двигатель. в хуюве даже секцию нельзя добавить, мощь. difexacaw пишет: Возможны разные решения В данном случае решения нет, автоматика невозможна, взять толстое приложение, например chrome или firefox, после подобных манипуляций придет пушной зверек, ибо помимо того, что гадят в секцию кода, так еще и арифметика со всякими там указателями, пройтись по всем ветвлениям затруднительно. |
. 1 . 2 . >> |
eXeL@B —› Вопросы новичков —› Тулза для изменения строк в PE-файлах |