Сейчас на форуме: vsv1, asfa, tyns777 (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Тулза для изменения строк в PE-файлах
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 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



Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 01 ноября 2016 12:52
· Личное сообщение · #2

OgreGui

| Сообщение посчитали полезным: b0r3d0m

Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 13:09
· Личное сообщение · #3

srm60171 пишет:
OgreGui

При попытке открыть всё тот же nslookup.exe:

"Произошла критическая ошибка! Происходит выход. Обратитесь к разработчику программного обеспечения".

Добавлено спустя 4 минуты
Судя по всему, он не умеет работать с x64 приложениями. 32-битный .dll-файл открылся замечательно. Проверить само изменение строки, правда, пока не успел.



Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 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



Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

Создано: 01 ноября 2016 14:09 · Поправил: unknownproject
· Личное сообщение · #5

b0r3d0m пишет:
(это, вроде, raw address называется, поправьте меня, если я не прав

Нет.Это называется смещением или позицией от начала файла.Понятия адрес (как такового) для объекта, который не выгружается в оперативную память для выполнения, нет.Любой файл, открытый гекс-редактором - это просто двоичный файл.Форматным исполняемым файлом с адресацией он становится только при запуске под ОС и при условии, что является таковым.
Алгоритм замены будет примерно такой:
1.Получить размер строки-замены и размер оригинальной строки.
2.Отсчитать разницу между размером оригинальной строки и строкой-заменой.
3.Сместить все данные после этой строки на разницу.
4.Перезаписать строку.
5.Пересчитать размер файла и перестроить PE с правкой нужных полей.

-----
TEST YOUR MIGHT


| Сообщение посчитали полезным: b0r3d0m

Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 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.250.01
Статус: Участник
Destroyer of protectors

Создано: 01 ноября 2016 15:20
· Личное сообщение · #7

unknownproject
В корне не правильный алгоритм, ты так весь exe пересоберёшь в итоге.



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 15:33
· Личное сообщение · #8

MasterSoft пишет:
В корне не правильный алгоритм, ты так весь exe пересоберёшь в итоге

Почему весь exe? Насколько я понял, потребуется изменить лишь те байты, которые представляли предыдущий адрес изменённой строки.



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 01 ноября 2016 15:48
· Личное сообщение · #9

b0r3d0m
Radialix + ida
и там же
"Как локализовать строки в коде"
"Как увеличить длину жестко-закодированной строки"



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 01 ноября 2016 16:27 · Поправил: dosprog
· Личное сообщение · #10

b0r3d0m пишет:
Почему весь exe? Насколько я понял, потребуется изменить лишь те байты, которые представляли предыдущий адрес изменённой строки.

Так и есть.
Вдобавок, в программах на паскале перед собственно строкой идёт её длина (DWORD).
Ссылки могут быть как на этот DWORD, так и на саму строку. Это надо тоже учитывать.

Срециализированной тулзы для этой цели нет, да и быть не может.
Сегодня вот тут пытались агрессивно рекламировать такую себе "bin ninja",
вот пускай разобравшиеся расскажут, как в ней сделать такое.



| Сообщение посчитали полезным: b0r3d0m

Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 16:41
· Личное сообщение · #11

dosprog пишет:
Так и есть

Так вы тоже согласны с тем, что поменять адрес строки проще, чем изменять PE header?

Кстати, судя по тому, что я вижу, ссылки на строку представляют собой не RVA, а VA, как говорил srm60171 вот в этом сообщении. Кто прав?

dosprog пишет:
Вдобавок, в программах на паскале перед собственно строкой идёт её длина (DWORD)

Интересуют только незащищённые программы на C++, компилируемые MSVC.

Добавлено спустя 6 минут
LinXP пишет:
Radialix + ida

Спасибо за совет, гляну. Жаль, command line интерфейса нет, так бы написал свою небольшую обёртку для конкретно нашего использования.



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 01 ноября 2016 17:03 · Поправил: LinXP
· Личное сообщение · #12

b0r3d0m пишет:
Интересуют только незащищённые программы на C++, компилируемые MSVC

тогда ida не понадобится, попробуй, изменил строку "Non-existent domain"


74c8_01.11.2016_EXELAB.rU.tgz - nslookup_test.rar



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 17:08
· Личное сообщение · #13

LinXP пишет:
тогда ida не понадобится, попробуй, изменил строку "Non-existent domain"

А что именно вы сделали? Оригинальная строка, судя по XVI32, осталась прежней. Вы поместили видоизменённую строку в другое место и поменяли ссылки на неё в секции .text?

fc /b слишком большой дифф показывает, из него не совсем понятны изменения.



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 01 ноября 2016 17:31
· Личное сообщение · #14

b0r3d0m ой, похоже Radialix ничего не изменил и нет текста который я добавил. значит нужно подключать через ida



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 17:34
· Личное сообщение · #15

LinXP пишет:
b0r3d0m ой, похоже Radialix ничего не изменил и нет текста который я добавил. значит нужно подключать через ida

Что значит "нужно подключать через ida"? Почему именно IDA?



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 01 ноября 2016 17:46
· Личное сообщение · #16

b0r3d0m если в кратце, в иду Radialix подключает свой плагин (только для ida 5.5), для получения дополнительной информации и на базе этих данных уже "собирает" изменённый файл.. вообщем видосики глянь
жаль что автора уже нет и прожка больше не развивается



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 01 ноября 2016 17:49
· Личное сообщение · #17

b0r3d0m пишет:
Почему весь exe? Насколько я понял, потребуется изменить лишь те байты, которые представляли предыдущий адрес изменённой строки.

почти весь, если придерживаться вот этого алго:
unknownproject пишет:
1.Получить размер строки-замены и размер оригинальной строки.
2.Отсчитать разницу между размером оригинальной строки и строкой-заменой.
3.Сместить все данные после этой строки на разницу.
4.Перезаписать строку.
5.Пересчитать размер файла и перестроить PE с правкой нужных полей.

судя по этому, человек предлагает перезаписывать старую строку новой, предварительно увеличив размер файла на разницу строк. Если я всё правильно понял, то остальные данные съедут вперёд (ну либо назад), из-за этого загадим ссылки на другие строки, а если строка будет находиться в секции кода, тогда съедет и он, в таком случае фикс релоков только самое малое, что нужно будет сделать.

dosprog пишет:
Сегодня вот тут пытались агрессивно рекламировать такую себе "bin ninja",
вот пускай разобравшиеся расскажут, как в ней сделать такое.

размер очень влияет на функционал проги. впредь никогда не буду качать софт весом больше метра. ты меня вдохновил, учитель, пишу из дос.



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 17:55 · Поправил: b0r3d0m
· Личное сообщение · #18

MasterSoft пишет:
почти весь, если придерживаться вот этого алго

Упомянутый вами алгоритм действительно потребует перестроить почти весь исполняемый файл. Я же говорил про алгоритм, указанный тут. На текущий момент лично мне он кажется наиболее оптимальным. А вы что думаете?

И да, остались непонятыми два момента:
- В секции .text ссылки на данные из секций .data / .rdata хранятся в виде RVA или VA? Всё в том же алгоритме srm60171 говорил про RVA, но на практике получается, что необходимо изменять всё же VA.
- Куда лучше всего помещать свои собственные "увеличенные" строки? В какую именно секцию? Имеет ли это вообще какое-то значение?



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.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) - они указывают на ресурсы, таблицы импорта, экспорта и т.д.




Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 18:11
· Личное сообщение · #20

MasterSoft пишет:
убедиться, что в конце файла нет оверлея. создать новую секцию, поставить ей нужные права

А почему именно так? Что плохого в помещении обновлённой строки в одну из существующих секций?

MasterSoft пишет:
тот же OgreGui кажется умеет искать и VA и RVA ссылки

Блин, т.е. в бинарнике могут встретиться и VA, и RVA ссылки на одну и ту же строку? Если да, то зачем так делают?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 01 ноября 2016 18:29 · Поправил: dosprog
· Личное сообщение · #21

b0r3d0m пишет:
А почему именно так? Что плохого в помещении обновлённой строки в одну из существующих секций?

Да ничего плохого нету.
Если найти пространство.
А его может и не быть.
Тогда придётся добавлять секцию, как тут писали выше.

Адреса в виде RVA обычно не встречаются. Компилятор для данных в программе генерирует смещения VA.


MasterSoft пишет:
размер очень влияет на функционал проги. впредь никогда не буду качать софт весом больше метра. ты меня вдохновил, учитель, пишу из дос.

) Слушай, не начинай, а?
Размер не влияет на функционал, но размер при сходном функционале часто является показателем, как сопутствующий фактор.

А что до ниньзи - так пускай бы энтузиасты и рассказали, как в ней проделать требуемый поиск и замены строк.
Это было бы вполне уместно.



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 01 ноября 2016 18:30 · Поправил: MasterSoft
· Личное сообщение · #22

b0r3d0m пишет:
А почему именно так? Что плохого в помещении обновлённой строки в одну из существующих секций?

не обязательно свободное место в конце секции для выравнивания и не обязательно в секции с данными только данные для чтения. нули могут быть под какой-то буфер и в итоге строку твою кто-то перезапишет. К тому же, что делать, когда свободное место кончиться, а переводить ещё много - всё-равно придётся лепить новую секцию. VA ищи.

dosprog пишет:
Слушай, не начинай, а?

сорян, не удержался, я не со зла.



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 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.250.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


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 01 ноября 2016 20:31 · Поправил: difexacaw
· Личное сообщение · #25

Давайте проанализим.

Есть регион памяти(без разницы содержимое) и нам необходимо этот регион расширить. Есно он будет перекрываться с другим, за пределами исходного размера. Изменить данные за пределами исходного размера нельзя. Поэтому решение должно быть основано не на содержании, а на выборке данных. Тоесть нужно изменить ссылку на данные.

Найти ссылку на целевой блок памяти и изменить её.
A. Изменить ссылку в модуле, прежде как то найти её. Это статический анализ, который разворачивается далее в виде очень сложной задачи(если нет прямой ссылки в виде фиксапа). Необходим полный анализ модуля или его рекомпиляция в общем случае, что сделать автоматикой невозможно(без ошибок).
B. Отследить выборку данных по ссылке, это динамика. Возможны разные решения, это софтверный останов(эмуляция), хардверный останов в разных вариантах.

-----
vx




Ранг: 19.4 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 01 ноября 2016 23:21
· Личное сообщение · #26

b0r3d0m пишет:
Кстати, File Location Calculator из PE Tools не умеет работать с 64-битными адресами? Выглядит так, по крайней мере.

В новом DiE есть калькулятор x64.



Ранг: 10.7 (новичок), 2thx
Активность: 0.060
Статус: Участник

Создано: 01 ноября 2016 23:30
· Личное сообщение · #27

MasterSoft пишет:
возьми это

Спасибо, не знал, что там Address Converter есть!

difexacaw пишет:
A. Изменить ссылку в модуле, прежде как то найти её. Это статический анализ, который разворачивается далее в виде очень сложной задачи

А что сложного? Я думал, что достаточно вычислить VA / RVA и найти обращение к соответствующему адресу в секции .text. Из подводных камней разве что тот факт, что в .text может происходить обращение не напрямую к этому адресу, а к вычисленному при помощи адресной арифметики. Вы это и имели ввиду или я что-то ещё упустил?

=========================================

А такой вопрос... Как оказалось, строка "Non-existent domain" из nslookup.exe находится в секции .text:







Спрашивается, как так-то? Что она делает в секции, которая, в общем-то, предназначена для исполняемого кода?




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 02 ноября 2016 04:27
· Личное сообщение · #28

b0r3d0m

Сказал ведь, если нет релока.

> Спрашивается, как так-то? Что она делает в секции, которая, в общем-то, предназначена для исполняемого кода?

Секция RE, тоесть выборка данных из неё возможна, поэтому там располагается не только код, но и константы. Хотя это не хорошо.

-----
vx




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 ноября 2016 05:16 · Поправил: dosprog
· Личное сообщение · #29

b0r3d0m пишет:
Спрашивается, как так-то?


Да вот так.
Если строка константа, то её компилятор может поместить и в секцию кода.
Особенно этим любил заниматься Delphi, как и TurboPascal в своё время.

Найденную ссылку на строку можете изменять - релок отработает прозрачно, даже если он там и есть.





Ранг: 12.0 (новичок), 17thx
Активность: 0.060
Статус: Участник

Создано: 02 ноября 2016 05:39
· Личное сообщение · #30

dosprog пишет: вот пускай разобравшиеся расскажут, как в ней сделать такое.

как полыхает, идите на работу к Маску, ему как раз пригодится ракетный двигатель.
в хуюве даже секцию нельзя добавить, мощь.

difexacaw пишет: Возможны разные решения

В данном случае решения нет, автоматика невозможна, взять толстое приложение, например chrome или firefox, после подобных манипуляций придет пушной зверек, ибо помимо того, что гадят в секцию кода, так еще и арифметика со всякими там указателями, пройтись по всем ветвлениям затруднительно.


. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Тулза для изменения строк в PE-файлах
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати