div.main {margin-left: 20pt; margin-right: 20pt}Отучаем игры от проверки 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:quake3quake3.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]
|