Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как узнать пароли игроков в 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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay