Содержание статьи
Казуальная игра — компьютерная игра, предназначенная для широкого круга
пользователей. Сам термин "казуальная" происходит от латинского слова "casualis",
что означает "случайный". Таким образом, казуальная игра — это игра, в которую
играют от случая к случаю, между делом, чаще всего, чтобы как-то убить время.
Подобными игрушками являются творения компании НевоСофт. Только вот дают они
поиграть всего час, а потом просят денег. Сегодня мы с этим разберемся!
Немного теории
Вообще, казуальные игры по своему уровню сложности годятся практически для
любой категории пользователей компьютера. Зачастую время на прохождение таких
игр невелико, а потому они хорошо подходят для тех, кто не может уделять игре
много времени. Компания НевоСофт является одним из ведущих разработчиков
казуальных игр в мире (и, в частности, на русском языке). Казалось бы, такая
серьезная компания должна уделять повышенное внимание защите своего программного
обеспечения, для ее взлома должно понадобиться много сил и времени. Сегодня мы
опровергнем этот факт и покажем, как отучить их детище клянчить наши с вами
кровные деньги. Разработчики компании НевоСофт держат под своим чутким надзором
тысячи игр, при этом дают народу опробовать их детище в течение одного часа.
После 60 минут, когда человек только входит во вкус, высвечивается не очень
приятная табличка, которая просит денежек. Так уж сложилось, что русский человек
не любит платить за софт, но разработчики игр иногда просто не оставляют нам
выбора. Для определенной игры нужно найти свой кряк, на поиски которого иногда
уходят драгоценные минуты и часы, а если игра новая, то вероятность найти его
сводится к нулю.
Подготовка операционного стола
В качестве подопытного для нашего исследования, которого мы будем отучать от
"вредной привычки", я выбрал игру "Полцарства за принцессу". Мой выбор пал на
нее, потому что именно она и натолкнула меня на мысль об исследовании защиты игр
от НевоСофта. Позже выяснилось, что принцип защиты у других игр этого
производителя абсолютно идентичен.
Так сложилось, что на момент изучения под моей рукой не было ни одной
программы для взлома: ни дизассемблера, ни отладчика; был только набор программ,
стоящих на машине практически у каждого пользователя. В этот набор вошли Total
Commander и "Диспетчер задач" — именно этими программами мы и будем пользоваться
в момент изучения игры. Казалось бы, что можно сделать при помощи этих
приложений? Оказалось, что при наличии пытливого ума и капельки внимательности
этого вполне достаточно, чтобы заставить игру работать без ограничения по
времени. В качестве платформы для написания "таблетки" я выбрал Delphi 7. Все
инструменты разложены на операционном столе, пациент крепко привязан — можно
приступать к исследованию. А теперь обо всем по порядку...
Скальпель, тампон, спирт, еще спирт, огурец... Помянем!
Устанавливаем и запускаем игру. Видим красивое окошко, в котором красуется
время, отведенное нам для ее тестирования. Смело тыкаем мышкой по кнопке
"играть" и начинаем наблюдать, что творится в системе. Свернем игру на время и
заглянем в "Диспетчер задач". Взгляд падает на неизвестный нам процесс с
расширением *.tmp. Что ж, давай глянем, что это за фрукт, и как он тут оказался.
Тыкаем в свойства процесса и вчитываемся в информацию, которую нам выдали.
Месторасположение файла говорит о том, что мы на верном пути. Открываем папку с
этим файлом и переименовываем его в exe’шник (кстати, файл является скрытым, так
что не забудь поставить галочку на "отображать скрытые файлы" в
соответствующих свойствах). Тыкаем в него два раза левой кнопкой мыши и видим
прекрасную картину — игра запускается, причем никаких окон для регистрации не
выскакивает. Казалось бы, цель нашего эксперимента достигнута, игра больше не
требует регистрации и работает без ограничения по времени. Но этот способ
слишком нудный и неудобный. Поэтому будем искать способ упростить эти действия.
Вскрытие показало, что пациент умер от вскрытия
Основная наша цель — научится отучать игрушки NevoSoft'a от денег в два
клика, поэтому начнем разбираться, откуда берется тот злосчастный файл с
расширением *.tmp. Не бойся, читать тонны мануалов не придется, главное – иметь
чуточку терпения и капельку внимательности. Искать долго не приходится, ибо в
папке с файлом *.tmp лежит непонятно зачем нужный файл nsgame.dat, который по
размеру совпадает с нашей игрушкой с точностью до байта. Можно предположить, что
ланчер просто переименовывает nsgame.dat в *.tmp и запускает его. Но в процессе
проверки нашего предположения тебя ждет большой облом — нас посылают куда
подальше, сообщая о том, что приложение не является исполняемым файлом.
Расстраиваться не будем, а вместо этого берем лопату побольше да поострее и
начинаем копать поглубже. Первое, что приходит на ум – сравнить эти два файла и
посмотреть, в чем же их отличие. Откроем Total Commander и воспользуемся
внутренней утилитой для сравнения файлов. Результаты сравнения очень интересные,
так как наблюдается красивая картина: с периодичностью в 2 байта идет различие и
совпадение. Налицо криптография исполняемого файла, но как провести обратный
процесс, ведь мы решили отказаться от отладчиков и дизассемблеров? Ответ очень
прост — нужно вспомнить алгоритмы шифрования. Самым простым и одним из самых
эффективных (при правильном использовании) криптоалгоритмов является так
называемое XOR-шифрование. Напомню, в данном методе побайтно проводится булева
операция XOR. Первой переменной является байт для шифрования, а второй — ключ.
Но перед нами тут же встает еще один вопрос — где взять ключ для дешифровки?
Ответ прост. Нужно только вспомнить булеву алгебру, и ключ нам дадут в открытом
виде.
Crypted = uncrypted XOR key;
Key = crypted XOR uncrypted
Попробуем достать заветный ключик. Для этого проведем побитно операцию XOR
между исполняемым файлом и временным файлом. По идее, на выходе получим ключ для
дешифровки, с помощью которого можно будет щелкать игры как орешки. XOR’ить
будем только первые 256 байт, так как мало кто в наше время использует ключи
большей длины.
var
i, o: TFileStream;
bi, bo:byte;
x, ii, cc:integer;
begin
if open.Execute then
begin
SetCurrentDir('C:\Игры от NevoSoft\Peacecraft\
game');
//Переходим в папку с игрой
if not(fileexists('nsgame.dat')) then exit;
i:=TFileStream.Create('nsgame.dat', fmOpenRead);
o:=TFileStream.Create(open.FileName, fmOpenRead);
x:=0; ii:=0; cc:=0;
//перебираем 256 байт
for x:=0 to 255 do
begin
i.read(bi,1);
o.read(bo,1);
key.Caption:=format('%s %x', [key.Caption, (bi
xor bo)]);
inc(cc);
if cc mod 8 =0 then key.Caption:=key.
Caption+#13#10;
end;
i.Free;
o.Free;
end;
Как оказалось, ключ, используемый для шифрования, не очень-то большой: длина
его составляет всего 4 байта. Забегая вперед, скажу, что для каждой игры от
компании НевоСофт существует уникальный ключ шифрования. Как же его вычислить?!
Углубляться в дебри не стоит. На самом деле все очень просто — для получения
ключа берем от сигнатуры PE-заголовка первые 2 байта и проводим операцию XOR. У
многих возникнет вопрос: почему нужно проводить операцию XOR только на 2 байта,
ведь длина ключа — 4 байта? Ответ прост — 3-й и 4-й байты в ключе всегда равны
$00.
const
ckey = #77#90; // сигнатура PE-файла
begin
i:=TFileStream.Create(FileName, fmOpenRead);
for x:=1 to 2 do
begin
i.Read(tmp,1);
tmp:=ord(ckey[x]) xor tmp;
key:=key+chr(tmp);
end;
key:=key+#0#0;
Теперь в наших руках есть заветный ключ-монтировка, и можно смело приступать
к написанию самой программы для взлома.
Мы писали, мы писали, наши пальчики устали...
Мы уже обладаем достаточной информацией для написания универсального
взломщика. Что ж, не будем зря терять время. Приступим...
procedure wrap(filename:string);
var
i, o: TFileStream;
bi, bo, tmp:byte;
x, ii:integer;
key:string[4];
buffer:TMemoryStream;
const
ckey = #77#90;//сигнатура PE-заголовка
begin
if not(fileexists(filename)) then exit; // небольшая проверка никогда не
повредит =)
i:=TFileStream.Create(filename, fmOpenRead);//открываем на чтение подопытного
o:=TFileStream.Create(ChangeFileExt(filename,
'.exe'), fmCreate);//и на запись новый файл
buffer:=TMemoryStream.Create;
for x:=1 to 2 do // вычисляем крипто-ключ
begin
i.Read(tmp,1);
tmp:=ord(ckey[x]) xor tmp;
key:=key+chr(tmp);
end;
key:=key+#0#0;
i.Seek(0,soFromBeginning);
x:=0; ii:=0;
while i.Position<i.Size do // дешифруем файл с указанным
ключом
begin
inc(ii);
i.Read(bi, 1);
bo:=bi xor ord(key[ii]);
buffer.Write(bo,1);
inc(x);
if ii=4 then ii:=0;
end;
o.Write(Buffer.Memory^, Buffer.size);
i.Free;
o.Free;
buffer.Free;
showmessage('Wrapping done');
end;
Звучит барабанная дробь — запускаем полученный файл... Но почему-то нам снова
предлагают пройти в сторону леса. Что, где, когда мы пропустили?! Ведь вроде бы
все правильно сделали! Но не будем расстраиваться. Взяв в руки очередную баночку
пива, продолжим изучать подопытного и попробуем найти наш промах. Вновь
открываем Total Commander и проводим работу над ошибками, сравнивая нормальную
игру с файлом, который у нас получился. На первый взгляд файлы одинаковы с
точностью до одного байта. Но стоит только нажать кнопку "найти первое
различие", Total Commander сообщает, что, начиная со смещения $43000, файлы не
совпадают.
Следовательно, можно предположить, что шифруется не весь файл, а только
первые $43000 байт. Поэтому берем в руки молоток и зубило и исправляем ошибки в
нашем коде, заставив дешифровать только первые $43000 байт.
while i.Position<i.Size do
begin
inc(ii);
i.Read(bi, 1);
if x<$43000 then
begin
bo:=bi xor ord(key[ii]);
buffer.Write(bo,1);
end
else
buffer.Write(bi,1);
inc(x);
if ii=4 then ii:=0;
end;
Запускаем наш "взломщик" (впрочем, эти действия сложно назвать взломом, так
как мы не модифицируем ни одного байта, непосредственно относящегося к игре, а
лишь восстанавливаем исходное приложение путем дешифрования). Пару секунд
ожидания; запускаем игру. Нашей радости нет предела, так как теперь игра
абсолютно независима от NevoSoft'овского ланчера, который клянчит у нас деньги.
Теперь можно расслабиться и, откинувшись в кресло, наслаждаться любимой
игрушкой.
Заключение
Отличие хакера от обычного человека заключается не только в высоком уровне
познаний IT-технологий, а в первую очередь в его любознательности и способности
находить нестандартный подход к обычным делам. Исследование, которое мы сейчас
произвели, доказывает еще один факт — для взлома не всегда нужно часами сидеть в
отладчике, выискивая заветные байты, которые нужно пофиксить; иногда можно
обойтись и теми программами, которые у нас всегда под рукой. За сим прощаюсь и
рекомендую всегда блюсти ст. 272-274 УК РФ — и будет тебе счастье! 🙂