Совсем небольшое сообщение.
По ряду личных причин я люблю таскать свой инструментарий на флешке или внешнем жёстком диске. Одним из инструментов является IDA 6.8.
После работы с системами я не люблю, когда остаются какие-то хвосты в реестре или в виде файлов. И к сожалению, IDA и её модули (в частности, BinnDiff) этим грешны.
Ну и возникло желание получить полностью портабельный комплекс.
Ну в меру своих скромных знаний и понимания проблемы было видно три варианта решения:
- Завернуть всё в ThinApp или TurboStudio. Итог получился большим, громоздким, с ограниченной возможностью обновления плагинов и т.д. Не подошло.
- Написать некий резидент, отслеживающий изменения и откатывающий их назад после завершения сеанса IDA. Итог получился достаточно объёмным (несколько мегабайт) либо требовал наличия библиотек в системе для запуска. При изменении характера «хвостов» необходимо было заново переписывать и компилировать код. Не то.
- Обойтись встроенными средствами 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.