Управление дизассемблером IDA Pro из своего приложения
Управление дизассемблером IDA Pro из своего приложения
В одной из предыдущих статей я приводил пример скрипта для запуска hex-редактора HIEW из дизассемблера IDA. Это действительно удобно и экономит кучу времени. Но при ковырянии очередной программы у меня возникла мысль, а можно ли управлять дизассемблером IDA из другого приложения? Конкретно было бы очень полезно реализовать возможность быстрого перехода в листинге дизассемблера на заданный адрес. Например, в HIEW или File Location Calculator нашли нужный адрес и какой-нибудь командой синхронизировали его с результатами работы дизассемблера. Из скриптов или плагинов IDA управляется через обширное по функционалу и неплохо документированное API, но вот никаких штатных инструментов или методов для взаимодействия сторонних приложений напрямую с дизассемблером я не нашел.
После непродолжительных раздумий я решил просто эмулировать действия пользователя, то есть нажатие на горячую клавишу для вызова окна перехода на адрес, копирование и вставка адреса перехода и, собственно, сам переход. Сказано - сделано. Также эта статья может считаться продолжением материала про управление другим приложением из своей программы. Методы, описанные здесь, могут быть использованы не только при работе с IDA, но и для взаимодействия с другими приложениями.
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------------
- ; Процедура перехода на выбранный адрес в IDA Pro
- ;----------------------------------------------------------------------
- ; Параметры:
- ; szAddr - указатель на строку адреса
- ;----------------------------------------------------------------------
- proc ida_jump_to_address szAddr:DWORD
- pusha
- ; Адрес пустой, ничего не делать
- mov esi,[szAddr]
- cmp byte [esi],0
- je .loc_ret
- ; Найти главное окно IDA
- invoke FindWindow,.ida_class,NULL
- or eax,eax
- jz .loc_ret
- mov ebx,eax
- ; Какой-то диалог уже открыт?
- invoke FindWindow,.dlg_class,NULL
- or eax,eax
- jnz .loc_ret
- ; Активировать окно IDA
- invoke SetForegroundWindow,ebx
- invoke SendMessage,ebx,WM_ACTIVATE,0,WA_CLICKACTIVE
- ; Послать хоткей Jump to address
- invoke keybd_event,'G',0,0,0
- invoke keybd_event,'G',0,KEYEVENTF_KEYUP,0
- ; Ожидать окно Jump to address в течение 1 секунды
- xor ebx,ebx
- @@:
- invoke FindWindow,.dlg_class,.jump_title
- or eax,eax
- jnz @f
- invoke Sleep,5
- inc ebx
- cmp ebx,200
- jne @b
- ; Окно так и не появилось
- jmp .loc_ret
- @@:
- ; Активировать окно Jump to address
- invoke SetForegroundWindow,eax
- ; Записать в буфер обмена адрес перехода
- invoke OpenClipboard,0
- invoke EmptyClipboard
- invoke GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,10
- mov ebx,eax
- invoke GlobalLock,ebx
- mov esi,[szAddr]
- mov edi,eax
- mov ecx,10
- repnz movsb
- invoke GlobalUnlock,ebx
- invoke SetClipboardData,CF_OEMTEXT,ebx
- invoke CloseClipboard
- invoke GlobalFree,ebx
- ; Эмулировать нажатие Ctrl+V
- invoke keybd_event,VK_LCONTROL,0,0,0
- invoke keybd_event,'V',0,0,0
- invoke keybd_event,'V',0,KEYEVENTF_KEYUP,0
- invoke keybd_event,VK_LCONTROL,0,KEYEVENTF_KEYUP,0
- ; Эмулировать нажатие Enter
- invoke keybd_event,VK_RETURN,0,0,0
- invoke keybd_event,VK_RETURN,0,KEYEVENTF_KEYUP,0
- .loc_ret:
- popa
- ret
- .ida_class db 'TIdaWindow',0 ; Название класса окна IDA
- .dlg_class db 'TMyDialog',0 ; Название класса окна диалога
- .jump_title db 'Jump to address',0 ; Заголовок окна перехода
- endp
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- address db '0042BDEE',0
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Перейти на нужный адрес в листинге дизассемблера
- stdcall ida_jump_to_address,address
- ...
По результатам тестирования и из-за выявленных недостатков я решил пока оставить эту разработку в состоянии "полуфабриката", без практического применения в своих программах. Примеров использования также не будет.
Просмотров: 5052 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Fast
(05.03.2016 в 14:47):
ильФак жадный и зажравшийся. Одно не пойму: зачем юзеры ему помогают в отладке, если он болт давно положил на исправление багов?!
ManHunter
(08.02.2016 в 12:02):
Тихий запуск нужен только если используется скрипт, который сам все делает и не требует взаимодействия с пользователем.
Для решения этой задачи вообще ничем не поможет.
Для решения этой задачи вообще ничем не поможет.
brute
(08.02.2016 в 09:40):
в IDA есть интересные параметры командной строки - раздел справки "Command line switches":
-A -тихий запуск нужной проги без всяких диалоговых окон (у меня работает:)
-b#### -"loading address, a hexadecimal number, in paragraphs". Я написал ильфаку с просьбой пояснить, как сие использовать. Он затребовал номер моей лицензии. Я сказал, что юзаю IdaFree_5.0. Он ответил, что техподдержка только для купивших иду..
-A -тихий запуск нужной проги без всяких диалоговых окон (у меня работает:)
-b#### -"loading address, a hexadecimal number, in paragraphs". Я написал ильфаку с просьбой пояснить, как сие использовать. Он затребовал номер моей лицензии. Я сказал, что юзаю IdaFree_5.0. Он ответил, что техподдержка только для купивших иду..
Добавить комментарий
Заполните форму для добавления комментария