Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 29.01.17 17:09
Оценка: 41 (6)
Всем привет, вот решил еще одну библиотеку выложить....

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

Библиотека С++/С для редактирования файлов исполняемых образов (DLL,EXE,SYS...) для ОС WINDOWS.
Именуемая далее (не сильно оригинально) IMAGELIB, позволяет программисту создавать специальные программы 
в которые им может быть заложены возможности редактировать чужие исполняемые файлы.

С помощью этой библиотеки, работая с чужими готовыми бинарными образами, программист может:

    - Добавлять в неограниченном объёме свой собственный код в эти образы.
    - Удалять любые выбранные программистом фрагменты кода этих образов.
    - Перемещать любые выбранные программистом фрагменты чужого кода, в нужное ему место, 
      в том числе и в добавленные им с помощью этой библиотеки новые секции кода.
    - Устанавливать хуки на любые функции чужого бинарного кода путем перемещения этих функций в новое место
      с сохранением работоспособности этих функций.
    - Размещать в старом месте таких функции любой свой код.
    - Устанавливать хуки в произвольные точки чужого кода путем "раздвижения" этого кода, 
      для вписывания в него команды перехода.

Библиотека позволяет программисту работать с чужим кодом на уровне макросов исходного кода.

С помощью таких макросов программист может:

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

Библиотека имеет встроенные инструменты для анализа чужого машинного кода.
Библиотека не имеет ограничений на объём и место добавления своего кода к чужим бинарным образам.
Библиотека имеет встроенные средства для работы с так называемыми "Базами Данных Программы PDB",
содержащих отладочную информацию. Микрософт предоставляет такие базы данных для 
всех (почти) исполняемых образов ОС WINDOWS и большинства своих прикладных программ.

Библиотека имеет встроенные средства для Анализа Машинного Кода. 
В результате этого анализа формируются собственная база данных для бинарных образов.
В частности выделяются функции и формируются полные перекрестные ссылки.

На текущий момент библиотека умеет работать как с 32-битными, так и с 64-битными исполняемыми образами.

Анализатор кода поддерживает большинство существующих процессоров, хотя это очевидно и излишний функционал, 
излишность обусловлена работой только с бинарными образами OC WINDOWS. 

Библиотека IMAGELIB использует модифицированную опенсорсную библиотеку CAPSTONE, 
модификация сделана для возможности РЕДАКТИРОВАНИЯ машинных команд.

Библиотека написана за 2 месяца для адаптации одного ну уж очень объёмного сетевого драйвера. 
На текущий момент в ней реализован только необходимый для этой конкретной задачи функционал. 
Я буду только рад если кто-то дополнит ее функционалом под свои нужды. 
Естественно хотелось бы чтобы все это выкладывалось для свободного доступа. :) 

=========

    Документацию буду писать и выкладывать :) Но пока есть только комментарии в коде. 

    Чтобы собрать библиотеку и примеры запустите из "VS2015 x64 Native Tools Command Prompt" коммандный
    файл "build.cmd". В результате библиотека будет собрана, и запущенны тесты. Результаты надо смотреть
    в папке OutBin. В соответствующих конфигурации папках (x64 и Win32) вы найдете файлы "ImageMerge.log"
    и "target.log". 
    Файл  "ImageMerge.log" это лог работы демонстрационной программы, а в "targer.log" результаты работы 
    СОЗДАННОГО нового образа.



сам код тут : https://github.com/Worobow/MakeLib
Не все кто уехал, предал Россию.
Отредактировано 29.01.2017 17:39 Andrew.W Worobow . Предыдущая версия . Еще …
Отредактировано 29.01.2017 17:35 Andrew.W Worobow . Предыдущая версия .
Отредактировано 29.01.2017 17:09 Andrew.W Worobow . Предыдущая версия .
Re: Библиотека для редактирования бинарников.
От: bazis1 Канада  
Дата: 29.01.17 19:24
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Библиотека имеет встроенные средства для Анализа Машинного Кода.

AWW>В результате этого анализа формируются собственная база данных для бинарных образов.
AWW>В частности выделяются функции и формируются полные перекрестные ссылки.

Оооох. Я конечно скептик, но оно реально работает на реальных проектах? Т.е., что будет, если допустим, взять, раскукожить какой-нибудь write.exe, вставить по одному nop-у перед каждой функцией и скукожить обратно? Оно реально запустится? Ведь одна пропущенная ссылка и все — crash. Или под Windows exe всегда содержат relocation records для всех секций?
Re[2]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 29.01.17 19:33
Оценка:
Здравствуйте, bazis1, Вы писали:

B>Оооох. Я конечно скептик, но оно реально работает на реальных проектах? Т.е., что будет, если допустим, взять, раскукожить какой-нибудь write.exe, вставить по одному nop-у перед каждой функцией и скукожить обратно? Оно реально запустится? Ведь одна пропущенная ссылка и все — crash. Или под Windows exe всегда содержат relocation records для всех секций?


Ну да реально работает. И даже в ядре, хотя... в ядре с такими вещами проще.

Нет, одних релоков мало, чтобы двигать (перемещать) функции, там делается анализ кода. Конечно в реальных проектах,надо смотреть, что получается, надо тестировать. Но ведь и образ то в реальных проектах один.
Но так то в целом работает.
Вообще другими словами эту либу можно назвать — exe2obj и потом снова линк.
Два екзешника разбираются на части (exe2obj) и потом из этой кучи псевдо объектников делается (link) результирующий .
==
В ельфах все делать проще, там все документировано, и описано, тут же, в винде, нифига не документировано.
Вообще конечно я сам когда сделал, поражался, что все работает.
Не все кто уехал, предал Россию.
Отредактировано 29.01.2017 19:35 Andrew.W Worobow . Предыдущая версия .
Re[3]: Библиотека для редактирования бинарников.
От: bazis1 Канада  
Дата: 29.01.17 19:58
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>В ельфах все делать проще, там все документировано, и описано, тут же, в винде, нифига не документировано.

AWW>Вообще конечно я сам когда сделал, поражался, что все работает.
Круто. А можно просто для общего развития, несколько примеров реальных тяжелых приложений, которые удалось таким образом перекукожить без потерь?
Re[4]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 29.01.17 20:13
Оценка:
Здравствуйте, bazis1, Вы писали:

B>Круто. А можно просто для общего развития, несколько примеров реальных тяжелых приложений, которые удалось таким образом перекукожить без потерь?


Ну там есть примеры, для тестирования — попробуйте сделать код по сложнее. Возможно что на каком-то коде и не сработает Но она скажет, что "ну не смогла я...".
Примеры? Ну тут я могу только словами что-то такое описать, но думаю, не особо это надо — хотя ну вот 4.3 мега кода драйвера, работают, пока не жаловались. Примеры конкретнее не могу — коммерческие вещи...

Что же касается каких-то диковенных приложений, кстати write.exe по моему к таким тоже относится, возможно что придется ручками доделывать. Просто там много чего кладется в секции данных, спец таблицы, екзешники же не просто только код.
Это же библиотека и пример ImageMerge. Ведь это только пример. Но в той части функционала работы с образами, что мне надо было (4 мега кода драйвера ядра) его хватило. Ну я для этого и делал эту либу.
Не все кто уехал, предал Россию.
Отредактировано 29.01.2017 20:23 Andrew.W Worobow . Предыдущая версия . Еще …
Отредактировано 29.01.2017 20:20 Andrew.W Worobow . Предыдущая версия .
Отредактировано 29.01.2017 20:17 Andrew.W Worobow . Предыдущая версия .
Отредактировано 29.01.2017 20:14 Andrew.W Worobow . Предыдущая версия .
Re: Библиотека для редактирования бинарников.
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.01.17 05:20
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>решил еще одну библиотеку выложить....


Спасибо!

Кстати, никак не могу понять, как на гитхабе отслеживать версии. Или там все завязано исключительно на время последнего коммита?
Re[2]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 30.01.17 06:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Кстати, никак не могу понять, как на гитхабе отслеживать версии. Или там все завязано исключительно на время последнего коммита?


Версии лучше вести как релиз в виде ветки с тем чтобы потом можно было делать горячие правки именно в этой зафиксированной версии кода. А потом вытянуть правки в основную ветку.
Не все кто уехал, предал Россию.
Re[3]: Библиотека для редактирования бинарников.
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.01.17 06:34
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Версии лучше вести как релиз в виде ветки с тем чтобы потом можно было делать горячие правки именно в этой зафиксированной версии кода. А потом вытянуть правки в основную ветку.


Это понятно. Я про нумерацию версий для пользователей проекта, чтобы им было понятно, насколько значимые изменения вносились в проект.

Сейчас это работает так, что обновления можно отслеживать только по дате коммита, при этом с ходу не отличить значимых изменений кода от исправления опечатки в документации.
Re[4]: Библиотека для редактирования бинарников.
От: flаt  
Дата: 31.01.17 07:37
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Сейчас это работает так, что обновления можно отслеживать только по дате коммита, при этом с ходу не отличить значимых изменений кода от исправления опечатки в документации.


Там ещё есть теги и релизы, можно отслеживать их по RSS, например.
Re: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 05:48
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Всем привет, вот решил еще одну библиотеку выложить....


Обработка исключений на пересобранном бинарнике проверялась?

P.S. Я вам по секрету скажу, что парсинга RUNTIME_FUNCTION для этого совершенно недостаточно, оттуда растет еще много чего интересного, и явные ссылки в виде релоков там отсутствуют напрочь.

P.P.S. В исходниках сходу на нашел обработку SWITCH + JMP таблиц для них. Как это дело у вас перестраивается?
Отредактировано 01.02.2017 5:52 drVanо . Предыдущая версия .
Re[2]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 06:01
Оценка:
Здравствуйте, bazis1, Вы писали:

B>Оооох. Я конечно скептик, но оно реально работает на реальных проектах? Т.е., что будет, если допустим, взять, раскукожить какой-нибудь write.exe, вставить по одному nop-у перед каждой функцией и скукожить обратно? Оно реально запустится? Ведь одна пропущенная ссылка и все — crash. Или под Windows exe всегда содержат relocation records для всех секций?


В реальных проектах полно мест где нет явных релоков на ссылки (особенно для х64), а если поглядеть на данные от DWARF2 (актуально актуально в том числе и для MinGM), то там в структурах практикуются "адреса" в виде DW_EH_PE_pcrel и DW_EH_PE_datarel, которые зависят от адреса самой структуры.
А есть еще всякие обработки исключений и данные для SWITCH, структура которых полностью зависит от компилятора.
Re[2]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 07:00
Оценка:
Здравствуйте, drVanо, Вы писали:

Сразу скажу очень, хорошо, что вы (и другие) подключились, к проекту, ведь, как я сразу написал, я сделал только то что мне конкретно было надо.

V>Обработка исключений на пересобранном бинарнике проверялась?


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

V>P.S. Я вам по секрету скажу, что парсинга RUNTIME_FUNCTION для этого совершенно недостаточно, оттуда растет еще много чего интересного, и явные ссылки в виде релоков там отсутствуют напрочь.


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

V>P.P.S. В исходниках сходу на нашел обработку SWITCH + JMP таблиц для них. Как это дело у вас перестраивается?


Обрабатываются как перекрестная ссылка из данных. Да, кстати, да там есть небольшая проблема, но если она встретится, и в результате ЭМУЛЯЦИИ ВЫПОЛНЕНИЯ КОДА, значения регистра вычислить не удастся то работа будет остановлена. "Ну не смогла я...." Да так бывает. Для таких случаев надо брать и править код и пушить.
Не все кто уехал, предал Россию.
Re[3]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 07:03
Оценка:
Здравствуйте, drVanо, Вы писали:

V>А есть еще всякие обработки исключений и данные для SWITCH, структура которых полностью зависит от компилятора.


Для этого "Там" делается эмуляция выполнения, линейных фрагментов кода, call и условный переход эмуляцию ресетят.
Не все кто уехал, предал Россию.
Re[3]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 07:59
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

V>>P.S. Я вам по секрету скажу, что парсинга RUNTIME_FUNCTION для этого совершенно недостаточно, оттуда растет еще много чего интересного, и явные ссылки в виде релоков там отсутствуют напрочь.


AWW>Парсинг таблиц функций, там делается по сути только для того чтобы их воспроизвести в новом образе и для того чтобы эти функции обнаружить, если нет PDB данных. То есть они частично переезжают в новый как есть, частично ну в том объеме в котором эти функции включатся в новый. Если фрагмент старого кода выбрасывается, то и в таблицу они не перенесутся.


Я вам как раз и пишу, что недостаточно перенести саму RUNTIME_FUNCTION, нужно еще переносить все на что показывает UNWIND_INFO в плане "variable Language-specific handler data (optional)" — это компиляторо зависимая шняга.

V>>P.P.S. В исходниках сходу на нашел обработку SWITCH + JMP таблиц для них. Как это дело у вас перестраивается?


AWW>Обрабатываются как перекрестная ссылка из данных.


Ну ну
0000000180010574 lea rcx, [0000000180000000]
000000018001057B movsxd rax, r9d
000000018001057E mov eax, [rcx+rax*4+00010BC0]
0000000180010585 xor bl, bl
0000000180010587 mov rbp, r8
000000018001058A add rax, rcx
000000018001058D mov r12, rdx
0000000180010590 jmp rax
...
0000000180010BC0 B6050100    dd 000105B6 Case
0000000180010BC4 C1050100    dd 000105C1 Case
0000000180010BC8 CC050100    dd 000105CC Case
0000000180010BCC A4050100    dd 000105A4 Case
0000000180010BD0 92050100    dd 00010592 Case
0000000180010BD4 AD050100    dd 000105AD Case
0000000180010BD8 9B050100    dd 0001059B Case
Re[4]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 08:08
Оценка:
Здравствуйте, drVanо, Вы писали:

AWW>>Парсинг таблиц функций, там делается по сути только для того чтобы их воспроизвести в новом образе и для того чтобы эти функции обнаружить, если нет PDB данных. То есть они частично переезжают в новый как есть, частично ну в том объеме в котором эти функции включатся в новый. Если фрагмент старого кода выбрасывается, то и в таблицу они не перенесутся.


V>Я вам как раз и пишу, что недостаточно перенести саму RUNTIME_FUNCTION, нужно еще переносить все на что показывает UNWIND_INFO в плане "variable Language-specific handler data (optional)" — это компиляторо зависимая шняга.


Ну дык, и я вам пишу — берете и делаете ручками, для своей конкретной задачи, для своего образа, для своего отдетектированного компилятора, то что вам надо — берете и пишите и пушите. Я сделал ровно то что надо было мне — в моем конкретном случае. У меня НЕ стояла задача сделать так чтобы работали исключения — у мне они были (должны были) быть запрещены, ибо их использовать нельзя.

V>>>P.P.S. В исходниках сходу на нашел обработку SWITCH + JMP таблиц для них. Как это дело у вас перестраивается?


AWW>>Обрабатываются как перекрестная ссылка из данных.


V>Ну ну


И что?
Не все кто уехал, предал Россию.
Re[5]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 10:18
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

V>>Я вам как раз и пишу, что недостаточно перенести саму RUNTIME_FUNCTION, нужно еще переносить все на что показывает UNWIND_INFO в плане "variable Language-specific handler data (optional)" — это компиляторо зависимая шняга.


AWW>Ну дык, и я вам пишу — берете и делаете ручками, для своей конкретной задачи, для своего образа, для своего отдетектированного компилятора, то что вам надо — берете и пишите и пушите. Я сделал ровно то что надо было мне — в моем конкретном случае. У меня НЕ стояла задача сделать так чтобы работали исключения — у мне они были (должны были) быть запрещены, ибо их использовать нельзя.


Нет, спасибо

V>>>>P.P.S. В исходниках сходу на нашел обработку SWITCH + JMP таблиц для них. Как это дело у вас перестраивается?


AWW>>>Обрабатываются как перекрестная ссылка из данных.


V>>Ну ну


AWW>И что?


Мдеее... Так понятнее?

0000000180010574 lea rcx, [0000000180000000]
000000018001057B movsxd rax, r9d
000000018001057E mov eax, [rcx+rax*4+00010BC0]
0000000180010585 xor bl, bl
0000000180010587 mov rbp, r8
000000018001058A add rax, rcx
000000018001058D mov r12, rdx
0000000180010590 jmp rax
...
0000000180010592 mov r11, xxx
0000000180010599 jmp 00000001800105D5
...
000000018001059B mov r11, xxx
00000001800105A2 jmp 00000001800105D5
...
00000001800105A4 mov r11, xxx
00000001800105AB jmp 00000001800105D5
...
00000001800105AD mov r11, xxx
00000001800105B4 jmp 00000001800105D5
...
00000001800105B6 mov r11, xxx
00000001800105BD mov bl, 01
00000001800105BF jmp 00000001800105D5
...
00000001800105C1 mov r11, xxx
00000001800105C8 mov bl, 01
00000001800105CA jmp 00000001800105D5
...
00000001800105CC mov r11, ...
00000001800105D3 mov bl, 01
...
0000000180010BC0 dd 000105B6 Case (180000000 + 000105B6 = 1800105B6)
0000000180010BC4 dd 000105C1 Case (180000000 + 000105C1 = 1800105C1)
0000000180010BC8 dd 000105CC Case (180000000 + 000105CC = 1800105CC)
0000000180010BCC dd 000105A4 Case (180000000 + 000105A4 = 1800105A4)
0000000180010BD0 dd 00010592 Case (180000000 + 00010592 = 180010592)
0000000180010BD4 dd 000105AD Case (180000000 + 000105AD = 1800105AD)
0000000180010BD8 dd 0001059B Case (180000000 + 0001059B = 18001059B)


Это был самый "простой" вариант (MSVC), где к смещениям прибавляется ImageBase (без всяких релоков!), а вариант "посложнее" (CLANG):

0000000000007267 lea rdx, [00000000000075B8]
000000000000726E movsxd rcx, dword ptr [rdx+rcx*4]
0000000000007272 add rcx, rdx
0000000000007275 jmp rcx
...
00000000000075B8 dd FFFFFCCD Case (00000000000075B8 + FFFFFCCD = 0000000000007285)
00000000000075BC dd FFFFFCBF Case (00000000000075B8 + FFFFFCBF = 0000000000007277)
00000000000075C0 dd FFFFFCC7 Case (00000000000075B8 + FFFFFCC7 = 000000000000727F)
00000000000075C4 dd FFFFFE46 Case (00000000000075B8 + FFFFFE46 = 00000000000073FE)
00000000000075C8 dd FFFFFE59 Case (00000000000075B8 + FFFFFE59 = 0000000000007411)
00000000000075CC dd FFFFFE4D Case (00000000000075B8 + FFFFFE4D = 0000000000007405)
00000000000075D0 dd FFFFFE54 Case (00000000000075B8 + FFFFFE54 = 000000000000740C)
Отредактировано 01.02.2017 10:28 drVanо . Предыдущая версия .
Re[6]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 10:28
Оценка:
AWW>>Ну дык, и я вам пишу — берете и делаете ручками, для своей конкретной задачи, для своего образа, для своего отдетектированного компилятора, то что вам надо — берете и пишите и пушите. Я сделал ровно то что надо было мне — в моем конкретном случае. У меня НЕ стояла задача сделать так чтобы работали исключения — у мне они были (должны были) быть запрещены, ибо их использовать нельзя.

V>Нет, спасибо


Тогда вообще не понятно о чем мы говорим.
Что вы хотите сказать?

Ну на всякий случай более понятно напишу — если бы мне было это надо то я бы это сделал. Мне это было не надо. Вам это надо? Если да, то делайте, если не надо, то используйте как есть.

V>>>>>P.P.S. В исходниках сходу на нашел обработку SWITCH + JMP таблиц для них. Как это дело у вас перестраивается?

AWW>>>>Обрабатываются как перекрестная ссылка из данных.
V>>>Ну ну
AWW>>И что?

V>Мдеее... Так понятнее?


Да с чего вы взяли, что мне вообще было что-то не понятно?
Я вас спросил — и что с того?
Не все кто уехал, предал Россию.
Re[7]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 10:31
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>>>Ну дык, и я вам пишу — берете и делаете ручками, для своей конкретной задачи, для своего образа, для своего отдетектированного компилятора, то что вам надо — берете и пишите и пушите. Я сделал ровно то что надо было мне — в моем конкретном случае. У меня НЕ стояла задача сделать так чтобы работали исключения — у мне они были (должны были) быть запрещены, ибо их использовать нельзя.


V>>Нет, спасибо


AWW>Тогда вообще не понятно о чем мы говорим.

AWW>Что вы хотите сказать?

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

AWW>>>>>Обрабатываются как перекрестная ссылка из данных.

V>>>>Ну ну
AWW>>>И что?

V>>Мдеее... Так понятнее?


AWW>Да с чего вы взяли, что мне вообще было что-то не понятно?

AWW>Я вас спросил — и что с того?

Как вы находите такие перекрестные ссылки и потом перестраиваете эти таблицы?
Re[4]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 10:36
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Здравствуйте, drVanо, Вы писали:


V>>А есть еще всякие обработки исключений и данные для SWITCH, структура которых полностью зависит от компилятора.


AWW>Для этого "Там" делается эмуляция выполнения, линейных фрагментов кода, call и условный переход эмуляцию ресетят.


Эмуляция выполнения? Зачем она там нужна? Если только ядл обнаружения безусловных переходов, то это реализуется обычным дизассемблером, а не эмулятором.
Re[8]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 10:38
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Я ничего не хочу сказать, я просто спрашивал как это у вас сделано. Ну видимо никак не сделано, поэтому вопрос закрыт.


Я уже по-моему третий раз пишу — передо мной данная задача не стояла, так как исключения (по правилам) ЗАПРЕЩЕНЫ. Это ядро.

AWW>>Да с чего вы взяли, что мне вообще было что-то не понятно?

AWW>>Я вас спросил — и что с того?

V>Как вы находите такие перекрестные ссылки и потом перестраиваете эти таблицы?


Быстрый (работать надо) ответ — никак. Не надо перемещать те функции которые невозможно переместить. Вы же пишите _сами_ программу, которая используя эту библиотеку, что-то такое делает. Библиотека дает вам набор возможностей.

Длинный ответ — делается легко. В библиотеку есть так называемые виртуальные релоки они могут быть RVA и VA. Вот берете и делаете ручками. Если хотите автоматизировать то сделать это не трудно, а вот как именно — это долго рассказывать.
Не все кто уехал, предал Россию.
Re[5]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 10:41
Оценка:
Здравствуйте, drVanо, Вы писали:

V>>>А есть еще всякие обработки исключений и данные для SWITCH, структура которых полностью зависит от компилятора.


AWW>>Для этого "Там" делается эмуляция выполнения, линейных фрагментов кода, call и условный переход эмуляцию ресетят.


V>Эмуляция выполнения? Зачем она там нужна? Если только ядл обнаружения безусловных переходов, то это реализуется обычным дизассемблером, а не эмулятором.


Хосподи боже мой, да я вижу, вы многое, только что узнали (я про библиотеку).
Да там много-много чего делается, и в том числе и эмуляция, и именно поэтому и многое работает из коробки.
Не все кто уехал, предал Россию.
Re[9]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 10:48
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Я уже по-моему третий раз пишу — передо мной данная задача не стояла, так как исключения (по правилам) ЗАПРЕЩЕНЫ. Это ядро.


А вот Microsoft совершенно другого мнения по данному вопросу:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff546823(v=vs.85).aspx

V>>Как вы находите такие перекрестные ссылки и потом перестраиваете эти таблицы?


AWW>Быстрый (работать надо) ответ — никак. Не надо перемещать те функции которые невозможно переместить. Вы же пишите _сами_ программу, которая используя эту библиотеку, что-то такое делает. Библиотека дает вам набор возможностей.


Понятно.

AWW>Длинный ответ — делается легко. В библиотеку есть так называемые виртуальные релоки они могут быть RVA и VA. Вот берете и делаете ручками. Если хотите автоматизировать то сделать это не трудно, а вот как именно — это долго рассказывать.


Я правильно понял, что вместе с бинарником могу засунуть еще некий список релоков, который подскажет вашему ядру где на самом деле есть такие ссылки? Я правда все равно не понимаю как вы их потом будете использовать при перестроении тойже самой таблицы (в одном варианте вычитаем ImageBsse, а в другом — адрес самой таблицы).
Re[6]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 10:55
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Здравствуйте, drVanо, Вы писали:


V>>>>А есть еще всякие обработки исключений и данные для SWITCH, структура которых полностью зависит от компилятора.


AWW>>>Для этого "Там" делается эмуляция выполнения, линейных фрагментов кода, call и условный переход эмуляцию ресетят.


V>>Эмуляция выполнения? Зачем она там нужна? Если только ядл обнаружения безусловных переходов, то это реализуется обычным дизассемблером, а не эмулятором.


AWW>Хосподи боже мой, да я вижу, вы многое, только что узнали (я про библиотеку).

AWW>Да там много-много чего делается, и в том числе и эмуляция, и именно поэтому и многое работает из коробки.

Вы очень зря иронизируете, т.к. у меня есть огромный опыт в смежной теме и я не на словах представляю себе всю сложность задачи. При желании я бы мог вам помочь с каким-нибудь блоком, но судя по тому что вы категорически не настроены на диалог, то на этом прощаюсь.
Re[10]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 11:15
Оценка:
Здравствуйте, drVanо, Вы писали:

AWW>>Я уже по-моему третий раз пишу — передо мной данная задача не стояла, так как исключения (по правилам) ЗАПРЕЩЕНЫ. Это ядро.


V>А вот Microsoft совершенно другого мнения по данному вопросу:

V>https://msdn.microsoft.com/en-us/library/windows/hardware/ff546823(v=vs.85).aspx

Я так понял, что мы говорим про С++ исключения. Они таки запрещены.
Не все кто уехал, предал Россию.
Re[7]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 11:25
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Вы очень зря иронизируете, т.к. у меня есть огромный опыт в смежной теме и я не на словах представляю себе всю сложность задачи. При желании я бы мог вам помочь с каким-нибудь блоком, но судя по тому что вы категорически не настроены на диалог, то на этом прощаюсь.


Я не то, что не настроен на диалог, я даже сказал изначально, что только рад этому. Однако диалога не получилось, а получилось что-то вроде я один тут Д`Артаньян. Ну мне на такое сказать то нечего. Если вы готовы присоединиться, к проекту, я рад. Но вы же сказали — "нет уж спасибо". Ну тут уж, что я могу поделать.... Жаль. Хотя там в коде такое спагетти, что хрен разберёшься, сложный код. С кучей неявных ссылок на правку всяких оффетов и VA в каких-то разных структурах, не только в самом образе. Вообщем я буду рад, если вы что-то напишите. Я с удовольствием что-то поясню по коду.
Не все кто уехал, предал Россию.
Re[11]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 11:43
Оценка: 6 (1)
Здравствуйте, Andrew.W Worobow, Вы писали:

V>>А вот Microsoft совершенно другого мнения по данному вопросу:

V>>https://msdn.microsoft.com/en-us/library/windows/hardware/ff546823(v=vs.85).aspx

AWW> Я так понял, что мы говорим про С++ исключения. Они таки запрещены.


Я вам уже часа 2 намекаю на то, что на списке UNWIND_INFO все не заканчивается, а наоборот начинается самое интересное, а вы мне про С++ исключения

Немного ликбеза — RUNTIME_FUNCTION и UNWIND_INFO нужны исключительно для системы чтобы раскрутить стек и передать управлению обработчику, который найден для текущего RIP (начальный RIP — это адрес исключения, далее достается со стека при раскрутке). Дак вот для того чтобы у вас отработал банальный try/except:
try {
    ...
    ProbeForWrite(Buffer, BufferSize, BufferAlignment);
 
    /* Note that any access (not just the probe, which must come first,
     * by the way) to Buffer must also be within a try-except.
     */
    ...
} except (EXCEPTION_EXECUTE_HANDLER) {
    /* Error handling code */
    ...
}


На уровне RUNTIME_FUNCTION и UNWIND_INFO совершенно нет никакой инфы, а эта инфа как раз живет в HandlerData, которая передается общему (это еще не внутренности except) обработчику исключений (обработчик исключений живет в вашей программе), а дальше обработчик "парсит" HandlerData и находит регион кода для TRY блока (они кстати могут быть вложенные). Дак вот указатели на начало/конец региона, фильтр (функция в скобках у "except") и сам обработчик (уже вашего) исключения — это все ссылки на код. Как я уже говорил — это компиляторо зависимые шняги и формат структур у них может быть какой угодно.
Re[12]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 11:50
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Немного ликбеза — RUNTIME_FUNCTION и UNWIND_INFO нужны исключительно для системы чтобы раскрутить стек и передать управлению обработчику,...


Да спасибо, очень интересно! ...
Не все кто уехал, предал Россию.
Re[8]: Библиотека для редактирования бинарников.
От: drVanо Россия https://vmpsoft.com
Дата: 01.02.17 12:08
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Я не то, что не настроен на диалог, я даже сказал изначально, что только рад этому. Однако диалога не получилось, а получилось что-то вроде я один тут Д`Артаньян. Ну мне на такое сказать то нечего. Если вы готовы присоединиться, к проекту, я рад. Но вы же сказали — "нет уж спасибо". Ну тут уж, что я могу поделать.... Жаль. Хотя там в коде такое спагетти, что хрен разберёшься, сложный код. С кучей неявных ссылок на правку всяких оффетов и VA в каких-то разных структурах, не только в самом образе. Вообщем я буду рад, если вы что-то напишите. Я с удовольствием что-то поясню по коду.


Я вам с первых постов указал на ваши недоработки, от которых вы отмахивались до последнего, а потом еще и Д`Артаньяном обозвали, вот спасибо
Re[9]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 01.02.17 12:20
Оценка: :)
Здравствуйте, drVanо, Вы писали:

V>Я вам с первых постов указал на ваши недоработки, от которых вы отмахивались до последнего, а потом еще и Д`Артаньяном обозвали, вот спасибо


Мои недоработки!? хаха,... вы ничего не путаете? Все недоработки, те что вы видите, они все ваши, ибо если вам надо что-то еще, кроме того что я сделал, это только ваша проблема.

Я отмахивался до последнего?

Не, ... вы не Д`Артаньян...

Я уж не знаю как вам еще _проще_ объяснить — все, что мне было надо, все работает отлично. И если вы не понимаете, как эти всё (ваши проблемы) делается, просто и ненапряжно, то это не моя уже проблема. Сорри.
Не все кто уехал, предал Россию.
Re[3]: Библиотека для редактирования бинарников.
От: Somescout  
Дата: 04.02.17 17:08
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>В ельфах все делать проще, там все документировано, и описано, тут же, в винде, нифига не документировано.


Я, конечно, не вникал в подробности, но чем не устраивает к примеру это (pecoff.docx)?
ARI ARI ARI... Arrivederci!
Re[3]: Библиотека для редактирования бинарников.
От: Indy  
Дата: 20.02.17 07:21
Оценка:
А как вы код от данных отличаете ?
Тоесть имеется у нас ссылка, как вы узнаете что по ней находится ?
Это вероятностный подход, упрощается при наличии релоков и большом обьёме данных. Но если код можно как то графом попытаться взять, то как определить размер данных — никак.
И где в ваших сурсах код, который это делает, или это капстон дизасм делает ?
А просто графом описать известную процедуру и собрать назад это примитивная задача. Это кстате конструктором называется.
Re[4]: Библиотека для редактирования бинарников.
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 20.02.17 10:59
Оценка: 10 (1) +2
Здравствуйте, Indy, Вы писали:

I>А как вы код от данных отличаете ?


Народ, человек уже несколько раз объяснил, что сделал не универсальный и всеобъемлющий инструмент, а практически наколенную поделку для решения сугубо частной задачи, с которой вполне успешно справился. Не нравится — не ешьте, хватит уже тыкать в недостаток всеобщности.
Re[5]: Библиотека для редактирования бинарников.
От: Indy  
Дата: 20.02.17 17:35
Оценка:
Я не говорил что не нравится, а спросил по реализации. Отличить данные от кода это не решённая и актуальная задача. Без релоков нельзя даже быть уверенным что ссылка это ссылка, а не константа.
Re[6]: Библиотека для редактирования бинарников.
От: Andrew.W Worobow https://github.com/Worobow
Дата: 26.02.17 10:03
Оценка: 6 (1)
Здравствуйте, Indy, Вы писали:

I>Я не говорил что не нравится, а спросил по реализации. Отличить данные от кода это не решённая и актуальная задача. Без релоков нельзя даже быть уверенным что ссылка это ссылка, а не константа.


Евгений, уже сказал, что это библиотека сделана ровно в том объеме который был нужен мне. Да и я уже говорил, что мне надо было решить задачу вычленения функционала очень объемного драйвера режима ЯДРА и подключения этого функционала к своему драйверу.

Кстати именно по этому этот проект и называется makelib. То есть из чужого бинарника мне надо было сделать библиотеку которую я должен был использовать в своем драйвере. Но затем оказалось проще не делать промежуточную библиотеку (DLL) а сразу делать итоговый драйвер. И именно по этому, результирующий субпроект в проекте MAKELIB называется imagemerge2.

Чтобы было проще понять как оно работает, а мне показалось что из интересующихся не все поняли это, я расскажу пару слов.

Итак — есть проект "библиотека" ImageLib есть проект "исполняемый" ImageMerge2, и есть два демотестовых проекта — TestExe и TestEject.

ImageLib это некий движок чем-то отдаленно напоминающий IDA он умеет загружать образы и ВЫГРУЖАТЬ образы, а также умеет манипулировать внутренностями бинарников. Например добавить/удалить/перечислить релоки, добавить/удалить/перечислить секции, добавить/удалить/перечислить экспорты, добавить/удалить/перечислить импорты, поменять виртуальный адрес секции, и прочее/прочее там дохрена всего.

С помощью этой библиотеки можно сделать перемещение кода функции из одной секции в другую, но это уже надо делать в своем коде, нет таких функций в этой библиотеке. Но зато есть пример ImageMerge2 в котором это все делается. И сделать это очень просто.


ImageMerge2 это субпроект который с помощью библиотеки ImageLib как раз объединяет два екзешника. Один используется как базовый второй как инжектируемый, НО тут это слово не совсем верное. Так как ничего не инжектируется а как раз таки просто объединяется.

Этот "пример" берет два екзешника и объединяет их один выходной. В том который называется инжектируемый в нем можно _задавать_ с помощью макросов функции которые будут или заменены в базовом либо которые будут вызваны в базовом.

TestExe — это демотест который симулирует базовый образ. Его код вы можете менять по своему усмотрению

TestEject — это демотест котррый симулирует использование кода базового екзешника и использование макросов.

Все это подается на вход ImageMerge2 который производит выходной экзешник запустив который вы увидите результаты на экране.

==
Что же касается определения данных и кода, и того что все делает дизасемблер... Ну что тут сказать — вы понимаете что такое дизасемблер? Расскажу на всякий случай — это просто программа которая генерирует аcсемблерный листинг, программа которая парсит машинные команды. Я его использовал только для того чтобы не писать самому. Чтобы сэкономить время. Этих дизасемблеров как грязи. ))

То есть как определяется код от данных решает анализатор кода, и ВЫ(!!!) вы сами используя эту библиотеку можете запустить анализ на данные если считаете что это код или на оборот.

==
Всё.... )
Не все кто уехал, предал Россию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.