Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Создание No-CD для "Age of empires 2 - The age of kings"

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

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: Phohack <phohack@mail.ru>

Инструменты:

Soft ice какой-нибудь (я использую версию 4.00).
Wdasm32 10 версия.
Любой hex editor.
Желательно иметь PeScan.
Delphi 7 не обязателен если не хотите писать патч.
Предисловие:

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

Исследование:

Эта игра была на диске от "Фаргус"-а. Взял я у друга поиграться, установил, диск вынул, а она без него работать не хочет .

Ну что делать, проверим ехе-шник PEScan-ом, оказывается он не чем не запакован. Откроем его в Wdasm. Когда откроется нажмите кнопку "import function" и найдите строку "Kernel32.getdrivetypea". Функция GetDriveTypeA Проверяет что из себя представляет данный диск, на пример CDRom ли это или Hard. Двойной щелчок на строке и вы увидите такой листинг:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
 |:0041F176(C)
 |
 :0041F183 56 push esi
 
 * Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
 |
 :0041F184 FF159CC16100 Call dword ptr [0061C19C]
 :0041F18A 83F805 cmp eax, 00000005
 :0041F18D 740D je 0041F19C

Курсор должен находиться на той строке которую я пометил синим. Первая строка означает что сия процедура вызывается откуда-то из другого места, а вторая говорит нам что вызов происходит с адреса 0041F176. Идём дальше строка по адресу 0041F18A это сравнение регистра eax с 5 - если eax = 5 тогда данный диск CDRom. Далее идёт условный переход je если данный диск CDRom то происходит прыжок по адресу 0041F19C.

Теперь давайте запустим игру и войдём в Soft ice - ctrl+d, тут ставим бряк на функцию GetDriveTypeA, это делается так bpx GetDriveTypeA. Нажмём F5 для выхода из Soft ice и начнём одиночную игру. Как ни странно но мы не вылетели в soft ice, это значит что игра сначала ищет необходимый файл а уж затем проверяет на сидюке он или нет. Опять заходим в Wdasm, идём на то же место и видим что скачок на данный код произошёл с адреса 0041F176 (Вторая строка в предыдущем листинге). Теперь в главном меню нажмём "goto"-"goto code location" или просто Shift+F12. В появившемся окошке пишем 0041F176 и жмём ОК после чего видим такой листинг:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
 |:0041F14E(C)
 |
 :0041F160 8B8BD4010000 mov ecx, dword ptr [ebx+000001D4]
 
 * Possible StringData Ref from Data Obj ->"CDPath"
 |
 :0041F166 683CD86400 push 0064D83C
 :0041F16B 6A00 push 00000000
 :0041F16D E89EEE0900 call 004BE010
 :0041F172 8BF0 mov esi, eax
 :0041F174 85F6 test esi, esi
 :0041F176 750B jne 0041F183
 :0041F178 5E pop esi
 :0041F179 5B pop ebx
 :0041F17A 81C40C020000 add esp, 0000020C
 :0041F180 C20400 ret 0004


Курсор должен стоять на той строке которую я пометил синим, но пятью строками выше находится очень интересная строчка - * Possible StringData Ref from Data Obj ->"CDPath", значит мы были правы когда предположили что игра сначала ищет файлик ну а потом проверяет на сидюке он или нет. Значит в этом листинге нет ничего интересного для нас кроме опять же второй строки - на ней мы видим что данная процедура вызывается с адреса 0041F14E. Снова главном меню нажмём "goto" - "Goto code location" или просто Shift+F12, а в окошке на сей раз пишем 0041F14E и жмём ОК. После этого вы должны увидеть приведённий ниже листинг:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
 |:0041F0F0(C)
 |
 :0041F147 A16C456600 mov eax, dword ptr [0066456C]
 :0041F14C 85C0 test eax, eax
 :0041F14E 7410 je 0041F160
 :0041F150 5E pop esi
 :0041F151 B801000000 mov eax, 00000001
 :0041F156 5B pop ebx
 :0041F157 81C40C020000 add esp, 0000020C
 :0041F15D C20400 ret 0004


Курсор должен стоять на той строке которую я пометил синим, она то скорее всего и есть та строка которую мы ищем так как именно после неё идёт проверка на наличие компакт диска, но на всякий случай проверим. Запустите игру. Войдите в Soft ice - ctrl+d и там напишите команду addr, теперь вы должны увидеть что-то типа этого:

Handle Addr PID Owner
........ ........ .... .........
xxxxxxxx xxxxxxxx xxxx Empires2

Найдите в графе Owner имя ехе файла через который вы запустили игру (у меня "Empires2"), имя ехе файла может быть не полным (Непример у меня оно не может быть больше 7 символов - лишние урезаются). Если не нашли значит либо вы не запустили игру либо плохо искали, ну а если нашли то пишите addr xxxxxxx где xxxxxxx имя из графы owner (у меня "addr Empires2"). Теперь напишите addr и снова Найдите в графе Owner имя ехе файла через который вы запустили игру (Например addr "Empires2"), оно должно быть помечено зелёным, если не помечено значит жмите F5 потом ctrl+d и снова addr xxxxxxx где xxxxxxx имя из графы owner (иногда в soft ice для Windows98 команда addr не срабатывает с первого раза). Теперь ставьте бряк на адрес 0041F14E (Это адрес той строки которая в предыдущем листинге помечена синим) - делается это так bpx 0041F14E. Выйдите из soft ice нажав клавишу F5 и начните одиночную игру - если вы всё сделали правильно вы должны вылететь в soft ice. Теперь если вы вылетели напишите wr и нажмите Enter, сверху в soft ice появится ещё одно окно, в нём в правой стороне найдите маленькую букву "z" теперь напишите "r fl z" и нажмите Enter, маленькая буква "z" должна измениться на большую "Z" теперь нажмите F10 а затем напишите bc * - для очистки бряков, нажмите Enter и нажмите F5. Теперь игра должна работать, если нет то это значит что вы где-то ошиблись. Это значит что для того чтобы игра работала мы должны сделать так чтобы прыжок je 0041F160 никогда не осуществлялся, чтобы узнать как это сделать читайте следующую главу.

Как пропатчить файл.

Возьмите любой Hex editor (я использую HexWorkshop32) и откройте ехе файл игры .Теперь выпишете 8 байт кода начиная с тех которые вы должны изменить - это делается так:

Здесь приведён тот же листинг что и сверху


:0041F147 A16C456600 mov eax, dword ptr [0066456C]
 :0041F14C 85C0 test eax, eax
 :0041F14E 7410 je 0041F160
 :0041F150 5E pop esi
 :0041F151 B801000000 mov eax, 00000001
 :0041F156 5B pop ebx
 :0041F157 81C40C020000 add esp, 0000020C
 :0041F15D C20400 ret 0004 


Выпишете те цифры которые выделены синим, как вы видите их шестнадцать - Это и есть восемь байт которые переведены в шестнадцатеричную систему. В Hex editor-е нажмите "search" и введите в появившемся окне для поиска эти цифры - 74105EB801000000 и нажмите Enter. Когда вы их найдёте просто измените 74105EB801000000 на 90905EB801000000, после чего сохраните изменения. 7410 это шестнадцатеричный вариант команды ассемблера je 0041F160, а мы должны сделать так чтобы этот переход (а je 0041F160 это условный переход) просто игнорировался. вот поэтому-то мы и заменяем 7410 на 9090 (90 - шестнадцатеричный вариант пустой команды "nop").Запустите игру и она будет работать без CD.

Патч на Delphi 7.

Создайте новый проект на Delphi 7 - делается это так в главном(main) меню выберите "File - New - Application". Теперь на появившейся форме разместите кнопку - button1(не переименовывайте), компонент мемо - memo1(не переименовывайте), чек бокс - checkbox1(не переименовывайте), opendialog1(не переименовывайте).

Теперь сам код:

unit Unit1; {Если у вас не Unit1 то не переименовывайте а оставьте как есть.}

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
CheckBox1: TCheckBox;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var p1,p2:pointer;
patch,sec:array [0..2] of char;
f:file;
a:integer;

label 1;
begin
if opendialog1.Execute then begin {Открывает диалог открытия файла}

assignfile(f,opendialog1.FileName);{переменной f придаём значение выбранного имени файла}
reset(f,1);{Открываем файл f для чтения}
a:= filesize(f)-127312;
getmem(p1,127310);{Резервируем память размером 127310 байт для пойнтера р1}
getmem(p2,a);
blockread(f,p1^,127310);{Считываем фрагмент файла размером 127310 байт в пойнтер р1}
blockread(f,sec,2);
blockread(f,p2^,a);
if (sec[0]=chr($90)) and (sec[1]=chr($90)) then begin
messagedlg(’This file was already patched’,mterror,[mbok],0);{Показывает сообщение}
goto 1;
end;
if checkbox1.Checked=true then begin
copyfile(pchar(opendialog1.FileName),pchar(opendialog1.FileName+’.bak’),false);{Создаёт backup}
end;
patch:=chr($90)+chr($90);
rewrite(f,1);
blockwrite(f,p1^,127310);{записывает содержимое пойнтера р1 в файл f}
blockwrite(f,patch,2);
blockwrite(f,p2^,a);
1:closefile(f);{закрываем файл f}

dispose(p1);{высвобождает память занимаемую пойнтером p1}
dispose(p2);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Caption:=’Patcher by PHOENIX’;
checkbox1.Checked:=true;
opendialog1.Filter:=’execute files (*.exe)|*.exe’;
button1.Caption:=(’Start’);
checkbox1.Caption:=(’Make backup’);
memo1.Color:= clscrollbar;
memo1.ReadOnly:=true;
memo1.Clear;
memo1.Lines.Add(’This patch was created by Phoenix’);
memo1.Lines.Add(’Program: Age of Empires - The Age of Kings’);
memo1.Lines.Add(’Size of file - 2560000’);
memo1.Lines.Add(’My E-mail address is Phohack@mail.ru’);
memo1.Lines.Add(’You can order patch for every program’);
memo1.Lines.Add(’Thank You for choosing may patches’);
memo1.Lines.Add(’Этот патч созден человеком с ником Phoenix’);
memo1.Lines.Add(’Программа: Age of Empires - The Age of Kings’);
memo1.Lines.Add(’Размер файла - 2560000’);
memo1.Lines.Add(’Мой E-mail адрес Phohack@mail.ru’);
memo1.Lines.Add(’Вы можете заказать патч для любой программы’);
memo1.Lines.Add(’Спасибо за то что вы выбрали мои патчи’);

end;

end.

Текст формы - только для более или менее опытных:

object Form1: TForm1
Left = 192
Top = 114
Width = 275
Height = 277
Caption = ’Form1’
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = ’MS Sans Serif’
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 208
Width = 75
Height = 25
Caption = ’Start’
TabOrder = 0
OnClick = Button1Click
end
object CheckBox1: TCheckBox
Left = 8
Top = 184
Width = 97
Height = 17
Caption = ’Make backup’
TabOrder = 1
end
object Memo1: TMemo
Left = 0
Top = 0
Width = 265
Height = 177
Alignment = taCenter
Color = clScrollBar
Lines.Strings = (
’Memo1’)
ReadOnly = True
TabOrder = 2
end
object OpenDialog1: TOpenDialog
Left = 96
Top = 56
end
end

Ну вот и написали патч, теперь сохраните в любой папке и скомпилируйте нажав F9(сразу запустится) или Ctrl+F9 (просто скомпилируется).Теперь сожмите ваш патч каким-нибудь армадилой и разошлите друзьям.

Послесловие.

Вы можете писать мне на Phohack@mail.ru, я принимаю заказы на патчи для программ.

Желаете кряков, их есть у меня!

Я с удовольствием отвечу на все ваши вопросы по теме исследования программ и программированию - я программирую на Delphi7. Также в сферу моих интересов входят криптография и безопасность сети.

Простите за возможные ошибки и опечатки.

Внимание !!!
Данная статья носит исключительно образовательный характер и предназначена для разработчиков программных защит.
Автор не несёт никакой ответственности за возможное использование материалов данной статьи в противозаконных целях.

Glossary :

Бряк - breakpoint, точка прерывания, устанавливается в отладчике для того чтобы программа прервалась по заданному адресу.

Wdasm32 - дизассемблер.

Hex editor - Программа которая представляет файлы в шестнадцатеричном виде и позволяет изменять их.

Soft ice - отладчик.

Отладчик(Дебагер) - Программа позволяющая отлаживать программы или/и драйвера в реальном времени.

Патч - программка изменяющая код ехе или dll файла.

Листинг - Насколько я понимаю листинг это ассемблерный код полученный при дизассемблировании файла.

Дизассемблер - представляет ехе и dll файлы в виде ассемблерного кода.

Ассемблер - Язык программирования низшего уровняю

Сидюк - CDrom.

Команды Soft ice.

wr - открывает окно с регистрами.

bpx - устанавливает точки прерывания(бряки).

bc - Удаляет точки прерывания(бряки) пример: bc * - удаляет все точки прерывания, bc 1 - Удаляет первую точку прерывания.

bl - показывает установленные точки прерывания(бряки).

r fl z - изменяет положения флагов, в данном случае флага z.

Команды языка ассемблер.

cmd - сравнение значения одного регистра с другим. Пример - cmp eax , ecx.

je - условный переход, то есть он проверяет если флаг z включён то прыжка не происходит, а если выключен то происходит прыжок по заданному адресу.

jne - условный переход и если флаг z включён то прыжок по заданному адресу происходит, а если выключен то прыжок не происходит. Противоположен условному переходу je.

test - сравнение значения одного регистра с нулём. Пример - test eax, eax.

P.S.

В принципе можно изменить je 0041F160 на jne 0041F160 и результат будет тот же, а сделать это надо так - измените 74105EB801000000 на 75105EB801000000.

Finish

Date: 07.08.2004

Author: Phoenix.

E-mail address : Phohack@mail.ru



Обсуждение статьи: Создание No-CD для "Age of empires 2 - The age of kings" >>>


Комментарии к статье: Создание No-CD для "Age of empires 2 - The age of kings"

G-MAN 19.03.2005 22:55:39
Лажовая защита ,но ты молодец подробно так 4.5 из 5 !!!
Мля трудись над СТАРФОРСОМ!!!
---
MARcoDEN 21.03.2005 20:36:02
Мда... Как все запущено! Ты бы еще написал статью по отучению диска для какого-нибудь древнего старкрафта :).
Ну а строки вида ’Вы можете заказать патч для любой программы’ или ’Спасибо за то что вы выбрали мои патчи’ - это просто шедевр!
---
+NiLiN+ 28.03.2005 00:38:08
Как насчет Старфорса и SafeDisk
---
Invert.... 28.03.2005 23:46:52
нормально, дерзай парень, пусть знают наших ....
---
J.F. 04.04.2005 12:09:06
SafeDisc - грамотей!
С такими темпами я скоро сюда выложу свою статью про Darkstone ...
---
Z0mSk0n 25.04.2005 03:01:34
Непонимаю чем удобнее изменять байтики в файлах HEX редакторами?! Мазахисты чтоль=) Мне например больше HUEW нравится... да он вроде и удобнее.
---
Z0mSk0n 25.04.2005 03:02:23
Извеняюсь опечатался HIEW=)
---
sanja 14.05.2005 23:59:14
molodec wsje podrobno
---
Кто-то 31.05.2005 09:35:27
У меня век империй второй и тка без диска работает, так что лажа - твоя статья
---
Max 10.06.2005 12:12:45
Спасибо за статью. Надо же начинающим с чего-то начинать
---
Exelios 04.07.2005 15:08:40
Пиши, парень, пиши.
---
[DR] 24.01.2008 16:13:47
Мля так еще в 1998-99г делали
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS