Защищаем пароль в TeamViewer

TeamViewer, как и большинство программных продуктов, обладает опцией сохранения пароля от своего профиля (профиль используется для упорядоченного хранения перечня идентификаторов удаленных компьютеров с реквизитами доступа к ним). При включенной опции сохранения, пароль прозаично сохраняется в реестре по адресу HKCU\Software\TeamViewer\Version* в переменной BuddyLoginPWAES.


Как видно из названия переменной, да и непосредственно из реестра, перед сохранением пароль шифруется, однако это не является проблемой, т.к. ключи шифрования легко получить, а также никто не мешает просто скопировать содержимое переменной из реестра, перенести на другой компьютер и там успешно авторизоваться. Отсюда возникает некоторое опасение, так как всегда существует вероятность запустить очередной password stealer, который всё благополучно утащит.
Попробуем решить эту проблему костыльно-велосипедным способом. Для этого напишем небольшую библиотеку, которая будет перехватывать обращения к реестру и осуществлять дополнительное шифрование пароля, а также лаунчер для тимвьювера, который будет запускать его и заодно подгружать нашу библиотеку.

Библиотеку будем писать на MASM, ибо C и Detours быстро надоедают. Начнем как всегда сначала.

Стандартные неинтересные инклюды, за исключением inject.asm, старая структура, которая вместе с inject.asm была описана в этой статье, и прототип функции для проверки некоторых аргументов у перехватываемых в дальнейшем функций (RegSetValueExW, RegQueryValueExW).
Перейдем к секции данных

Тут всё ещё более тривиально, поэтому перейдем к чуть менее тривиальному коду, который будет состоять из нескольких функций.

Как видно из вышеописанного кода, мы используем тривиальный XOR для шифрования, его вполне достаточно для наших целей, вдобавок не меняется размер данных после шифрования-дешифрования. Также кому-то может быть не сразу понятно, что из себя представляют аргументы вида [ebp + 4 + 4 * x], тут всё просто - это обращение к N-ому аргументу stdcall функции (например, [ebp + 4 + 4 * 4] - это четвертый по счету аргумент функции RegQueryValueExW, то есть lpType), чуть подробнее всё это описывалось в вышеупомянутой статье про инжектор. Теперь рассмотрим LibMain:

В функции наблюдается смесь из макросов, которые можно использовать для Winapi-функций с обычным прологом и костыля для нестандартной RegSetValueExW. Подход не является хорошей практикой, т.к. корректнее было бы прикрутить дизассемблер длин и сделать всё как надо, но кому это нужно в данном контексте?
С библиотекой закончили, осталось её скомпилировать, для этого можно воспользоваться, например, этим набором, либо взять всё с "официального сайта.
Перейдем к элементарному лаунчеру. Тут я позволю себе воспользоваться ранее написанным классом. С его использованием код сокращается до пары десятков строк. Вот он:

Остается только скопировать полученную библиотеку вместе с лаунчером в папку TeamViewer'a и наслаждаться результатом. Описанная методика применима для любой программы, которая хранит свои пароли в реестре.

Исходный код: скачать

Защищаем пароль в TeamViewer: 8 комментариев

      1. Спасибо за статью.
        Применимо, но только минус в том, что для каждой проги нужно писать отдельный код и кроме того могут быть проблемы с разными версиями одной и той самой проги. Немного более универсальный способ (но в некотором смысле и опасный) - внедрять библиотеку в программу, которую нужно защитить, при первом же ее запуске, и шифровать абсолютно все ключи реестра, которые пишет и модифицирует эта программа. Может быть незначительное падение быстродействия (незаметное) и будут проблемы в том случае, если программа модифицирует ключ, к которому обращаются другие программы.

  1. Спасибо.
    Но по моему надо поправить ...
    >Стандартные неинтересные инклюды, за исключением inject.asm, старая >структура, которая вместе с inject.asm была описана в этой статье
    ... в "этой статье" она называлась mem.asm.
    Или я что-то путаю?

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

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *