Портабелизация IDA



    Совсем небольшое сообщение.

    По ряду личных причин я люблю таскать свой инструментарий на флешке или внешнем жёстком диске. Одним из инструментов является IDA 6.8.

    После работы с системами я не люблю, когда остаются какие-то хвосты в реестре или в виде файлов. И к сожалению, IDA и её модули (в частности, BinnDiff) этим грешны.

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

    Ну в меру своих скромных знаний и понимания проблемы было видно три варианта решения:

    1. Завернуть всё в ThinApp или TurboStudio. Итог получился большим, громоздким, с ограниченной возможностью обновления плагинов и т.д. Не подошло.
    2. Написать некий резидент, отслеживающий изменения и откатывающий их назад после завершения сеанса IDA. Итог получился достаточно объёмным (несколько мегабайт) либо требовал наличия библиотек в системе для запуска. При изменении характера «хвостов» необходимо было заново переписывать и компилировать код. Не то.
    3. Обойтись встроенными средствами Windows. Об этом — подробнее.

    На самом деле устранить хвосты в виде файлов и остатков в реестре вполне можно в простом командном файле Windows даже без Powershell. Код в моём случае вышел таким:

    @ECHO Off
    rem Определяем разрядность системы
    rem По умолчанию IDA запустится с такой же разрядностью
    set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" (If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86)
    
    rem Также считываем параметр строки переданный при запуске
    set param=%~1
    
    rem На всякий случай бекапим файлы с настроек - вдруг у пользователя тоже есть IDA?
    xcopy /E /I /C /Y /Q /H /R "%appdata%\zynamics" ".\Backup\zynamics"
    xcopy /E /I /C /Y /Q /H /R "%appdata%\Hex-Rays" ".\Backup\Hex-Rays"
    xcopy /E /I /C /Y /Q /H /R "%appdata%\IDA Pro" ".\Backup\IDA Pro"
    
    rem Чистим папки, процедура описана ниже
    call :removedir "%appdata%\zynamics"
    call :removedir "%appdata%\Hex-Rays"
    call :removedir "%appdata%\IDA Pro"
    
    rem Копируем в профиль пользователя все необходимые файлы настроек 
    xcopy /E /I /C /Y /Q /H /R ".\BinDiff\INI" "%appdata%\"
    xcopy /E /I /C /Y /Q /H /R ".\Hex-Rays" "%appdata%\"
    xcopy /E /I /C /Y /Q /H /R ".\Hex-Rays\IDA Pro" "%appdata%\IDA Pro"
    
    rem Бекапим ветку реестра IDA
    reg export HKEY_CURRENT_USER\Software\Hex-Rays backup.reg /y
    
    rem ... и перезаписываем своими параметрами
    reg import settings.reg
    
    rem Теперь посмотрим, какие параметры переданы в командной строке
    rem Это позволит запустить IDA в другой разрядности, например х32 в Windows x64
    if "%param%"=="32" goto x32
    if "%param%"=="64" goto x64
    if "%param:~1%"=="32" goto x32
    if "%param:~1%"=="64" goto x64
    if "%xOS%"=="x64" goto x64
    if "%xOS%"=="x32" goto x32
    
    rem Запускаем IDA x32 и висим в виде резидента, ожидая завершения программы
    :x32
    start /wait idaq.exe
    goto end
    
    rem Запускаем IDA x64 и висим в виде резидента, ожидая завершения программы
    :x64
    start /wait idaq64.exe
    goto end
    
    rem Тут процедура удаления папок
    :removedir
    del /F /Q /S %1 > nul
    rmdir /s /q %1
    exit /b
    
    rem И завершение работы
    :end
    rem Записываем настройки из реестра в файл
    reg export HKEY_CURRENT_USER\Software\Hex-Rays settings.reg /y
    rem ... а из профиля пользователя копируем все файлы
    xcopy /E /I /C /Y /Q /H /R "%appdata%\zynamics\*" ".\BinDiff\INI\zynamics"
    xcopy /E /I /C /Y /Q /H /R "%appdata%\Hex-Rays\*" ".\Hex-Rays"
    xcopy /E /I /C /Y /Q /H /R "%appdata%\IDA Pro" ".\Hex-Rays\IDA Pro" 
    
    rem Чистим ветку реестра
    reg delete HKEY_CURRENT_USER\Software\Hex-Rays /f
    rem ... и восстанавливаем то, что там было до нас
    reg import backup.reg
    
    rem Чистим все хвосты
    del /F /Q backup.reg
    call :removedir "%appdata%\zynamics"
    call :removedir "%appdata%\Hex-Rays"
    call :removedir "%appdata%\IDA Pro"
    
    rem Восстанавливаем папки в профиле пользователя, которые были до запуска
    xcopy /E /I /C /Y /Q /H /R ".\Backup\*" "%appdata%\"
    rem ... и удаляем этот бекап
    call :removedir Backup
    

    Побочным эффектом такого командного файла является чёрное окно, висящее в ходе работы IDA. Поэтому я собрал это всё в Quick Batch Compiler, в итоге программа стала полностью «невидимой».

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

    Данный «проект» (очень громко сказано) есть на гитхабе, там же — собранный файл. Принимаются критика и дополнения.

    P.S.: Я знаю, что начиная с IDA 7.0 изменились пути и затрагиваемые файлы. Но я использую 6.8 в виду того, что некоторые плагины не переписаны под 7.0, да и вообще мне 7.0 не понравилась. Тем не менее, предлагаемая концепция легко адаптируется и под новые версии IDA.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 17

      +3
      Ну просто же.
      Подменяем стандартную виндовую библиотеку своим враппером, который все вызовы кроме записи и чтения из реестра тупо транслирует в виндовую либу.
      А запись в реестр блокирует, ведя её в оперативную память. ТО есть по сути виндовый реестр даже не узнает, что в него хотели писать.

      Плюс решения очевиден — универсальность, компактность, простота использования.
      Минус — не вижу.
        0
        1. Винда может быть разной.
        2. Винда может быть х32 и х64.
        3. С файлами в профиле как быть?
          +1
          А какая нам разница какая винда?
          IDA хочет конкретные методы, эти конкретные методы есть в нашей фейковой либе, она их использует.
          А уж фейковая либа стандартным способом обращается к виндовым функциям, как обычное приложение.

          Третий вопрос не понял. Чуть подробнее пожалуйста о каких файлах и профилях речь.
            0
            Вы уверены что х32 либа будет корректно подменять вызовы к реестру в среде х64?
            Плюс нужно будет осуществлять сброс фейкового реестра из памяти в файл и его загрузку из файла перед запуском иды. Это кто будет делать — та же либа?

            По третьему вопросу:
            "%appdata%\zynamics"
            "%appdata%\Hex-Rays"
            "%appdata%\IDA Pro"
              +1
              Вы уверены что х32 либа будет корректно подменять вызовы к реестру в среде х64?

              Конечно.
              IDA 32 битная как по вашему работает в 64 битной ОС?

              Плюс нужно будет осуществлять сброс фейкового реестра из памяти в файл и его загрузку из файла перед запуском иды. Это кто будет делать — та же либа?
              По третьему вопросу:

              Второй и третий вопросы по сути одно и тоде.
              Такая либа делает практически ровно тоже самое что и ваш батник, просто чуть более чисто. Например, если вырубится электричество — в реестре не будет ничего лишнего. Ну и в целом — один раз решение сделал и забыл, годится для любой проги. Раз вы любите портативность — такая фейковая либа мастхэв.
                –2
                Речь не о работе иды х32 в винде х64.
                Речь о работе либы х32 в иде х64.
                Впрочем, признаю: идея интересная. Реализуйте!
                  0

                  Да в общем-то, всё уже придумано до нас. Sandboxie и иже с ними.

                    0
                    Не получится. Тогда все Ваши правки файлов останутся в той же песочнице.
                    Кстати, размер моего файла (exe) — 140 кб. Инсталлятор Sandboxie — 6 мб.
                    И мы ушли от основной идеи: чтобы не захламлять систему остатками работы иды — мы захламим её песочницей )))

                    И кстати я тут подумал о Вашем доводе со сбоем питания. Извините, а как либа спасёт в этом случае? Она поможет сбросить кеш записи на диск? Или в ней встроенный ИБП? Потому как при «удачном» сбое питания у пользователя возникнут куда более серьёзные проблемы, чем грязь в реестре, которая, кстати, легко чистится двойным кликом по файлу backup.reg.
                      0

                      Из песочницы нужные файлы можно руками достать. Кажется, Sandboxie можно указать, что доступ к нужным каталогам не надо виртуализировать. Тогда и доставать руками ничего не надо будет.
                      Впрочем, если на системе следов вообще оставлять не надо, то песочница не подойдёт, конечно же.

                    +1
                    Чёт вы какой-то агрессивный.
                    Безусловно реализую, если мне вдруг понадобится портабельный софт таскать.
                    Впрочем на 99% уверен, что уже реализовано сборщиками портативный версий. Уж больно простая и универсальная идея.
                      0
                      Вам показалось :)
                      Просто Вы пишите концепты, которые не подходят к задаче.
                      Если портабелизовать через Sandboxie (а с ней — уж поверьте! — я давно разобрался), то там это реализовано не на уровне инжекта библиотек, а на уровне драйвера.

                      Исходно идея была сделать нечто универсальное, небольшое по размеру и сохраняющее доступ к исходным файлам IDA. Я это реализовал по-своему. Не берусь утверждать, что это — лучший способ, но если кто-то сделает что-то универсальное, небольшое по размеру и с сохранением доступа к файлам — я сниму шляпу.

                      А рассуждать в теории можно долго. Только до практики редко дело доходит.
                        0
                        Я делал такое на практике. Только не для досутпа к реестру, а для отслеживания работы с GAPI. Не вижу здесь ничего не реализуемого.
          0
          Неплохой подход к снаряду, но принцип, описанный AllexIn мне кажется более надежным и универсальным.
          Более того — наверняка в системе уже существуют аналогичные возможности, т.к. задача подмены вызовов вызвана (простите за тавтологию) необходимостью обеспечения слоя совместимости для legacy приложений. Теоретически его можно было подхакнуть именно для реализации своих задач.
            0
            Век живи — век учись!

            call :removedir "%appdata%\zynamics"
            
            :removedir
            del /F /Q /S %1 > nul
            rmdir /s /q %1
            exit /b
            

            Снимаю шапку перед этой конструкцией вызова процедур в Batch файлах! Спасибо, буду пользоваться.
              0
              В старинных языках только такие «функции» и были. Goto жил, goto жив, goto будет жить.
                0
                Тогда уж gosub :)
                Да и структуру call — retn старинного языка Ассемблера пользователям IDA как бы положено знать.
                  0

                  В том вся и прелесть, что здесь мы имеем реальную процедуру, даже с параметрами. А без goto тут даже можно и обойтись, сделав явный exit перед блоком процедур

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое