Мульти-плагин для PEiD, DiE, Bit Detector, SCANiT, ExeScan, FastScanner и PE Tools
Практически все современные анализаторы исполняемых файлов поддерживают внешние модули (плагины), значительно расширяющие их функционал. Это могут быть утилиты для извлечения ресурсов, узкоспециализированные анализаторы протекторов, распаковщики, редакторы исполняемых файлов и множество других модулей. Все хорошо и здорово, если бы не одно "но". Анализаторы чаще всего не совместимы по своим функциям взаимодействия с плагинами. Для решения этой проблемы некоторые авторы начали делать мульти-плагины, которые могут работать с несколькими типами анализаторов. Если мне не изменяет память, то первым таким плагином стал модуль определения точной версии ASProtect под названием VerA от известного реверсера PE_Kill. Он одинаково хорошо работал в PEiD и DiE. Я решил пойти дальше и сделать мульти-плагин, который поддерживает шесть различных анализаторов, а именно PEiD, DiE, Bit Detector, SCANiT, ExeScan и FastScanner, а также подходит для программы PE Tools. Остальные анализаторы исполняемых файлов и подавляющее большинство утилит для реверса, поддерживающие внешние модули, "заточены" на формат плагинов от PEiD, поэтому я их в этом списке даже не упоминаю.Начнем с формата плагинов для PEiD. Тут используются две функции - LoadDll и DoMyJob. Первая используется для получения имени плагина, вторая - непосредственно для работы плагина с загруженным файлом. С LoadDll ничего сложного:
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; PEiD - запрос имени плагина
- ;-----------------------------------------------------------
- proc LoadDll
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; PEiD - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл главного окна PEiD
- ; filename - указатель на полный путь загруженного файла
- ; lpreserved и lpparam зарезервированы и не используются
- ;-----------------------------------------------------------
- proc DoMyJob hwnd:DWORD,filename:DWORD,lpreserved:DWORD,lpparam:DWORD
- ; Окно с именем загруженного файла
- invoke MessageBox,[hwnd],[filename],plugName,MB_OK
- pop ebp
- mov eax,TRUE
- retn
- endp
Анализатор DiE предоставляет гораздо больше возможностей для плагинописателей, Однако минимальный набор обязательных функций не намного отличается от предыдущего. Это DiePlugName - получение имени плагина и DiePlugProc - выполнение действий с загруженным файлом.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; DiE - запрос имени плагина
- ;-----------------------------------------------------------
- proc DiePlugName
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; DiE - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл главного окна DiE
- ; filename - указатель на полный путь загруженного файла
- ; die_name - указатель на полный путь DiE
- ;-----------------------------------------------------------
- proc DiePlugProc hwnd:DWORD, filename:DWORD, die_name:DWORD
- ; Окно с именем загруженного файла
- invoke MessageBox,[hwnd],[filename],plugName,MB_OK
- ret
- endp
Арабский анализатор FastScanner прекрасно поддерживает плагины от PEiD, однако при этом использует и свой собственный формат плагинов. В программе "родные" плагины отмечаются галочкой. Официального PDK для этого анализатора нет, но все становится понятно, если посмотреть на его плагины в дизассемблере. Функция PluginStart возвращает название плагина, а функция Action выполняет действия с загруженным файлом.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; FastScanner - запрос имени плагина
- ;-----------------------------------------------------------
- proc PluginStart
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; FastScanner - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл главного окна FastScanner
- ; filename - указатель на полный путь загруженного файла
- ;-----------------------------------------------------------
- proc Action hwnd:dword,filename:dword
- ; Окно с именем загруженного файла
- invoke MessageBox,[hwnd],[filename],plugName,MB_OK
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; SCANiT - запрос имени плагина
- ;-----------------------------------------------------------
- proc GetPluginName
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; SCANiT - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл главного окна SCANiT
- ; filename - указатель на полный путь загруженного файла
- ;-----------------------------------------------------------
- ; ВАЖНО!! Реальный указатель на путь файла приходит в
- ; регистре EDX, а хэндл окна в регистре EAX
- ;-----------------------------------------------------------
- proc StartPlugin hwnd:dword,filename:dword
- ; EAX -> hwnd
- ; EDX -> filename
- ; Окно с именем загруженного файла
- invoke MessageBox,eax,edx,plugName,MB_OK
- ret
- endp
Анализатор ExeScan по формату плагинов очень похож на PEiD, разница только в названиях экспортируемых функций и в порядке следования параметров. Его автору - PuNkDuDe - можно было бы запросто использовать формат PEiD, но он предпочел пойти своим путем. Ничего страшного, поддержка этого анализатора добавляется двумя функциями. LibName возвращает название плагина, а DoFeature выполняет нужные действия с загруженным файлом.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; ExeScan - запрос имени плагина
- ;-----------------------------------------------------------
- proc LibName
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; ExeScan - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; filename - указатель на полный путь загруженного файла
- ; hwnd - хэндл главного окна ExeScan
- ;-----------------------------------------------------------
- proc DoFeature filename:dword, hwnd:dword
- ; Окно с именем загруженного файла
- invoke MessageBox,[hwnd],[filename],plugName,MB_OK
- ret
- endp
Остался последний анализатор - Bit Detector. Его автор также отказался от использования де-факто стандартных форматов плагинов PEiD. Так, в функции PluginName, получающей информацию о плагине, обязательным значением является не только название плагина, но и имя его автора.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Bit Detector - запрос имени плагина и автора
- ;-----------------------------------------------------------
- ; Параметры:
- ; PluginInfo - указатель на структуру (2 DWORD), в которую
- ; надо записать указатели на имя автора плагина и название
- ;-----------------------------------------------------------
- proc PluginName PluginInfo:DWORD
- ; Указатель на структуру
- mov eax,[PluginInfo]
- ; Первый DWORD - указатель на имя автора
- mov dword [eax],plugAuthor
- ; Второй DWORD - указатель на название плагина
- mov dword [eax+4],plugName
- mov eax,TRUE
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Bit Detector - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл главного окна Bit Detector
- ; filename - указатель на полный путь загруженного файла
- ;-----------------------------------------------------------
- proc RunPlugin hwnd:dword,filename:dword
- ; Окно с именем загруженного файла
- invoke MessageBox,[hwnd],[filename],plugName,MB_OK
- ret
- endp
А теперь попробуем совместить несовместимое, добавим в наш мульти-плагин поддержку программы PE Tools. Эта программа не предназначена для анализа файлов, поэтому в ней не предусмотрены штатные функции по передаче информации о выбранном файле в плагины. По сути плагины для PE Tools - это самостоятельные программы, которые запускаются в контексте приложения PE Tools и больше никак с ним не взаимодействуют. Используются всего две функции - GetPTPluginName для получения названия плагина и StartPTPlugin для его запуска. Первая функция мало чем отличается от описанных выше.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; PE Tools - запрос имени плагина
- ;-----------------------------------------------------------
- proc GetPTPluginName
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; PE Tools - выполнение действий с загруженным файлом
- ;-----------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл главного окна PE Tools
- ;-----------------------------------------------------------
- proc StartPTPlugin hwnd:dword
- ; Найти окно со списком процессов
- invoke EnumChildWindows,[hwnd],EnumChildProc,0
- ; Окно с именем выбранного файла
- invoke MessageBox,[hwnd],buff,plugName,MB_OK
- ret
- endp
Code (Assembler) : Убрать нумерацию
- szPTClass db 'SysListView32',0
- szIdleProc db '[System Idle Process]',0
- buff rb MAX_PATH ; Путь к файлу
- lvi LV_ITEM ; Структура для работы со списком
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; PE Tools - перебор дочернего списка
- ;-----------------------------------------------------------
- proc EnumChildProc hwnd: DWORD, lParam:DWORD
- ; Найти список процессов
- invoke GetClassName,[hwnd],buff,MAX_PATH
- invoke lstrcmp,buff,szPTClass
- ; Очистить строку
- mov byte [buff],0
- or eax,eax
- jnz @f
- ; Получить выбранную строку списка
- invoke SendMessage,[hwnd],LVM_GETSELECTEDCOUNT,0,0
- or eax,eax
- jz @f
- invoke SendMessage,[hwnd],LVM_GETSELECTIONMARK,0,0
- cmp eax,-1
- je @f
- ; Получить текст из ячейки списка
- mov [lvi.iItem],eax
- mov [lvi.mask],LVIF_TEXT
- mov [lvi.iSubItem],0
- mov [lvi.pszText],buff
- mov [lvi.cchTextMax],MAX_PATH
- invoke SendMessage,[hwnd],LVM_GETITEM,0,lvi
- ; Пропустить системные процессы
- invoke lstrcmp,buff,szIdleProc
- or eax,eax
- jz @f
- ; Строка пустая
- cmp byte [buff],0
- je @f
- mov eax,FALSE
- ret
- @@:
- ; Очистить строку
- mov byte [buff],0
- mov eax,TRUE
- ret
- endp
Осталось объединить все полученные знания в одном плагине. В приложении готовый исходник и скомпилированный демонстрационный мульти-плагин для PEiD, DiE, Bit Detector, SCANiT, ExeScan, FastScanner и PE Tools. А реальный рабочий мульти-плагин для анализаторов исполняемых файлов вы можете посмотреть в моей утилите File Location Calculator.
Просмотров: 7042 | Комментариев: 8
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Hek
(24.09.2013 в 12:48):
ManHunter, ну хз, может кому пригодятся)
ManHunter
(24.09.2013 в 12:45):
И нахрена тут эта полезная информация?
Hek
(24.09.2013 в 12:43):
Нашел исходники PE Tools 1.5.800.2006 rc7
sourceforge.net/projects/pe-tools/
Правда последняя версия стоит 3$ на shareit, и 5$ на sellboxhq.
sourceforge.net/projects/pe-tools/
Правда последняя версия стоит 3$ на shareit, и 5$ на sellboxhq.
ManHunter
(07.05.2013 в 12:53):
Добавил поддержку FastScanner и PE Tools, архив и статья обновлены.
ManHunter
(19.04.2013 в 17:55):
Добавил поддержку анализатора ExeScan, подкорректировал информацию по SCANiT, архив и статья обновлены.
IMPosTOR
(18.01.2013 в 22:03):
Good job!
tnx
tnx
ManHunter
(11.01.2013 в 10:36):
Это точка входа для dll, она должна быть всегда. Эта процедура вызывается в момент загрузки библиотеки.
brute
(11.01.2013 в 10:24):
здесь несложно.. Процедуру DllEntry обязательно использовать или просто "так положено"?
Добавить комментарий
Заполните форму для добавления комментария