скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Как узнать пароли игроков в Marriage For Windows v 2.3



Оформил: DeeCo
Автор: http://www.cracklab.narod.ru

Инструменты:
1) SoftIce
2) HView

Все заядлые игроки в преферанс наверняка сталкивались с этой чудесной реализацией вечной игры. Однако, когда кто-то играет лучше тебя, то хочется ему все испортить, но не тут то было - вход в игру может быть закрыт паролем. А как же его узнать???
В прошлом исследовании мы нашли место, где проверяется введенный нами пароль с тем, который записан в реестре, вот это место:
015F:004C9792  807DFF00            CMP       BYTE PTR [EBP-01],00          <--проверяют совпадают ли длины паролей
015F:004C9796  7447                JZ        004C97DF                      <--если нет - прыжок
015F:004C9798  8D55F0              LEA       EDX,[EBP-10]                   
015F:004C979B  8B45F8              MOV       EAX,[EBP-08]                   
015F:004C979E  8B80DC020000        MOV       EAX,[EAX+000002DC]             
015F:004C97A4  E8B394F6FF          CALL      00432C5C                       
015F:004C97A9  8B45F0              MOV       EAX,[EBP-10]                  <--адрес нашего пароля
015F:004C97AC  8B5374              MOV       EDX,[EBX+74]                  <--адрес правильного пароля
015F:004C97AF  E884A8F3FF          CALL      00404038                      <--сравниваем
015F:004C97B4  750F                JNZ       004C97C5                      <--если равны - НЕ прыгаем
Я обнаружил, что правильный пароль расшифровывается из реестра при запуске программы, т.к. когда я его изменил в памяти, то при следующих попытках ввода пароля мой изменённый пароль принимался за правильный.
Нам нужно найти место в программе, где зашифрованная строка расшифровывается.
Я нашел это место, (а вы?):
015F:004B0759  8B95ACFCFFFF        MOV       EDX,[EBP-0354]     <--"users\user#"           
015F:004B075F  A188484F00          MOV       EAX,[004F4888]     <--           
015F:004B0764  8B00                MOV       EAX,[EAX]          <--00243745h        
015F:004B0766  B998094B00          MOV       ECX,004B0998       <--"Password"            
015F:004B076B  E88038FAFF          CALL      00453FF0           <--читаем и расшифровываем            
015F:004B0770  8B95B0FDFFFF        MOV       EDX,[EBP-0250]     <--адрес уже расшифрованного пароля            
015F:004B0776  8D4674              LEA       EAX,[ESI+74]       <--            
015F:004B0779  E88235F5FF          CALL      00403D00           <--   
Значит по здесь:
015F:004B0770  8B95B0FDFFFF        MOV       EDX,[EBP-0250]
пароль уже расшифрован. А что если не разгадывать алгоритм шифра, а просто после того, как пароль расшифрован показать его! Итак, будем встраивать свою процедуру. Для этого нужно:
1) по адресу 004B0770 сделать безусловный переход на место, куда мы впишем нашу процедуру:
015F:004B0770  	jmp	004F1C10
2) По адресу 004F1C10 напишем нашу процедуру.
3) востановим затертую прыжком операцию: mov edx,[ebp-0250]
4) в самом конце прыжок назад:
jmp 004B0776
После изменений:
	(1)
.004B076B: E88038FAFF                   call       .000453FF0   -------- (1)
.004B0770: E99B140400                   jmp        .0004F1C10   -------- (2)
.004B0775: 90                           nop
.004B0776: 8D4674                       lea         eax,[esi][00074]
	(2)процедура вывода паролей:
.004F1C10: 8B95B0FDFFFF                 mov         edx,[ebp][0FFFFFDB0]
.004F1C16: 50                           push        eax
.004F1C17: 8D4679                       lea         eax,[esi][00079]
.004F1C1A: 6A00                         push        000
.004F1C1C: 50                           push        eax
.004F1C1D: 52                           push        edx
.004F1C1E: 6A00                         push        000
.004F1C20: E86FF6F0FF                   call        MessageBoxA ;user32.dll
.004F1C25: 83EC10                       sub         esp,010 ;""
.004F1C28: 58                           pop         eax
.004F1C29: 5A                           pop         edx
.004F1C2A: 58                           pop         eax
.004F1C2B: 58                           pop         eax
.004F1C2C: 58                           pop         eax
.004F1C2D: E944EBFBFF                   jmp        .0004B0776   -------- (2)
Теперь программа при запуске показывает MessageBox в заголовке которого имя игрока а в тексте - его пароль. Таких сообщений будет ровно столько, сколько игроков. Если игрок не назначил пароль, то сообщение выводиться не будет.
ЗЫ: теперь вы можете всегда узнать пароль другого человека, имея "исправленную" версию marriage.exe
Но это делать низзя, т.к. это прямое нарушение авторских прав.
А вся эта статья только для того, чтобы обучить вас встраивать свой же код в свои же программы!
До следующих встреч.
Исследовал и наваял туториал:
vallkor //PTDS
E-mail: vallkor@chat.ru
Page: http://vallkor.chat.ru






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook