22 октября 2019 года    
Вторник | 14:03    
Главная
 Новости
Базы данных
Безопасность PC
Всё о компьютерах
Графика и дизайн
Интернет-технологии
Мобильные устройства
Операционные системы
Программирование
Программы
Связь
Сети
 Документация
Статьи
Самоучители
 Общение
Форум







Разделы / Всё о компьютерах / Другие

Отучаем игры от проверки CD-ROM

Отучаем игры от проверки CD-ROM.

В этой статье речь пойдет о том, как доказать программе,
что винчестер на самом деле совсем не винчестер, а
CD-ROM.
Приступим к делу. Наша цель - Функция GetDriveType(). Она
возвращает тип диска, имя которого ей передали. Вот ее
прототип:

UINT GetDriveType(LPCTSTR lpRootPathName);

Функция возвращает следующие значения:

Числовое значение, идентификатор, описание диска

0 - Невозможно определить тип
1 - Диск не найден
2 DRIVE_REMOVABLE - Гибкий (возможна замена)
3 DRIVE_FIXED - Жесткий (замена невозможна)
4 DRIVE_REMOTE - Сетевой диск
5 DRIVE_CDROM - CD-ROM
6 DRIVE_RAMDISK - RAM диск

Стандартно программа получает список всех дисков,
проверяет их на "CD-ROM" и по нахождению проверяет
наличие нужных файлов. Для проверки, необходимо
сравнить возвращаемое значение с 5. Найдем этот момент
программы, вот как он выглядит после дизассемблирования
Quake3 спомощью W32Dasm :

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h

:004400E1 8D442404 lea eax, dword ptr [esp+04]
:004400E5 50 push eax
:004400E6 FFD6 call esi
:004400E8 83F805 cmp eax, 00000005
:004400EB 7548 jne 00440135


Если вы используете SoftICE, то для нахождения нужного
куска необходимо поставить контрольную точку на вызов
функции GetDriveType (bpx GetDriveType) или GetDriveTypeA
( bpx GetDriveTypeA ). В самом же W32Dasm можно
воспользоваться списком использованных функций. Ищем
KERNEL32.GetDriveTypeA и два раза щелкаем по функции
мышью. В IDA такой список есть в конце
дизассемблированного файла.
Запишем HEX-DUMP этого куска и найдем его в
шеснадцатеричном редакторе. Например в Hex Workshop
3.01: откроем файл quake3.exe, далее нажмем Ctrl + F, в
строке ввода HEX строки введем записанный dump и
нажмем Окэ.
Вместо 83F805 введем 83F804 и любой из подключенных
сетевых дисков теперь будет восприпринят прораммой за
CD, иначе введем 83F803 - тогда жесткие диски будут
приниматься за CD. Фантазия может развиваться
по-любому, можно изменить условие перехода после
сравнения, тогда не придется заботится о типе диска.
Теперь все вышеизложенное осуществим на примере
удаления в Quake 3 проверку ниличия CD.
После дизассемблирования quake3.exe получаем следующий
dump:

:004400C0 81EC84000000 sub esp, 00000084
:004400C6 56 push esi

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h

:004400C7 8B3590104B00 mov esi, dword ptr [004B1090]
:004400CD C64424053A mov [esp+05], 3A ; ':'
:004400D2 C64424065C mov [esp+06], 5C ; '\'
:004400D7 C644240700 mov [esp+07], 00
:004400DC C644240463 mov [esp+04], 63 ; [esp+4] == 'c:\',0

* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440141(C)

:004400E1 8D442404 lea eax, dword ptr [esp+04]
:004400E5 50 push eax ; положить в стэк 'c:\',0
:004400E6 FFD6 call esi ; call getdrivetypea
:004400E8 83F805 cmp eax, 00000005 ; это cd - rom?
:004400EB 7548 jne 00440135 ; прыжок если это не cd - rom

* Possible StringData Ref from Data Obj ->"quake3"

:004400ED 68A81A4C00 push 004C1AA8 ; положить в стэк
'quake3',0
:004400F2 8D4C2408 lea ecx, dword ptr [esp+08]
:004400F6 51 push ecx ; положить в стэк 'c:\',0

* Possible StringData Ref from Data Obj ->"%s%s"

:004400F7 68088B4B00 push 004B8B08
:004400FC 68F0895C00 push 005C89F0
:00440101 E899EE0500 call 0049EF9F ; после этого мы
получаем 'c:\quake3',0
* Possible StringData Ref from Data Obj ->"quake3.exe"

:00440106 689C1A4C00 push 004C1A9C ; положить в стэк
'quake3.exe',0
:0044010B 68F0895C00 push 005C89F0
:00440110 8D542420 lea edx, dword ptr [esp+20]

* Possible StringData Ref from Data Obj ->"%s\%s" ; string '\'
string

:00440114 68941A4C00 push 004C1A94
:00440119 52 push edx
:0044011A E880EE0500 call 0049EF9F ;
'c:\quake3\quake3.exe',0
:0044011F 8D442428 lea eax, dword ptr [esp+28]

* Possible StringData Ref from Data Obj ->"r" ; read \ readonly

:00440123 68901A4C00 push 004C1A90
:00440128 50 push eax
:00440129 E877F90500 call 0049FAA5
:0044012E 83C428 add esp, 00000028
:00440131 85C0 test eax, eax ; eax!=0 == good boy
:00440133 7518 jne 0044014D

Сперва он проверяет диск 'c:\' на CD-Rom, далее проверяет
текущую дерикторию и останавливается если это CD-Rom.
Изменим первую часть проверки следующим образом
(вторая часть 00440170, исправляется также) :

:004400C7 8B3590104B00 mov esi, dword ptr [004B1090]
:004400CD C64424055C mov [esp+05], 5C ; '\'
:004400D2 C644240600 mov [esp+06], 00
:004400D7 C644240700 mov [esp+07], 00
:004400DC C64424042E mov [esp+04], 2E ; [esp+4] == '.\',0,0

* Referenced by a (U)nconditional or (C)onditional Jump at
Address:

:00440141(C)
:004400E1 8D442404 lea eax, dword ptr [esp+04]
:004400E5 50 push eax ; push '.\',0,0
:004400E6 FFD6 call esi ;call getdrivetypea
:004400E8 83F805 cmp eax, 00000005
:004400EB 90 nop ; забиваем jump nop`ами или 75 00
:004400EС 90 nop ...


Далее делаем следующую фишку:

:004400ED 68A81A4C00 push 004C1AA8 ; положить в стэк
'quake3',0
:004400F2 8D4C2408 lea ecx, dword ptr [esp+08]
:004400F6 51 push ecx ; положить в стэк '.\',0,0

* Possible StringData Ref from Data Obj ->"%s%s"

:004400F7 68088B4B00 push 004B8B08
:004400FC 68F0895C00 push 005C89F0
:00440101 B899EE0500 mov eax, 0005EE99; жестоко
насилуем call


В следующей части после string formating мы получим
'.\\quake3.exe', а это вызовет ошибку, потому что второй '\'
это no good.
Для устранения этой проблемы загрузим quake3.exe в Hex
Workshop или т.п. , нажмем Ctrl + F и в строке ввода TEXT
строки введем '%s\%s' и нажмем ОК. После того когда вы
найдете '%s\%s...quake3.exe..quake3', исправьте '%s\%s' на
'%s%s'. Исправили?. Если да, то продолжим исследование:

* Possible StringData Ref from Data Obj ->"quake3.exe"

:00440106 689C1A4C00 push 004C1A9C ; положить в стэк
'quake3.exe',0
:0044010B 68F0895C00 push 005C89F0
:00440110 8D542420 lea edx, dword ptr [esp+20] ; положить в
edx '.\'

* Possible StringData Ref from Data Obj ->"%s%s" ; stringstring

:00440114 68941A4C00 push 004C1A94
:00440119 52 push edx
:0044011A E880EE0500 call 0049EF9F ; после call у нас будет
'.\quake3.exe'

Вот и всё. Теперь, если вы всё правильно пропатчили,
глупый Квак будет идти без CD, только если вы установили
Кваку в корневую дерикторию.... :((.
Если Вы чего-то не поняли пишите: [tsrh@mail.ru]

 Отучаем игры от проверки CD-ROM
Лента новостей


2006 (c) Copyright Hardline.ru