Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Исследование Marriage for windows v2.3 по-русски

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


"Знал бы прикуп -
Жил бы в Сочи"

Все, надеюсь, любят играть в преферанс. Например, я провожу за этим делом больше, чем за исследованием программ (шутка :) Вот попалась мне в руки Windows-версия этой программки и мне сразу понравилась. Но когда я стал понемногу проигрывать, а мой брат, который зарегистрировался и поставил пароль, стал выигрывать, меня начала терзать весёлая мысля: "..."

Итак, во-первых мне захотелось поиграть за компьютер, т.е. под одним из имен (рентген, бакалавр...) но когда их выбираешь, то кнопка "Новая Игра" становится недоступной (disable). Будем ломать... ставим бряк bpx EnableWindow do "p ret"
- эта функция может сделать enable/disable с почти любым объектом (стандартным и не очень Ж) теперь попытаемся кликнуть на любого компьютерного игрока и вываливаемся в айсе тут (листинг взят из WDasm'a):
:00437EFD E8DAEEFCFF              Call user32.EnableWindow
:00437F02 5B                      pop ebx
:00437F03 C3                      ret
Как видите, функция вложенная, т.е. вызывается откуда-то, поэтому скролим по программе (F10) выходя из вложенных функций (т.е. проходя по ret'am), и очень скоро мы очутимся вот тут:
:004DC350 FF5228                  call [edx+28] <--проверка, кто есть игрок
:004DC353 84C0                    test al, al   <-- если он компьютер
:004DC355 7504                    jne 004DC35B <--то не прыгаем и значит кнопка "Новая игра" disable
:004DC357 33DB                    xor ebx, ebx
:004DC359 EB02                    jmp 004DC35D
:004DC35B B301                    mov bl, 01
:004DC35D 8BD3                    mov edx, ebx
:004DC35F 8B86A0030000            mov eax, dword ptr [esi+000003A0]
:004DC365 8B08                    mov ecx, dword ptr [eax]
:004DC367 FF5160                  call [ecx+60]
:004DC36A 8BD3                    mov edx, ebx  <-- Мы тут
:004DC36C 8B8684030000            mov eax, dword ptr [esi+00000384]
:004DC372 8B08                    mov ecx, dword ptr [eax]
судя по отсутствию поблизости ret'ов мы вышли из вложенных функций и видим, что по адресу 004DC355 интересный прыжок, убираем все бряки и ставим бряк на этот самый прыжок и выходим из айса. Теперь нажимаем на компьютерного игрока и видим, что прыжок не выполняется, выходим из айса, выбираем своего игрока и в айсе видим, что прыжок выполняется, т.е. нужно заменить jne 004DC35B на jmp 004DC35B и теперь при любом игроке кнопка "Новая игра" будет enable! Теперь можно "поиграть" допустим за "бакалавра", и каждый раз говорить мизер, даже когда нужно говорить 10 БК! Вот это кайф :) (после 10 минут такой игры у бакалавра было около -10000 :)

Во-вторых я хотел "поиграть" за своего брата чтобы понизить его ставки, но он поставил пароль, которого я не знаю :( , будем ломать... беру RegMon, запускаю его, запускаю марриаж, создаю нового игрока, ввожу пароль, иду в RegMon и смотрю, куда же марриаж записывает пароли и вижу:
HKEY_LOCAL_MACHINE\Software\Marriage\Users\User2
т.е. программа для каждого юзера создает раздел "user"+номер_юзера. в каждом разделе есть ключ "password" - интересно. Изучать алгоритм шифрования я не стал, я просто скопировал значение ключа "Password" у своего игрока и записал это значение в ключ "Password" у игрока брата :)
Теперь оказалось, что у брата стоит мой пароль :) представляю его лицо :)
Теперь я "поиграл" за брата, как и с бакалавром и на всякий случай вернул значение его пароля назад.

В-третьих мне жутко не нравится реклама, поэтому я отважился убрать всю рекламу в главном окне (там 4 баннера и одна бегущая строка) - Всё равно все эти ссылки на паги в инете есть в Хелпе.
Я не стал открывать Америку и искать создание окон, я подумал: раз программа не попакована, написана на делфи, то сам Бог велел использовать программку типа ExeScope, для выдирания и изменения ресурсов.
Запускаем ExeScope, идём в раздел Resource, потом открываем раздел RCData, здесь хранится информация обо всех Form'ax программки, причём все свойства этих форм можно править :) После небольших поисков я нашёл в форме TMarriageMain вот что:
object RunString: TPanel;
  судя по названию - это та самая бегущая строка
    Left = 10
    Top = 366
    Width = 677;
  !!!правим длинну окна на 0
    Height = 51;
  !!!и высоту на 0
    BorderWidth = 3
    Caption = 'RunString'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clRed
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
    TabOrder = 1
    Visible = False
    object Panel5: TPanel
    Left = 4
      Top = 4
      Width = 669;
    !!!правим длинну окна на 0
      Height = 43;
    !!!и высоту на 0
      Align = alClient
      BevelOuter = bvLowered
      Caption = 'Panel5'
      TabOrder = 0
      object RunLabel1: TRunLabel
      Left = 1
        Top = 1
        Width = 667;
      !!!правим длинну окна на 0
        Height = 41;
      !!!и высоту на 0
        ..........поскипано.........
    end
после того как мы подправили в трёх местах длинну и высоту окна на 0 больше окна с бегущей строкой мы не увидим. Осталось четыре баннера...
Я искал хоть какой-нибудь намёк на описание баннеров в ресурсах, но не нашёл и решил ломать в лоб:
ставим бряк
bpx createwindowExA do "p ret" запускаем марриаж и фигеем, потому как эта функция при запуске вызывается около 200 (!) раз, это не удивительно: стоко ресурсов и написана на делфи. Короче, нам надо словить момент создания окон баннеров, т.е. нам нужен тот createwindowExA после которого появится баннерное окно. Я сделал так: убрал все бряки, запустил марриаж и в тот момент, когда уже появилось главное окно, но ещё не создались окна баннеров (там будет пару секунд времени чтобы успеть), я захожу в айс и ставлю бряк:
bpx createwindowExA do "p ret"
теперь F5 До тех пор, пока не появится рамка первого баннера (на месте баннера должна появится характерная серая рамка :). и когда мы вывалились в айсе после создания этой самой рамки, то это должно произойти где-то тут:
:00435F33 E8040EFDFF              Call user32.CreateWindowExA
:00435F38 898640010000            mov dword ptr [esi+00000140], eax
:00435F3E 5E                      pop esi
:00435F3F 5B                      pop ebx
:00435F40 C3                      ret
выходи из этой процедуры, оказываемся тут:
:00435E90 83BB4001000000          cmp dword ptr [ebx+00000140], 00000000
:00435E97 7505                    jne 00435E9E
:00435E99 E8C66BFDFF              call 0040CA64
теперь скролим, выходя из вложенных функций, пока не окажемся вот тут:
:004D74B9 E8B6B6F5FF              call 00432B74 <-- проверяем нужны ли баннеры
:004D74BE 8B8614050000            mov eax, dword ptr [esi+00000514]
:004D74C4 85C0                    test eax, eax
:004D74C6 742B                    je 004D74F3 <--если да - НЕпрыгаем
:004D74C8 8B7808                  mov edi, dword ptr [eax+08]
:004D74CB 4F                      dec edi
:004D74CC 85FF                    test edi, edi
:004D74CE 7C23                    jl 004D74F3
:004D74D0 47                      inc edi
:004D74D1 C745FC00000000          mov [ebp-04], 00000000
:004D74D8 8B55FC                  mov edx, dword ptr [ebp-04]
:004D74DB 8B8614050000            mov eax, dword ptr [esi+00000514]
:004D74E1 E88E94F3FF              call 00410974
:004D74E6 8BD3                    mov edx, ebx
:004D74E8 E887B6F5FF              call 00432B74 <--создание окон баннеров (это та самая ф-ия, в котороы сработал бряк)
:004D74ED FF45FC                  inc [ebp-04]
:004D74F0 4F                      dec edi
:004D74F1 75E5                    jne 004D74D8 <--все создали? если нет - прыгаем
как видите, все окна баннеров создаются в цикле, а по адресу 004D74C6 можно этот цикл перепрыгнуть, заменив je 004D74F3 на jmp 004D74F3.
Теперь больше не появляются баннеры! Ура!

ВсЁ!

А для самых ленивых, крак:
--------вырезать тут----------
marriage for windows v2.3 CracK by vallkor//PTDS

Removes Banners. You can play as Bakalavr.
marriage.exe
000DB755: 75 EB
000D68C6: 74 EB
-----------и тут-------------

Исследовал и наваял туториал:
vallkor //PTDS
e-mail: vallkor@chat.ru
page: http://vallkor.chat.ru

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