Vlad2

Обход защиты целостности кода

137 сообщений в этой теме

Всем привет.

Столкнулся с проблемой защиты кода в игре, из за чего при внедрении скриптов игра вылетает.

Посмотрел видео Как я взламывал Crysis 3. Часть 2. где Xipho рассказывает, как он обошел проверку целостности кода. Решил повторить подобную ему процедуру. Поставил брекпоинт на инструкцию игры и выпала следующая инструкция, которая читает каждый байт кода игры.

 

Скрытый текст

h_1473498062_2476690_9f305fa366.jpg

 

Скрытый текст

 



TheCrew.exe+9EC6A - cmp bl,bl
TheCrew.exe+9EC6C - and al,dl
TheCrew.exe+9EC6E - jmp TheCrew.exe+6A15FB
TheCrew.exe+9EC73 - or eax,ecx
TheCrew.exe+9EC75 - test al,6E
TheCrew.exe+9EC77 - bt ebx,ecx
>>> TheCrew.exe+9EC7A - xor al,[rdx]
TheCrew.exe+9EC7C - cmc 
TheCrew.exe+9EC7D - add rdx,01
TheCrew.exe+9EC81 - jmp TheCrew.exe+6AF8B0
TheCrew.exe+9EC86 - jmp TheCrew.exe+3673B7
TheCrew.exe+9EC8B - jmp TheCrew.exe+E5B3B
TheCrew.exe+9EC90 - cmc 
TheCrew.exe+9EC91 - xadd al,cl
TheCrew.exe+9EC94 - ror al,1
TheCrew.exe+9EC96 - setno cl
TheCrew.exe+9EC99 - mov al,[rbp+00]
TheCrew.exe+9EC9C - adc cl,dh
TheCrew.exe+9EC9E - mov cl,ah
TheCrew.exe+9ECA0 - mov cl,[rbp+02]

 

 

 

Дальше написал скрипт идентичный скрипту из видео, но немного растерялся т.к. у меня игра 64 битная, а я еще с такими еще не много опыта имею.

 

Скрытый текст

 


[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(IntegrityFakeCheck,256)
alloc(MemoryCopy, 75112592) // Размер ехе
aobscan(IntegrityAddr, 32 02 F5 48 83 C2 01 E9 2A 0C 61 00)
registersymbol(IntegrityAddr)
label(ReturnToOriginalCode)
label(SkipCopy)
label(NotInCopy)
label(IntegrityCheckData)

IntegrityFakeCheck:
cmp [MemoryCopy],0
jne SkipCopy

push rcx
lea rsi,[TheCrew.exe+1000]
lea rdi,[MemoryCopy]
mov rcx,47A2090 //Размер ехе в hex`е
repe movsb

mov rcx,IntegrityAddr
sub rcx,TheCrew.exe+1000
lea rdi,[MemoryCopy]
mov [rdi+rcx],48f50232
mov bype ptr [rdi+rcx+4],83
pop rcx

SkipCopy:
cmp rcx,TheCrew.exe+1000
jb NotInCopy
cmp rcx,TheCrew.exe+47A3090
ja NotInCopy

sub rcx,TheCrew.exe+1000
add rcx,MemoryCopy
mov [rdx],rcx

NotInCopy:
xor al,[rdx]
cmc
add rdx,01
jmp ReturnToOriginalCode+2 // +2 для того, чтобы попасть на следующую оригинальную инструкцию

MemoryCopy:
db 0

IntegrityAddr:
jmp IntegrityFakeCheck

ReturnToOriginalCode:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
IntegrityAddr:
xor al,[rdx]
cmc
add rdx,01
dealloc(IntegrityFakeCheck)
dealloc(MemoryCopy)
unregistersymbol(IntegrityAddr)

 

 

Даже не сомневаюсь, что я что-то сделал не так, и после массы неудачных попыток так и не получилось сделать, чтоб скрипт работал.

Скрипт просто не активируется.

Подскажите, где я допустил ошибку

 

 

Изменено пользователем Vlad2
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Никогда не стоит забывать о балансировке байт при затирании оригинальной инструкции прыжком

2. Проверь количество байт для aobscan - возможно, они не уникальны и движок СЕ просто-напросто не может определиться, с каким именно адресом работать. В этом случае увеличь количество байт для сигнатуры.

3. К ReturnToOriginalCode ничего плюсовать не нужно, при создании скрипта метка и так установится там, куда нужно прыгнуть из инжекта.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Скрипт уже поправил и тщательно все проверил, по идеи должно работать, но он не активируется.

Методом тыка понял, что он не активируется, из за этой инструкции:

lea rsi,[TheCrew.exe+1000]

потому что TheCrew.exe имеет адрес 7FF000000000, и эта инструкция его не принимает 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И еще: 

Проверяющую код инструкцию 

xor al,[rdx]

Проверяет еще несколько инструкций, в том числе и она сама. И все эти же инструкции читают каждую из них.

В общем замкнутый круг, и что в такой ситуации делать?

2.JPG

Изменено пользователем Vlad2
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В крайзисе тоже она сама себя проверяла, работает же ) В твоем случае надо что-то с базовым адресом делать, я полагаю.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

хмм игра онлайн и есть большая вероятность доп. функционала античита - лучше копирнуть ехе который в памяти в новый блок +перенаправить сканер туда, так он никогда не найдет мод код. даже если там есть спец проверки на откл сканера - они всегда будут возвращать норм результат в телеметрию. +саму телеметрию желательно проверить, возожно там предусмотрена страховка в виде инфы оригинал блока и блока которым занимается сканер...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я вскрыл пару трейнеров на игру The Crew, никакого обхода защиты не нашел. В обоих трейнерах есть иньекции. Видимо игру обновили и установили в неё защиту....

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 час назад, gmz сказал:

хмм игра онлайн и есть большая вероятность доп. функционала античита - лучше копирнуть ехе который в памяти в новый блок +перенаправить сканер туда, так он никогда не найдет мод код. даже если там есть спец проверки на откл сканера - они всегда будут возвращать норм результат в телеметрию

У Xipho в уроке примерно всё это и делается.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Garik66 сказал:

У Xipho в уроке примерно всё это и делается.

слишком хардкорд. размер пе хидера надо брать из него же и размер иниц модуля..

обычно модуль на сектора делят например по ~500кб, проще найти структуру где лежат адреса кусков, поставить хук на код который пашет когда детект, когда сканер найдет мод код (хук), он сгенерит другой хеш и сработает наш код, дальше всем адресам сменить базу на новый блок, прыгнуть на рескан и норм.

кст на игре все еще тормозной вмпрот?

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В общем ничего не получилось сделать. Нашел 12 инструкций, которые сканируют код игры. Также для них написал скрипты, которые бы передавали оригинальные участки кода игры, но толку нет. Игра вылетает при любом внедрении скриптов

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Vlad2 сказал:

В общем ничего не получилось сделать. Нашел 12 инструкций, которые сканируют код игры. Также для них написал скрипты, которые бы передавали оригинальные участки кода игры, но толку нет. Игра вылетает при любом внедрении скриптов

По-видимому, что-то не правильно всё-таки сделали. А для какой игры делали? 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ЗЫ: первая ошибка в Вашем скрипте, которая кинулась в глаза, нет выравнивания, т.е.:

00190000 - 32 02                 - xor al,[edx]
00190002 - F5                    - cmc 
00190003 - 83 C2 01              - add edx,01 { 1 }

это 6 байт, а

jmp IntegrityFakeCheck

занимает 5 байт.

где nop? :D

Конечно будет вылет.

Добавьте 1 nop сюда:

IntegrityAddr:
jmp IntegrityFakeCheck
db 90                    //nop
ReturnToOriginalCode:

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Garik66 сказал:

ЗЫ: первая ошибка в Вашем скрипте, которая кинулась в глаза, нет выравнивания, т.е.:

Писал же, что код подправил. Хорошо, если я ошибся и не вижу ошибку, а то прям уже не знаю что делать.

Если кому то интересно, то могу логин,пароль в ЛС кинуть, чтоб сами попробовали покопаться.

[ENABLE]
alloc(newmem, 2048, "TheCrew.exe"+6258F9)
alloc(memory, 75112599)
aobscan(search, 32 02 38 F8 F5 E9 E3 CE 07 00 48 83 ED 0C)
registersymbol(search)
registersymbol(memory)
label(SkipCopy)
label(returnhere)
label(originalcode)

newmem:
cmp [memory],0
jne SkipCopy
push rcx
lea rsi,[TheCrew.exe+1000]
lea rdi,[memory]
mov rcx,47A2097
repe movsb

mov rcx,search
sub rcx,TheCrew.exe+1000
lea rdi,[memory]
mov [rcx+rdi],f8380232
mov byte ptr [rcx+rdi+1],f5
pop rcx

SkipCopy:
cmp rdx,TheCrew.exe+1000
jb originalcode
cmp rdx,TheCrew.exe+47A3090
ja originalcode

sub rdx,TheCrew.exe+1000
add rdx,memory

originalcode:
xor al,[rdx]
cmp al,bh
cmc
jmp returnhere

memory:
db 0

search:
jmp newmem

returnhere:

[DISABLE]
search:
xor al,[rdx]
cmp al,bh
cmc

dealloc(newmem)
dealloc(memory)
unregistersymbol(memory)
unregistersymbol(search)

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Garik66 сказал:

А для какой игры делали? 

ЗЫ: увидел (извините читал не внимательно) - The Crew

Изменено пользователем Garik66
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, а почему у тебя здесь:

mov [rcx+rdi],f8380232
mov byte ptr [rcx+rdi+1],f5

+1, хотя должно быть

mov [rcx+rdi],f8380232
mov byte ptr [rcx+rdi+4],f5

т.е. пятый байт мы записываем спустя 4 байта. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ЗЫ: нормальных репаков не нашёл, а парится установкой, плюс активацией и т.д., у меня сейчас времени нет. Но уверен, что если сделать всё правильно по способу Xipho, то всё будет работать. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ЗЫ: Сейчас качну игру из этой старой темы, в ней тоже было три проверки целостности кода, там нашли решение через постановку брейкпоинта.

Правда она у меня будет очень сильно тормозить, так как видео карта не тянет, но попробую в воскресение (до этого у меня времени не будет) на ней сделать способ Xipho и если всё получиться запишу видео. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
30 минуты назад, Garik66 сказал:

ЗЫ: нормальных репаков не нашёл, а парится установкой, плюс активацией и т.д.,

в уплей ее ща нашару раздают, там все еще вмпрот, вероятно интересно будет

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 Какая версия игры у тебя, 1.1.4.0 ?

2 Какой используешь отладчик,  у меня игра сразу падает. На Veh - ничего не находит. На window - падает.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
43 минуты назад, AntonVit сказал:

1 Какая версия игры у тебя, 1.1.4.0 ?

2 Какой используешь отладчик,  у меня игра сразу падает. На Veh - ничего не находит. На window - падает.

1. Да; 2. СЕ, Режим ядра

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробовал, игра падает. Покажи скрин настроек СЕ пожалуйста.

У тебя какая windows стоит.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть инструкция (А) , работающая с координатами автомобиля. На целостность её проверяет инструкция (Б). Инструкцию (Б) на целостность проверяют инструкции (В, Г, Д, Е, Ё, Ж). Инструкцию (В) на целостность проверяют инструкции (Б, Г, и Д).... Всего в этом деле, относящимся к координатной инструкции, участвуют 13 инструкций, проверяющих целостность. Какие то чаще, какие то реже. Изменив одну - придется менять все.

 

Вот один из самых простых способов обхода защиты, предложенным Geri (с сайта СЕ). Я её реализовал на 10 процентов, из 100. дальше - закончилось желание.

 

Необходимые действия:

1. Даем 13 команд инструкцие (Б)

Инструкция Б имеет вид

xor al,[rdx]
cmc
bt edx,esi

Первая команда - проверить адрес {RDX} в текущий момент и сравнить с адресом ПЕРВОЙ (её самой) инструкции, если адрес совпадает, то подменить значение RDX оригинальным значением ПЕРВОЙ инструкции

 

Скрытый текст

newmem:

push rax
lea rax,[rdx] // загружаем адрес в регистр rax
cmp rax,7FF79BE3DE85 // сравниваем адрес в rax с адресом первой инструкции
pop rax
je Secondinstr // если адрес совпал, то идем на подмену значения (байт)

xor al,[rdx] // не совпал, пропускаем подмену
cmc
bt edx,esi

jmp exit

Secondinstr:

push rax
mov rax,#3281911039 // записывание оригинального значения инструкции в регистр
xor al,[rax] // подмена RDX на RAX
pop rax
cmc
bt edx,esi
jmp exit

 

 

Вторая команда идентична первой, разница лишь в том, что сравнивание будет производится с адресом второй инструкции.

 

В итоге получится что инструкция (Б) проверяя все 13 инструкций (в том числе и себя) несмотря ни на что, запишет оригинальные значения в RDX.

Тоже необходимо проделать и с остальными инструкциями. В итоге получится что все 13 инструкций не будут определять подмены байт, ни самих себя, ни других. Не смотря на всю их сложную многосплетенность.

Но на написания всего этого нужно время, и нужна внимательность, - одна ошибка в одной цифре, и вся система выйдет из строя. Где взять внимательность, где взять время, да еще для такой скучной игры как эта..

Самые основный читы как то, спидхак, телепорт, и прыжки, можно сделать и без внедрения в код. Следовательно. Проект закрыт.

 

Пример спидхака, с регулировкой подачи "азота" :)

 

 

 

 

 

Изменено пользователем AntonVit
Грам. ошибки
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 14.09.2016в20:11, Garik66 сказал:

ЗЫ: Сейчас качну игру из этой старой темы, в ней тоже было три проверки целостности кода, там нашли решение через постановку брейкпоинта.

Правда она у меня будет очень сильно тормозить, так как видео карта не тянет, но попробую в воскресение (до этого у меня времени не будет) на ней сделать способ Xipho и если всё получиться запишу видео. 

Попробовал, но пока не получилось.

Причём проблема не в написании самого кода, а в том, что в отличии игры у Xipho, наши игры 64-битные и инструкция repe movsb работает не корректно, так что сейчас создам тему в соответствующем разделе и кину сюда ссылку на неё:

Тема тут.

 

Изменено пользователем Garik66
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 14.09.2016в20:11, Garik66 сказал:

 и если всё получиться запишу видео. 

На этой неделе совсем со временем плохо было, так что практически ничего не сделал по этой теме, на следующей неделе будут длинные выходные (т.е. и суббота и воскресенье) - попробую всё-таки сделать обход защиты по методу Xipho для игры на которую дал ссылку.

Сегодня чуть чуть покопался в ней - пока обнаружил там 9 проверок.

Доделаю - запишу видео.

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Метод Xipho очень похож на метод SteveAndrew (http://forum.cheatengine.org/viewtopic.php?p=5462159)

Xipho кто у кого подсмотрел?

 

Я попробовал по такому методу обойти защиту в ACU, мне понравилось. Немного переделал и упростил, но суть осталась та же.

Теперь вместо 142 000 строк, всего около 2 000. Активация - 2 секунды. Иньекцирование читов во всем модуле, без лишних движений, в сравнении с методом который советовал Geri.

 

Кстати кто не знает еще, Geri, бывший модератор сайта Cheat Engine, год назад покинул нас.

А когда то я с ним разговаривал по поводу Dirt 3. Но, что теперь, такова участь всех людей. И тот наиболее горюет по кому то, кто наименее помнит о "ней". Для них она неожиданность. Для тех же кто помнит о ней всегда, она служит поводом меньше злится, обижаться, по всяким глупостям и пустякам, дорожить каждым днем, каждым общением. И т.д  и т. п.

 

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас