Написание плагинов для API шпиона kerberos

Дата публикации 18 мар 2005

Написание плагинов для API шпиона kerberos — Архив WASM.RU

Сам себя непохвалишь-никто непохвалит

В данной статье я хочу показать, как пишутся плагины для API-шпиона kerberos 1.01

Самого шпиона можно взять на  WWW.WASM.RU (раздел Утилиты)

Без поддержки плагинов - создание нового API-шпиона имело бы мало смысла, т.к. можно было бы использовать любой другой. С другой стороны свои плагины дают возможность безграничного контроля над функциями используемыми приложением и самим приложением тоже.

Общие аспекты:

1. Одновременно может работать только один плагин

2. Файл плагина всегда называется ke_plug.dll

3. Плагин считается установленным, если лежит в директории с ke_core.dll

Шпион написан исключительно на ассемблере (masm32), как на самом лучшем языке программирования, и плагин тоже пишется на нем. В каждом плагине должна присутствовать функция инициализации plug_setup. Она возвращает в eax значение 0, если рапорт шпиона необходим, иначе рапорт создан не будет. Это нужно если вы собираетесь использовать kerberos как загрузчик программ.

Также в каждом плагине должна быть функция plugin - это основной код плагина.Функции plugin и plugin_setup должны являться экспортируемыми, иначе работать не будет.(Самое лучшее воспользоваться готовым примером из папки ke_plug)

Давайте, наконец, рассмотрим шаблон, который подойдет для всех плагинов.

Код (Text):
  1.  
  2. ke_plug.asm
  3. ............................
  4. ............................
  5. ;Возвращаем значение рапорт нужен\ненужен
  6. plug_setup proc
  7. mov eax, REPORT_OFF
  8. ret
  9. plug_setup endp
  10. ; Вызывается каждый раз, при перехвате любой функции, которая есть в базе
  11. plugin proc
  12. pop ret_address ;Снимаем со стека адрес возврата
  13. pop func_adr ;Адрес начала перехваченной функции
  14. pop func_par ;Количество параметров функции
  15. pop func_nam ;Указатель на имя функции
  16. pop func_return_address ;Адрес возврата в вызывающую программу
  17. pop func_idx ;Индекс функции в базе
  18. pushfd
  19. pushad
  20. mov eax, func_adr
  21. ;Ваш код должен быть здесь
  22. .if eax == FUNC_0
  23. ;Выполняем действия, которые хотим
  24. ;.............................................
  25. ;Восстанавливаем регистры и вызываем функцию
  26. ;Можно не вызывать, но надо будет сбалансировать стек от параметров функции
  27. popad
  28. popfd
  29. call func_adr
  30. ;Если у нас другая функция, для которой установлен плагин
  31. .elseif eax == FUNC_1
  32. .......................
  33. ;Никакая функция не подошла- просто вызываем перехваченную функцию
  34. .else
  35. popad
  36. popfd
  37. call func_adr
  38. .endif
  39. ;Возвращаемся туда, откуда пришли
  40. push ret_address
  41. ret
  42. plugin endp

Ничего сложного. Надеюсь, что непонятные стороны прояснятся в разборе конкретного примера.

Рассмотрю, как можно сделать граббер музыки с записью музыки в wav файл. (Я тестировал его на демке UberNuss. Если будете пробовать на ней незабудьте вытащить из нее Win32 exe. В общем она 4кб, и сделана как com - файл, который распаковывается и запускает сам PE файл)

Программа из которой будет вытаскиваться музыка, должна пользоваться для вывода звука следующими функциями из winmm.dl:

waveOutOpen, waveOutWrite

Первым делом модифицируем файл ke_spy.txt, чтобы в нем были эти самые функции, иначе получится вот что - нет перехвата этих функций, и нет вызова нашего кода из плагина. Если нужны только две функции, то нет необходимости перехватывать остальные - так надежнее. Сам ke_spy.txt для нашего плагина будет выглядеть так:

Код (Text):
  1.  
  2. [winmm.dll]
  3. waveOutOpen, 6
  4. waveOutWrite, 3

Дальше сам плагин. Приведу только ключевую часть, полностью смотрите в исходниках.

Главное, что делает плагин:

  1. Открывает файл для вывода туда данных

  2. Пишет первую часть заголовка (по шаблону)

  3. Записывает вторую часть заголовка (берется из параметров функции waveOutOpen

  4. Дописывает заголовок wav файла

  5. Выводит буфер, переданный в функцию waveOutWriteв выходной файл.

  6. После окончания закрывает выходной файл

Если интересно, описания функции есть в MSDN, сам формат wav- файла есть в сети.

Остается заметить, что в нем незаполнены два поля (DWORD)- по смещению 04h и 024h должны быть равны Размер Файла -8 и Размер Файла - 44 соответственно, хотя можно послушать и так. (Пробовал в WinAmp5.0)

Код (Text):
  1.  
  2. ;Имя выходного файла и заголовок wav - файла
  3. ofile db "m.wav",0
  4. wavhead_0 db "RIFF"
  5. db 0,0,0,0
  6. db "WAVE"
  7. db "fmt "
  8. dd 10h
  9. wavhead_1 db "data"
  10. db 0,0,0,0
  11. install_plugin proc
  12. invoke LoadLibrary,offset sz_winmm
  13. mov hwinmm, eax
  14. invoke GetProcAddress, eax, offset sz_waveOutOpen
  15. mov waveOutOpen_addr, eax
  16. invoke GetProcAddress, hwinmm,offset sz_waveOutWrite
  17. mov waveOutWrite_addr, eax
  18. invokeCreateFile,offset ofile,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
  19. mov hwavfile, eax
  20. ret
  21. install_plugin endp
  22.  
  23. plugin proc
  24. pop ret_address
  25. pop func_adr
  26. pop func_par
  27. pop func_nam
  28. pop func_return_address
  29. pop func_idx
  30. pushfd
  31. pushad
  32. mov eax, func_adr
  33. ;Если адрес перехваченной функции совпал, то действуем
  34. .if eax == waveOutOpen_addr
  35. ;Пишем в файл заголовок wav - файла
  36. invoke WriteFile,hwavfile,offset wavhead_0,20,ADDR bwri,NULL
  37. ;Пишем в файл структуру, переданную функции waveOutOpen(должна быть в заголовке)
  38. mov eax, [esp+2Ch] ;LPWAVEFORMATEX
  39. invoke WriteFile,hwavfile, eax,10h,ADDR bwri,NULL
  40. ;Дописываем в файл заголовок
  41. invoke WriteFile,hwavfile, offset wavhead_1,8,ADDR bwri,NULL popad
  42. popfd
  43. call func_adr
  44. ;Если мы перехватили waveOutWrite, то выводим её звукой буфер в наш файл, а уже потом играем.
  45. .elseif eax == waveOutWrite_addr
  46. mov eax, [esp+28h] ;LPWAVEHDR
  47. mov ecx, [eax] ;lpData
  48. mov edx, [eax+4] ;dwBuffer
  49. invoke WriteFile,hwavfile, ecx, edx,ADDR bwri,NULL
  50. popad
  51. popfd
  52. call func_adr; Вызвали waveOutWrite
  53. .else
  54. popad
  55. popfd
  56. call func_adr; Ни одна не совпала- прсто вызываем её
  57. .endif
  58. push ret_address; Возвращаемся
  59. ret
  60. plugin endp

Напоследок хочу сказать, что при помощи плагинов можно сделать кое-что более интересное, например цеплять шпиона к создающимся процессам. (Нужен перехват CreateProcess и написать для нее обработчик, который внедрит ke_core.dll при помощи CreateRemoteThread)

© Rustem

0 1.095
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532