Создаём скрытый TeamViewer #3

Настало время наполнить нашу DLL кодом!

Для начала преобразуем проект Visual Studio под DLL, для этого изменим Makefile:

Заметьте, появились новые флаги:

/DLL — говорит link.exe собирать динамическую библиотеку

/DEF:Version.def — в файле размещаются функции, которые будет экспортировать наша библиотека

Файл Version.def пока не имеет функций, это лишь только заготовка:

main.c

Нажимаем в F7 и наша DLL скомпилирована.

Начинаем новые эксперименты, подкидываем полученную Version.dll к распакованному TeamViewer (в папку tvfiles) и запускаем TeamViewer.exe.

Получаем ошибку при загрузке Version.dll

ver_api

Эти ошибки означают то что загрузчик не смог найти в экспорте Version.dll нужных функций. Удовлетворим потребность Windows загрузчика! Для этого:

  1. Объявляем функцию с таким же названием как в ошибке
  2. В теле функции получаем адрес оригинальной и вызываем её

Код который получает адрес оригинальной функции:

На вход функции GetAPI подается два параметра lib — имя библиотеки, name — имя функции. LoadLibraryA загружает динамическую библиотеку по абсолютному пути, тем самым мы избегаем hijacking.

Рассмотрим этот процесс по шагам:

  1. Запоминаем название функции из сообщения об ошибке (например, GetFileVersionInfoSizeW)
  2. Гуглим «GetFileVersionInfoSizeW msdn» link
  3. Смотрим в каком заголовочном файле (header) объявлена наша функция — Windows.h
  4. Вписываем слово GetFileVersionInfoSizeW в DllMain и нажимаем F12 (Go To Definition), тем самым переходя на ее объявление.
  5. Копируем объявление функции и вставляем в main.c
  6. Добавляем имя функции GetFileVersionInfoSizeW в Version.def
  7. Компилируем по F7, и убеждаемся что нет ошибок.
  8. Повторяем до получения рабочей библиотеки =)

В результате данной работы вы получите следующий код:

main.c

В DllMain я добавил вывод сообщения —  MessageBoxA(0,»I’m Hacker!»,»Hi»,0), которое будет отображаться при успешной загрузке Version.dll

Version.def

Makefile

Компилируем и убеждаемся что у Version.dll появился экспорт. Для этого переходим в Far к Version.dll и нажимаем Alt+F4 -> Enter (hex отображение) -> F8 -> F9 (просмотр экспорта) И увидим в  Hiew:

exp

Забрасываем Version.dll в tvfiles, запускаем TeamViewer.exe и видим сообщение:

hacker

После нажатия OKей, ошибок c экспортом больше нет, TeamViewer запустился. Это означает что мы подменили функции корректно.

Настраиваем отладку

Для удобной разработки кода в Version.dll нужно настроить отладку в Visual Studio, для этого размещаем распакованный tvfiles рядом с каталогом проекта tv, и в настройках студии прописываем путь до файла TeamViewer.exe

debug

При запуске студия скажет, что не нашла символы pdb, и спросит нужно ли исполнять файл, выбираем Yes, и можно поставить галочку что бы окно больше не появлялось.

Теперь мы можем отлаживать код внутри процесса TeamViewer.exe, не правда ли удобно?

dll

В следующем выпуске мы научимся перехватывать API функции, и управлять поведением TeamViewer.exe

7 thoughts on “Создаём скрытый TeamViewer #3

  1. Вписываем слово GetFileVersionInfoSizeW в DllMain и нажимаем F12 (Go To Definition), тем самым переходя на ее объявление.
    Как это понять и где найти?

    1. В код можно вставить имя функции, выделить и по F12 найти её объявление в заголовочных файлах.

  2. Привет. Сейчас скачал последний тимвьювер, подобрал дллку: при наличии которой ТВ выдает ошибки, если она пустая. Но, когда подсовываю компилированную длл с этим жэ названием, ТВ запускается как ни в чем не бывало. В программировании я новичек. Может натолкнете в какую сторону копать? Или уже все пофиксили и нужен кардинально другой способ? Спасибо

    1. Автор статьи нас покинул, но я постараюсь ответить за него. Скачал и бегло посмотрел реакцию тимки — если закинуть в диру системный version.dll слегка поменяв файл — он будет загружен, достаточно посмотреть список модулей (и их расположение на диске) в ProcessHacker. Иначе говоря, это может сработать, но с расхождениями по тексту статьи.

  3. Тема уже не актуальна ибо все LoadLibrary переписали с условием загрузки из windows/system32
    Подвержены этому типу уязвимости вроде только оч старые версии
    как-то так =)

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