Преглед на защитата на NevoSoft

Честно казано, тук не планирам да анализирам подробно защитния механизъм, ще бъдат показани само основните моменти, тъй като (както показва опитът от предишната статия за Alawar и писмата на читателите) техническите подробности в програмирането не са интересни за обикновените потребители . Тези от читателите, които се интересуват от самия процес на изучаване на защитата, ще могат да проследят целия изследователски път съгласно заключенията по-долу. Няма да е трудно, дори начинаещи могат да се справят.

За нагледен пример за статията, нека вземем първата игра, която срещаме от производителя. Изтеглих Lost, който е хитът на сезона на сайта. Инсталирайте играта по обичайния начин:

фатеев


Изтеглете програмата за изтегляне от сайта, стартирайте я, задайте пътя за инсталация и изчакайте, докато самата игра бъде изтеглена:

фатеев

денис

Алгоритъмът за защита е както следва:

1) Инсталираната игра се стартира чрез пряк път, сочещ към 'drm.exe' с уникален идентификатор на играта в параметъра. Черупката има достъп до вътрешната база данни и търси параметрите, съответстващи на нея по идентификатора на играта: свободно време за потребителя, изпълним файл на играта, параметри на защита на изпълнимия файл и друга информация. В резултат на проверките игралният файл се зарежда, по време на процеса на изтегляне от него се премахва защитата и се прехвърля контрол върху него, като в същото време се включва таймерът за безплатна игра, ако играта не е „закупена“. След приключване на игралния процес черупката записва текущата стойност на оставащото свободно време в базата данни. Естествено, щом стойността на свободното време за игра в базата данни е равна на нула, черупката вече няма да позволи играта да започне;

2) Вътрешната база данни е обикновена база данни SQLite3, кодирана с XOR върху ключов масив с размер 256 байта, съхраняван в тялото на черупката. Данните от масив ключове са статични и поради причини за съвместимост не се променят с времето (тук и по-долу се използват кодови фрагменти в Delphi):

Винаги, когато черупката трябва да чете или записва данни в базата данни, базата данни се дешифрира в паметта, с нея се извършват необходимите манипулации, извършва се криптиране и резултатът се поставя обратно на диска. Самата криптирана база данни се съхранява в скрит файл 'base.db' в директорията Application Data на текущия потребител:

фатеев

Трябва да се отбележи, че обвивката заключва файла на базата данни от четене/запис от програми на трети страни (поддържа файла отворен изключително). За всякакви манипулации с файла на базата данни първо трябва да приключите процеса 'drm.exe'.

При желание можем да дешифрираме основата, като използваме следния алгоритъм:

След дешифрирането можете да видите структурата и данните, съхранени в базата данни, с помощта на който и да е преглед на SQLite, например SQLite Browser (картината може да се кликва):

денис

Можете дори да редактирате данните (пробен лимит на играта), да шифровате получения файл на базата данни със същия ключ и да замените оригиналната база данни със своя - черупката ще вземе нашите промени. Между другото, това е една от опциите за заобикаляне на защитата - получаване на "вечен" процес, но това е грозно решение, "мръсен хак".

3) Разделът на изпълнимия файл на играта, който съдържа входната точка на PE EXE, е криптиран байтов байт в XOR с масив от 1024 байта, съхранен в полето 'crpt_inf' в записа на базата данни. С други думи, според идентификатора на играта, черупката зарежда своя изпълним файл (получавайки името на файла от полето 'exec'), чете масива от ключове от полето 'crpt_inf' от базата данни и декриптира EP-секцията с ключов масив, след което той прехвърля контрола върху заредения файл.

Можете да дешифрирате секцията и да получите "чист" изпълним файл на играта по следния начин:


Като цяло тази защита не е по-сложна от тази, използвана в Alawar, но технически тук има много рутинни операции и бизнесът не се ограничава до редактиране на два байта. В тази връзка беше решено да се напише помощна програма, която автоматизира процеса на изследване (всъщност парчетата код, дадени по-горе, са взети от него):

денис

Можете да изтеглите помощната програма от тук; източници (на Delphi 7) тук.

Моля, обърнете внимание, че тази програма е представена само с образователна цел и по никакъв начин не трябва да се използва за създаване на пиратски копия на игри; прочетете отказа от отговорност за уебсайта.

Дискусия

Добър ден, Денис!

За да бъда честен, не се опитах да стартирам програмата, а само разгледах кода. Но можете да видите, че се променя само един .text раздел. Всъщност има две променливи секции. Вторият винаги е с размер 3FH. Той трябва да бъде създаден допълнително. Често програмата работи без нея, но например Shokolator 2 стартира без нея, тя работи, но се срива при излизане, помага само рестартиране.

PS: WriteProcessMemory също показва, че има два процеса на замяна.

Може би защитите вече са се променили; Гледах около дузина игри от Nevosoft, но една секция се променя навсякъде. Не зададох почивки на 'WriteProcessMemory', защото не виждах необходимостта от това.

Като цяло странно, разбира се. И така, производителят на оригиналната игра свързва допълнителна част от боклука? Иначе как да обясня присъствието му в незащитен/дешифриран EXE? Доставчиците се опитват да взаимодействат с обвивката, като използват секцията в паметта като буфер?

Когато се върна от ваканция, ще разгледам "Шоколад 2"

Може би обърках името на играта (гледах много игри), но пречупеният Chocolator 2 работи добре без допълнителна секция. Но всъщност процесите WriteProcessMemory 2. Например в играта Super Cow

WriteProcessMemory 1 hProcess = 0000045C Адрес = 401000 Буфер = 0C4A0020 BytesToWrite = B9000 - WriteProcessMemory 2 hProcess = 0000045C Адрес = 140000 Buffer = drm.004A21A8 BytesToWrite = 3F

В този случай 1 сесия е напълно заменена, но това не е необходимо, .text може да бъде разделен на няколко раздела и каквото и да бъде заменено. Честно казано, не се замислих защо е необходим нов раздел, защото се оказва, че всичко работи без него.

Разгледах и Shokolator 2, видях две извиквания на 'WriteProcessMemory ()', но не разрових по-нататък с 'drm.exe' (проверих дали работи с една секция и "забих" в детайли).

Току-що изтеглих Lost Souls от уебсайта им, разопаковах само StraySouls.exe, след това извадих всички DRM и .db файла, ципирах папката с играта и я занесох на майка ми на лаптоп и я изпратих на сестра ми в Италия. Тя все още работи за майка ми. благодаря брато

Всичко работи добре, БЛАГОДАРЯ. ОГРОМЕН ММММММ.

моля, кажете ми какво да правя ? когато играта стартира, тя извежда грешка НЕ ​​МОЖЕ ДА ОТВОРИ БАЗАТА ДАННИ, изглежда, че съм объркал нещо с base.db, но какво точно не мога да разбера, не съм добър в това.

Ако сте променили нещо там ръчно, по произволен начин, тогава не е изненадващо. Общ съвет: запазете данните за играта си, изтрийте повредения 'base.db' и го инсталирайте отново. Работещият 'base.db' ще се появи автоматично.

Благодаря ви много, поправих всичко, само черупката на игрите се изтегля в папката не drm, както беше преди, а в Nevosoft.Games.

Кажете ми защо при дешифрирането на базата данни грешката при декриптирането на базата данни пише!?