Перейти к содержанию

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


Рекомендуемые сообщения

Хм, даже не видел этот пост. Впрочем, метод весьма распостраненный, и самый первый, что приходит в голову ) Так что неудивительно, что по одному алгоритму действовали ) А код, действительно, один в один как у меня ) Ну или у меня, как у него ))

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

"Assassins Unity", "Assassins Syndicate", "The Crew" - под анестезией. Самый непокорный - "The Crew", принял целых 28 ! "таблеток". Менее затратный - "Unity" - для него хватило 15 ти. Самый тихий -  "Syndicate", - 10 "таблеток".

 

P.S. Кстати, можно копирнуть за полсекунды весь "Ехе" модуль еще до внедрения инструкций, чтобы не пришлось потом затирать изменения в псевдомодуле, удобно.

 

* В "The Crew" я как то раз заморозил на одном месте какого то игрока (его машину), а это значит - разработчики так устроили игру, что я теперь имею полный контроль над всеми машинами, над их положением, над их скоростью :)

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

7 часов назад, Xipho сказал:

Скрипты выложишь?

Если выложу, то Гарику не интересно будет самому доделать начатое. Либо он, в случае затруднения, воспользуется наработкой, и заполнит ею свои пробелы. Так что, сперва наперво поглядим на то что сделает Гарик. А там, как Бог устроит.

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

Для Влада. Гарик - не читай пожалуйста!  (пока сам не сделаешь).

 

Сложности при обходе защиты. (бывшие со мной).

 

1 Неизвестность и неопытность

Неизвестность и неопытность

 

2 Время

Так как инструкция (к примеру первая), состоит из 7 ми байт - 11 22 33 44 55 66 77, то и бряки соответственно нужно ставить на каждый из этих адресов.
 

Дебагер за раз может поставить всего 3 бряка (в  "The Crew" DBK64 четвертый бряк замирает и не ищет). плюс к этому некоторые инструкции срабатывают спустя несколько минут (2 - 5).

Нашли 27 инструкций (всего примерно 27 * 8 = 216 байт) 216 / 3 (за раз) = 72 раза по 3 бряка. 72 * 3 минуты = 216 минут. Не нашли и вроде все нормально со скриптами? Ставим на соседние байты (не принадлежащие нашим инструкциям) - опять время.

А все из за одной 28 ой. (это к примеру).  Бывает находится скоро.

 

3 Особенности CE

Имеем инструкцию

xor al,[rdx]

1

СЕ не может сравнить адрес из RDX таким способом (для 64 битных игр)

cmp rdx

Но может

push rsi
lea rsi,[rdx]
cmp rsi

2

В СЕ для взятия адреса выделенной памяти (64 бит игра) лучше (обязательно) использовать MOV вместо LEA

Вместо

push rdi
lea rdi,[Somealloc]

Лучше использовать

push rdi
mov rdi,Somealloc

3.

Если все написано правильно, но игра по прежнему крашится, необходимо проверить правильность записи инструкций в newmem, в месте прыжка, сравнить то что написали мы, и то что записал СЕ.

4

Ехе модуль

* Размер Ехе файла не всегда соответствует размеру самого Ехе модуля, поэтому, при создании копии, длину выставлять не опираясь на данные файла.

* Не обязательно копировать весь модуль

Нашли 28 инструкций, посмотрели максимальное смещение от начала модуля, посмотрели максимальное смешение для инструкций самих читов (если таковые уже имеются, если нет, то потом можно увеличить копию в длине для них).

Максимальное смещение 80 000 00

Копируем 100 000 00

Сравниваем до 90 000 00

push rsi
push rdi
lea rsi,[rdx]
lea rdi,["TheCrew.exe"+9000000]
cmp rsi,rdi
pop rdi
pop rsi
jge NotCrewexeBytes

* Сделали копию, необходимо проверить.

Берем максимальное смещение 100 000 00, и идем смотреть что по этому смешению в сделанной копии - если что то есть, и это что то подобно тому что и в оригинальном модуле по этому же смещению, - с копией все нормально.

 

Если делать копию методом что и у Xipho, как я сперва делал, то как мне кажется, удобнее и проще затереть в ней изменения так:

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

push rcx
push rsi
push rdi
lea rsi,["ACU.exe"]
lea rdi,["PLACE_ACU_clone"]
mov rcx,05F5E100 //hex value of "alloc(PLACE_ACU_clone,100000000)"
repe movsb
pop rdi
pop rsi
pop rcx


//1 первая инструкция - затирание 16 байт (для подстраховки)
mov ["PLACE_ACU_clone"+55D741F],E9F90232
mov ["PLACE_ACU_clone"+55D7423],0000069C
mov ["PLACE_ACU_clone"+55D7427],FF5926E9
mov ["PLACE_ACU_clone"+55D742b],108966FF

//2 вторая
mov ["PLACE_ACU_clone"+7F48],A8F50232
mov ["PLACE_ACU_clone"+7F4c],C283483F
mov ["PLACE_ACU_clone"+7F50],F58E0F01
mov ["PLACE_ACU_clone"+7F54],FF055C1E

// и т д

 

Другое дело если запатчат игру, то такое затирание уже не будет работать правильно. Но, для тех кто еще не сделал даже сам обход, такой метод даст более уверенную гарантию на то, что с этой частью кода все нормально.

А далее когда защита будет отключена, можно уже и адаптировать под патч и под прыжки. Сделать аоб на инструкции, на прыжки, и прочее.

mov eax,[rax]
jmp ACU.exe+55CD910

* И еще куча всяких мелких сложностей, как то не внимательность, забывчивость.

Бывало ставил в каждой инструкции "стражей", которые бы показывали какая инструкция в данный момент работает, это тогда когда нашел 27 из 28.

27 ая инструкция самая хитросплетенная. Воспользовалась тем что у меня не очень острое зрение.

Её вид - 83D

А вид  четвертой, уже известной - B3D

"B" и "8". Но она скоро была разоблачена, когда все 26 стали сканить копию, а она одна по прежнему приходила в оригинал. И, в момент вылета, DBK64 сделал свое дело.

28 мая тоже не айс, проверяла при загрузке из меню игры в саму игру, и спустя некоторое время в самой игре. Также как и 27,в те же сети.

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

В 01.10.2016в14:09, AntonVit сказал:

//1 первая инструкция - затирание 16 байт (для подстраховки) mov ["PLACE_ACU_clone"+55D741F],E9F90232 mov ["PLACE_ACU_clone"+55D7423],0000069C mov ["PLACE_ACU_clone"+55D7427],FF5926E9 mov ["PLACE_ACU_clone"+55D742b],108966FF

Может еще для большей простоты можно сделать так:

"PLACE_ACU_clone"+55D741F:
db 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF // Сюда вставлять байты оригинальной инструкции

 

 

Изменено пользователем Vlad2
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Vlad2 сказал:

Может еще для большей простоты можно сделать так:


"PLACE_ACU_clone"+55D741F:
db 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF // Сюда вставлять байты оригинальной инструкции

 

 

 

Так проще, но так не будет работать.

 

 

Чтобы СЕ понял в точности что от него требуется, лучше для каждого скрипта из 28, создать свой отдельный "alloc".

// для 1 инструкции
alloc(PLACE_ACU_clone,100000000)
registersymbol(PLACE_ACU_clone)

// для 2 инструкции
alloc(PLACE_ACU_2_clone,100000000)
registersymbol(PLACE_ACU_2_clone)

// для 3 инструкции
alloc(PLACE_ACU_3_clone,100000000)
registersymbol(PLACE_ACU_3_clone)

и т. д.

Что если все 28 инструкций будут выделять память, с одним и тем же именем.

Мы получим, 28 новых локаций, хоть и имя мы указывали одно, и локацию мы ожидали всего одну.

СЕ для себя определит начальные адреса каждой локации, мы нет.

Мы имеем только одну метку "PLACE_ACU_clone". Для того чтобы узнать и нам адреса всех локаций, мы будем вынуждены переходить в каждый newmem и от туда уже брать нужный нам адрес.

 

Вывод, - для каждой инструкции, свое имя локации.

 

Чтобы активировать скрипты, необходима заморозить игру.

Есть например программа "Process Explorer", в ней если кликнуть правой кнопкой на процесс и выбрать "Suspend", игра заморозится, для разморозки, - кликаем на "Resume".

 

Мы же с вами воспользуемся опцией самого СЕ, опцией Pause() - для заморозки, Unpause() - для разморозки. Но это для Lua, - вешать на кнопку или другой подобный объект управления активацией.

Для временного тестирования скриптов, достаточно в  - настройки / горячии клавиши / пауза - прописать F12, например.

 

СЕ не понимает когда от него требуют сравнить регистр и метку, а или и понимает, но не так как того хотим мы.

Поэтому при сравнении, используем только регистры. Которые должны быть заблаговременно чем то нам нужным заполнены.

 

И последнее, используем "датчики" для контроля происходящего. Создаем в скриптах маленькие локации по 8 !!! байт, (в таблице также 8 и HEX).

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

alloc(Datchic1,8)
registersymbol(Datchic1)

alloc(Datchic2,8)
registersymbol(Datchic2)

alloc(Datchic3,8)
registersymbol(Datchic3)

alloc(Datchic4,8)
registersymbol(Datchic4)

alloc(Datchic5,8)
registersymbol(Datchic5)

alloc(Datchic6,8)
registersymbol(Datchic6)


push rcx
push rsi
push rdi
mov rsi,"TheCrew.exe"

mov [Datchic1],rsi // проверяем что в регистре, смотря на значение в таблице 

mov rdi,"PLACE_TheCrew_clone"

mov [Datchic2],rdi // проверяем что в регистре, смотря на значение в таблице 

mov rcx,055D4A80 // 90 000 000
repe movsb
pop rdi
pop rsi
pop rcx

// Востанавливаем байты
mov ["PLACE_TheCrew_clone"+9EC7A],48F50232
mov ["PLACE_TheCrew_clone"+9EC82],E901C283

SkipCopy:
push rsi
lea rsi,[rdx]

mov [Datchic3],rsi // проверяем что в регистре, смотря на значение в таблице

cmp rsi,TheCrew.exe // так не сравниваем, сравниваем только регистр с регистром

//push rbp
//lea rbp,["TheCrew.exe"]
//cmp rsi,rbp
//pop rbp
//jb originalcode // я использовал "jle" и "jge". "jge" будет отображатся как "jnl" что совсем не страшно. Можно записать сразу "jnl"


//push rbp
//lea rbp,["TheCrew.exe"+04C4B400]
//cmp rsi,rbp
//pop rbp
//ja originalcode

jb originalcode
cmp rsi,TheCrew.exe+04C4B400 // 80 000 000
ja originalcode

 

 

 

 

 

Изменено пользователем AntonVit
...
Ссылка на комментарий
Поделиться на другие сайты

В 25.09.2016в20:04, Garik66 сказал:

на следующей неделе будут длинные выходные (т.е. и суббота и воскресенье)

Ни фига не дали выходных :wacko:, так что сегодня ещё не много покопался, но пока окончательного результата не добился. Попробую в следующие субботу и воскресенье.

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

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

Скрипт перепроверил - копия exe -ника создаётся и восстанавливается до оригинала:

11634407.jpg

11627239.jpg

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

У меня получилось найти только 22 проверки из 28, остальные 6 никаким образом не находятся, если даже бряки держать по 10 минут. При внедрении скриптов на все эти 22 инструкции, игра все равно вылетает. Вылет происходит во время копирования ехе файла, соответственно дело до затирания прыжков оригинальными байтами не доходит. Следовательно предполагаю, что какая-то из неизвестных 6 проверок обнаруживает изменение в коде и вызывает краш.

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

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

В общем, у меня все получилось, но только 22 проверки были найдены. Почему до этого вылетало всё не могу понять, но когда я написал скрипт, который копирует ЕХЕ файл и выполнил этот скрипт отдельным потоком, а потом уже в эту копию ехе отправил проверки, тогда все заработало)
Теперь не придется затирать прыжки оригинальными байтами, тк был скопирован чистый ехе файл.

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

5 часов назад, Vlad2 сказал:

 

В общем, у меня все получилось

 

Тоже сделал. (но для Assassins Creed Unity). Скрипт - 426 строк кода.

Проверок 9 штук.

Некоторые нюансы с 8-байтными адресами (скорее всего это ограничение СЕ).

Ну и в некоторых местах скрипта моя невнимательность - не там восстанавливал используемый регистр и в двух местах при копировании кода спутал регистр.

Попробую сегодня записать видео и сюда выложу ссылку на тему.

 

 

 

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

12 часа назад, Vlad2 сказал:

В общем, у меня все получилось, но только 22 проверки были найдены. Почему до этого вылетало всё не могу понять, но когда я написал скрипт, который копирует ЕХЕ файл и выполнил этот скрипт отдельным потоком, а потом уже в эту копию ехе отправил проверки, тогда все заработало)
Теперь не придется затирать прыжки оригинальными байтами, тк был скопирован чистый ехе файл.

 

И что, эта тема и закончится лишь тем, что Ты нам сообщишь о своем успехе?

Где скрипты, где слова благодарности всем тем кто помогал, писал, болел (наверно). :)

 

Выложи, объясни, заверши прилично открытую Тобою тему. Не будь только потребителем. Не слышишь ли слова Администратора "Скрипты выложишь?"?

 

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

Интересный подход к делу. Я конечно не пробовал не разу это дело  в силу того, что ну не нуждался в этом (Так как игры не попадались ещо подобные в интерес мне) но не постесняюсь спросить :) а почему именно на доступ ставим, а не на запись ? Ведь если рассуждать логически, то защита то одна и наверное глупо делать 20 штук в одной игре - не так ли ? Это же не что подобное той же жизни в игре - когда мы ставим бряк на доступ, то выпадает бывает около 20 инструкций, а то и больше - не правда ли :rolleyes: но это не значит, что все их надо править и записывать в каждую 100 HP - достаточно одной и это та, которая идет на запись и вот запиши в неё 0  она перебьёт все остальные инструкции в каком бы интервале они не считывались. А это получается, надо точно выявить нужную инструкцию и с ней работать, но так как (мы) не особо то соображаем как эта защита работает, то мы берем и правим всё что выпадает после BP делаем скрипт, врубаем и радуемся :) ведь так оно и есть ведь на самом деле. Это можно сравнить с тем, как сломать тот же телевизор и сделать так, что бы он не работал. Кто то  полезет в него (это в нашем случаи с большим количеством инструкций) и будет от туда выпаивать детали до тех пор, пока он работать не перестанет, а кто то просто из корню вилку отрежет и его уже не включишь.  

Я конечно понимаю, что поставив на запись BP может не чего и не выпасть, но всё равно ведь это дело то работает и окончательный результат куда то пишется. Весь вопрос наверное и состоит в том "Куда?"  

PS: 

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

 

Щас игра попалась "Aliens vs Predator" 2010 - там не знай что за защита, может не что подобное. Утром тоже попробую - если она у меня пойдет на моей карте!

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

А нельзя, например, найти саму функцию, которая проверяет код и просто пропатчить результат который вызывает падение игры? Черт, из-за всех этих интересностей с этим обходом появилось желание по ковырять игру.  Не буду больше ночью заходить на форум из-за всего этого сон как рукой сняло.:D

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
В 05.10.2016в10:22, Vlad2 сказал:

В общем, у меня все получилось, но только 22 проверки были найдены. Почему до этого вылетало всё не могу понять, но когда я написал скрипт, который копирует ЕХЕ файл и выполнил этот скрипт отдельным потоком, а потом уже в эту копию ехе отправил проверки, тогда все заработало)
Теперь не придется затирать прыжки оригинальными байтами, тк был скопирован чистый ехе файл.

Уважаемый Vlad2 Можно немного поподробней как вы это все реализовали со скриншотами, у меня w10x64 брейк поинты ловит но при создание скриптов отключает от сервера , сама защита игры лежит в systemdetection64.dll и при запуске она прописывается в exe игры, так же она палит отладчик.
настройки у меня стоят такие в CE http://prntscr.com/cttamt  http://prntscr.com/cttaxv + активирован режим DBVMv10 http://prntscr.com/cttbjq

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

Народ нашло много инструкций делал на нитро это норма мне теперь на  все инструкции  Обход защиты целостности кода делать по примеру Garik66 bypass?
0bfb83de1df74ad6b10a6ffcfda66c1d.png

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

1 час назад, RAMIRO сказал:

Народ нашло много инструкций делал на нитро это норма мне теперь на  все инструкции  Обход защиты целостности кода делать по примеру Garik66 bypass?
 

Это инструкции срабатывающие на адресе самого нитро, а не инструкции проверок. Пересмотрите видео по новой.

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

Я искал значение нитро в этой игре, но ничего не нашел.

Искал по разному, - и на уменьшилось когда уменьшилось, и на увеличилось когда уменьшилось. И на изменилось, и не изменилось.

 

Либо значение нитро шифруется и передается с сервера, либо также шифруется и передается со стороннего процесса.

 

Почему так решил, - потому что если убавить нитро на 70% (к примеру), и заморозить процесс игры, далее выждать 20 секунд (время необходимое на полное заполнение нитро баллона), после всего этого разморозить игру,  - то в итоге мы увидим что баллон с нитро будет уже полный. (когда бы он успел заполниться если игра и все данные игры были полностью заморожены).

 

* Заполняется баллон с нитро в игре автоматически и постепенно, ничего особого делать не нужно.

 

Вот и Sethioz, похоже также не смог найти нитро, после того как игру обновили. В его прежнем трейнере есть эта опция, а в следующем уже нет.

RAMIRO обошел и меня и Sethioza, осталось обойти теперь только защиту....

 

 

 

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

1 час назад, RAMIRO сказал:

Народ нашло много инструкций делал на нитро это норма мне теперь на  все инструкции  Обход защиты целостности кода делать по примеру Garik66 bypass?

Я же Вам уже об этом на Тюбе писал. Вы не туда копаете. Пересмотрите видео, чтобы понять.

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

 

39 минуты назад, AntonVit сказал:

Я искал значение нитро в этой игре, но ничего не нашел.

Искал по разному, - и на уменьшилось когда уменьшилось, и на увеличилось когда уменьшилось. И на изменилось, и не изменилось.

 

Либо значение нитро шифруется и передается с сервера, либо также шифруется и передается со стороннего процесса.

 

Почему так решил, - потому что если убавить нитро на 70% (к примеру), и заморозить процесс игры, далее выждать 20 секунд (время необходимое на полное заполнение нитро баллона), после всего этого разморозить игру,  - то в итоге мы увидим что баллон с нитро будет уже полный. (когда бы он успел заполниться если игра и все данные игры были полностью заморожены).

 

* Заполняется баллон с нитро в игре автоматически и постепенно, ничего особого делать не нужно.

 

Вот и Sethioz, похоже также не смог найти нитро, после того как игру обновили. В его прежнем трейнере есть эта опция, а в следующем уже нет.

RAMIRO обошел и меня и Sethioza, осталось обойти теперь только защиту....

 

 

 

Sethioz читы лепает по изи способам т.к американцы глупей нас во взломе инфа 100 ,мы же русские  не ищем легких путей и пробуем изощренные способы взлома.
Игровые значение можно солидно выдирать с помощью process hacker потом через CE оттискивать что нужно пруф
fee67acf07e244d0b243920a40f9a36c.png

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

2 часа назад, RAMIRO сказал:

Народ нашло много инструкций

RAMIRO, если у Вас есть веб-камера, то специально для таких случаев - регистрировал аккаунты в Скайпе, а то писать нужно много. И если сейчас есть время, давайте объясню, как делать по Скайпу.  Жду ответа.

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

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.