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

Assassin Creed Unity Обход защиты


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

Итак еще способы попробую

 

1. Использовать указатели и цепочки указателей

 

2. Использовать вызов функций (например когда берем деньги, то появляется уведомление) Способ прикольный, тем что код не меняется, а значит защита может спокойно себя чувствовать. Но функции вызывать может быть сложным.

 

3. Постоянно держать игру под отладкой. Например, когда прерываемся на адресе инструкции, то на Луа по данным регистров что-то делать...

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

Указатель на деньги не удалось достроить через трассировку 

 

--print(readInteger('7FFFB114540+28'))--print(readInteger('[80E95FC0]+28'))--print(readInteger('[[929F0F20+08]]+28'))--print(readInteger('[[929F0F08+18+08]]+28'))--print(readInteger('[[929F0F00+08+18+08]]+28'))--print(readInteger('[[[7FFFBEDCD88]+08+18+08]]+28'))--print(readInteger('[[[7FFFBEDCD80+8]+08+18+08]]+28'))--print(readInteger('[[[[74B347C0+A8]+8]+08+18+08]]+28'))--print(readInteger('[[[[[74B33370+b8]+A8]+8]+08+18+08]]+28'))--print(readInteger('[[[[[[[75183850+78]+24*8]+b8]+A8]+8]+08+18+08]]+28'))--print(readInteger('[[[[[[[[7D037860+a8]+78]+24*8]+b8]+A8]+8]+08+18+08]]+28'))print(readInteger('[[[[[[[[[7FFFB111C20+18]+a8]+78]+24*8]+b8]+A8]+8]+08+18+08]]+28'))7FFFB111C2014119777B - CC                    - int 3 14119777C - CC                    - int 3 14119777D - CC                    - int 3 14119777E - CC                    - int 3 14119777F - CC                    - int 3 141197780 - 48 89 5C 24 08        - mov [rsp+08],rbx  // откуда идет сюда прыжок не удалось узнать141197785 - 48 89 6C 24 10        - mov [rsp+10],rbp 14119778A - 48 89 74 24 18        - mov [rsp+18],rsi14119778F - 57                    - push rdi141197790 - 48 83 EC 30           - sub rsp,30141197794 - 48 8B 69 18           - mov rbp,[rcx+18]  //[rcx+18] = 7FFFB111C20141197798 - 48 8B DA              - mov rbx,rdx14119779B - 48 8B 8D A8000000     - mov rcx,[rbp+000000A8]1411977A2 - E8 99C8B5FF           - call 140CF40401411977A7 - 48 8D 4B 30           - lea rcx,[rbx+30]1411977AB - 48 8B F0              - mov rsi,rax1411977AE - E8 FD9BB300           - call 141CD13B01411977B3 - 48 8B F8              - mov rdi,rax1411977B6 - 48 85 C0              - test rax,rax1411977B9 - 74 71                 - je 14119782C1411977BB - 48 8B C8              - mov rcx,rax1411977BE - E8 7DC8B5FF           - call 140CF40401411977C3 - 48 8B D0              - mov rdx,rax1411977C6 - 48 85 C0              - test rax,rax1411977C9 - 74 56                 - je 1411978211411977CB - 8B 4B 10              - mov ecx,[rbx+10]...
Ссылка на комментарий
Поделиться на другие сайты

Что-то MasterGH погорячился конечно тему чистить. Чужой скрипт был приведен с единственной целью - посмотреть как защита обходится. Ещё раз напишу идею:

1) ставим бряк при помощи lua-фунции  

LuaCall(debug_setBreakpoint("адрес_ориг_инструкции"))

2) Меняем в обработчике прерываний debugger_onBreakpoint() содержимое регистра RIP адресом нашей инъекции

3) Проверяем. При отключении чита не забываем снять точку останова 

LuaCall(RemoveBreakPointNow("адрес_ориг_инструкции"))

Самому чтоли скачать, проверить и поделиться СВОИМИ скриптами... честно говоря лениво, но проверить способ интересно.

 

MasterGH: Чужие скрипты взятые из трейнеров публиковать нельзя. Другое дело, если автор свой же скрипт опубликовал в Интернете, тогда скрипт можно приводить ссылаясь на источник.
Изменено пользователем MasterGH
Ссылка на комментарий
Поделиться на другие сайты

Самому чтоли скачать, проверить и поделиться СВОИМИ скриптами... честно говоря лениво, но проверить способ интересно.

 

Давай подключайся к нам. :-D

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

Ещё до выкладывания скриптов aliast, была идея прописывать все повторяющиеся при перезагрузки игры регистры, но идея не сработала, т.к. основной (как я понял регистр RIP) СЕ не компилирует.

Пытался доработать этот скрипт:

 

 

Ещё раз напишу идею

aliast, я не понимаю, как это должно работать.

Может более подробно изложишь идею, как для лузера. 

[ENABLE]alloc(newMem1, 64)alloc(newMem2, 64)alloc(newMem3, 64)label(returnHere1)label(returnHere2)label(returnHere3)newMem1:mov RAX,000000007F4E35E1mov RDX,000000014771634A//push rcx                 // СЕ не компилирует не в таком варианте//mov rcx,ACU.exe//add rcx,55D7421//mov RIP,rcx//pop rcx//mov RIP,00000001455D7421 // не в такомmov R12,00000001455D54A0mov R15,0000000000000000xor al,[rdx]stc jmp ACU.exe+55D7AC3jmp returnHere1newMem2:mov RAX,0000000000000066mov RDX,00000001455CFAA4//mov RIP,00000001455D6591 // СЕ не компилируетmov R12,00000001455F0605mov R15,00000000000000B0xor al,[rdx]test bl,-65jmp returnHere2newMem3:mov RAX,0000000010278000mov RDX,00000001455D5599//mov RIP,0000000140007F4A // СЕ не компилируетmov R12,00000001455CE8B0mov R15,00000000000000B0xor al,[rdx]cmctest al,3Fjmp returnHere3ACU.exe+55D741F:jmp newMem1db 90 90 90returnHere1:ACU.exe+55D658F:jmp newMem2returnHere2:ACU.WriteData+22C8:jmp newMem3returnHere3:[DISABLE]ACU.exe+55D741F:xor al,[rdx]stc jmp ACU.exe+55D7AC3ACU.exe+55D658F:xor al,[rdx]test bl,-65ACU.WriteData+22C8:xor al,[rdx]cmctest al,3Fdealloc(newMem1)dealloc(newMem2)dealloc(newMem3) 
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Garik66, менять значения регистров eip и rip нельзя менять АА скриптами. Это можно сделать только в режиме отладки.

 

aliast, я не понимаю, как это должно работать.

Может более подробно изложишь идею, как для лузера.

Представь себе, что ты на инструкции отладочного кода денег, здоровья или еще чего нажал на F5. Инструкция прервалась, процесс игры остановлен. Ты вручную меняешь регистры через отладку, адреса через отладку... И отпускаешь игру. А поменяв RIP вручную, можешь перескочить на твой код. А вот Lua позволяет это автоматизировать. Например, поменять RIP регистр на прерывании на инструкции в автоматическом режиме. Т.е. без изменения оригинального кода так можно прыгнуть на новый код по RIP. Здесь надо экспериментировать с Lua по работе в отладке.

Но, тут привязка к VEH дебаггеру. Тут привязка к Cheat Engine движку и трейнерам созданных на CE. Любая игра под отладкой будет работать медленнее. В общем это обход защиты от изменения кода, но не отключение защиты. Но как вариант на худой конец может подойти.

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

Представь себе

Спасибо MasterGH.

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

 

aliast, на PG.ru трейнеры для этой игры от двух авторов, интересно у второго автора тоже используется метод отладки при обходе защиты?

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

Под отладкой игра может работать ощутимо медленнее чем без неё. Тормоза в первую очередь зависят от того, как часто будет прерываться инструкция под отладкой и как как быстро выполнится Lua код. Ничего не могу сказать про трейнеры с PG. Только код чужих трейнеров не публикуйте и скрипт без ссылки на источник. Мне придется его удалить.

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

но проверить способ интересно.

Проверил (подправил Lua-скрипт, который ты выкладывал - удалил лишние адреса, оставил только  healthbase) и в скрипте InfHealth добавил ту строчку, которую СЕ не хочет компилировать {LuaCall(RemoveBreakPointNow("healthbase"))}, не обращая внимание на СЕ, сохранил скрипты и активировал.

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

Так что Dison, можешь пользовать этот метод, нужно только научиться, как изменить стандартный вид скрипта, чтобы использовать в этом методе. А в Lua-скрипт, просто добавлять новые адреса.

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

Гарик какой метод где скрипт 

Я думал, что ты следил за своей темой - и соответственно успел скопировать скрипты, которые выкладывал aliast

MasterGH почистил тему, т.к. скрипты взяты из трейнера без согласия автора (с PG.ru).

 

Суть метода, что мы как бы не меняем кода игры своими скриптами, точнее смотри  это сообщение MasterGH и это сообщение aliast.

 

Скрипты, которые у меня есть: скрипт InfHealth и сопутствующий ему скрипт LUA. Могу кинуть тебе в личку, если нужны.

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

Впринципе я добился успеха по обходу защиты в игре.

 

То что у меня получилось

 

1 - Скриптовые наброски Aliast и Garik66

2 - Игра не вылетает при активации скрипта

3 - Получилось у меня добавить денег в кол-ве 9999999 и бесконечных предметов в кол-ве 99

4 - Если активировать и деактивировать несколько раз, то может быть вылет, вот с этим я еще пробую разобраться

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

1 - Итак приступим первое что нам нужно это добавить этот скрипт LUA

 

 

2  - Далее запускаем отладчик скриптом который ниже

3 - Пишем скрипт, я один приведу ниже

 

function debugger_onBreakpoint()if (RIP == getAddress("items")) then RIP=getAddress("itemsnewmem") debug_continueFromBreakpoint(co_run) return 1elseif (RIP == getAddress("healthbase")) then RIP=getAddress("healthnewmem") debug_continueFromBreakpoint(co_run) return 1elseif (RIP == getAddress("skillpoints")) then RIP=getAddress("skillpointsnewmem") debug_continueFromBreakpoint(co_run) return 1elseif (RIP == getAddress("creedpoints")) then RIP=getAddress("creedpointsnewmem") debug_continueFromBreakpoint(co_run) return 1else debug_continueFromBreakpoint(co_run) return 0 endendfunction SetBreakPointNow(AddressofAOB)debug_setBreakpoint(AddressofAOB)endfunction RemoveBreakPointNow(AddressofAOB)endfunction ActiveTheScripts()pause()table=getAddressList()i=1while i<5 domemory_record1=addresslist_getMemoryRecord(table,i)memoryrecord_freeze(memory_record1)i = i+3endlocal isActive=memoryrecord_isActive(memory_record1) --get the state after the hotkey got triggeredunpause()endfunction StartDebugging()debugProcess(2)endfunction DeActiveTheScripts()pause()table=getAddressList()i=1while i<5 domemory_record1=addresslist_getMemoryRecord(table,i)memoryrecord_unfreeze(memory_record1)i = i+1endlocal isActive=memoryrecord_isActive(memory_record1) --get the state after the hotkey got triggered
[ENABLE]LuaCall(StartDebugging()) -- Запускает отладчик//LuaCall(ActiveTheScripts()) -- Если активно то активирует скрипты автоматически[DISABLE]LuaCall(DeActiveTheScripts()) -- Выключает скрипты
[ENABLE]aobscanmodule(items,ACU.exe,39 78 28 0F 93 C0 48 8B 5C 24 30 48 83 C4 20 5F C3 48 8B 5C 24 30 48 83 C4 20 5F C3)registersymbol(items)alloc(itemsnewmem,2048,items)registersymbol(itemsnewmem)label(originalcode)label(above63)label(returnhere)registersymbol(itemE)  -- Регистрируем метку отвечающую за кол-во предметовregistersymbol(moneyE) -- Регистрируем метку отвечающую за кол-во денегlabel(moneyE) -- Создаем метку отвечающую за кол-во денегlabel(itemE)  -- Создаем метку отвечающую за кол-во предметовitemsnewmem: cmp [rax+28],63jg above63cmp [itemE],0je originalcodemov [rax+28],63jmp originalcodeabove63:cmp [moneyE],0je originalcodemov [rax+28],#9999999originalcode2:cmp [rax+28],edisetae aljmp returnhereitemE:dd 0moneyE:dd 0items+6://"ACU.exe"+EBD057://jmp newmem//nopreturnhere:LuaCall(SetBreakPointNow("items"))[DISABLE]items:////cmp [rax+28],edi//setae alLuaCall(RemoveBreakPointNow("items"))//Alt: db 39 78 28 0F 93 C0unregistersymbol(items)unregistersymbol(itemE)unregistersymbol(moneyE)unregistersymbol(itemsnewmem)dealloc(itemsnewmem) 
Изменено пользователем Dison
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

В Твоем варианте 4 недочета.

1. CE не может сравнить адрес из [RDX] таким способом:

cmp rdx,1455d741f

Но может:

push rsi
push rdi
lea rsi,[rdx]
mov rdi,00000001455d741f
cmp rsi,rdi
pop rdi
pop rsi
je Ouradress

2. Так как регистр RDX восьми байтовый, то нужно брать большее количество байт для подмены

Например инструкции

xor al,[rdx]
stc
jmp ACU.exe+55D7AC3

состоят из следующие байт - 32 02 F9 E9 9C 06 00 00

Нужно брать на 4 более "до" и "после" них. - 50 AA FF FF - 32 02 F9 E9 9C 06 00 00 - E9 26 59 FF

 

3. CE не может корректно установить 64 битный адрес (вариант из Твоей таблицы)

cmp rdx,1455d741f
je x1

В итоге в месте прыжка он будет выглядеть так (без единицы вначале)

cmp rdx,455d741f
je x1

Можно выйти из положения:

push rsi
push rdi
lea rsi,[rdx]
mov rdi,00000001455d741f
cmp rsi,rdi
pop rdi
pop rsi
je Ouradress

4. В этой игре не 4, и не 5, и даже не 10 проверяющих инструкций. Минимум 13. Некоторые срабатывают после нескольких минут.

 

(В "The crew" - минимум 21)

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

Защита ACU обезврежена. Инъекции инъекцируются, игра играется.

 ~~ 142 000 строк кода вручную, на активацию, - минута

Брейкпоинт/дебаг, полный дамп модулей, - не используется.

 

 

*Но как сказал Еклисиаст, - "Суета сует и томление духа".

 

 

 

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

  • 2 недели спустя...
×
×
  • Создать...

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

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