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

Как сделать свои читы долгоживущими на примере игры Unepic


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

Скрипт:

Спойлер

{
  Game   : unepic.exe
  Version: 1.0
  Date   : 08-05-18
  Author : Garik66
  Version CE: 6.5  Make by aamaker Lua plagin Version 2.4.0.G66.1 :)
  [EN] Technical support: http://forum.cheatengine.org/viewtopic.php?p=5645967
  [RU] Техническая поддержка: https://forum.gamehacklab.ru/index.php?/topic/1415-plugin-aa-maker-создание-аа-скриптов
}

[ENABLE]
aobscan(Test,8bxxxxxxxxxx33xxxxxx33xxxxxx3b)
alloc(newmem,$1000,unepic.exe+2D455)
label(code)
registersymbol(code)
label(return)
registersymbol(Test)

newmem:
  mov edx,[code+2]
  mov [edx],deaddead

code:
  readmem(Test,6)
  jmp return

Test:
  jmp newmem
  nop
return:

[DISABLE]
Test:
  readmem(code,6)

unregistersymbol(code)
unregistersymbol(Test)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: unepic.exe+2D455

unepic.exe+2D447: CC                            - int 3 
unepic.exe+2D448: CC                            - int 3 
unepic.exe+2D449: CC                            - int 3 
unepic.exe+2D44A: CC                            - int 3 
unepic.exe+2D44B: CC                            - int 3 
unepic.exe+2D44C: CC                            - int 3 
unepic.exe+2D44D: CC                            - int 3 
unepic.exe+2D44E: CC                            - int 3 
unepic.exe+2D44F: CC                            - int 3 
unepic.exe+2D450: A1 848C6800                   - mov eax,[00688C84]
// ---------- INJECTING HERE -----------
unepic.exe+2D455: 8B 15 888C6800                - mov edx,[00688C88]
// ---------- DONE INJECTING  ----------
unepic.exe+2D45B: 33 44 24 04                   - xor eax,[esp+04]
unepic.exe+2D45F: 33 54 24 08                   - xor edx,[esp+08]
unepic.exe+2D463: 3B C2                         - cmp eax,edx
unepic.exe+2D465: 74 0A                         - je 0042D471
unepic.exe+2D467: C7 81 180D0000 01000000       - mov [ecx+00000D18],00000001
unepic.exe+2D471: C2 0800                       - ret 0008
unepic.exe+2D474: CC                            - int 3 
unepic.exe+2D475: CC                            - int 3 
unepic.exe+2D476: CC                            - int 3 
unepic.exe+2D477: CC                            - int 3 
}

 

Видео:

 

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

Урок из разряда "как из сигнатуры, сделать проблемы для новичков"

Такие сигнатуры ужасны из-за того, что уникальность сигнатуры зависит от её длинны, т.е на том же юнити, SigMaker'у достаточно 10-20 байт, чтобы сигнатура работала долгое время(7+ месяцев),  способом который показан на видео её придется раза в 3-4 удлинять, такой способ будет годным, если будет какой-нибудь плагин, который бы в цикле создавал сигнатуру и проверял её уникальность по всему модулю игры, пока она 100% не будет уникальной.

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

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

Урок из разряда "как из сигнатуры, сделать проблемы для новичков"

Спасибо за оценку.

Я показал способ (сомневаюсь, что новички его знают).

Моя Табличка для мода для Дьябло (The Hell) проработала 3 года ( по моему). работает и сейчас (разработчики перестали над ним работать). Сигнатуры там делал вручную.

 

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

Видео-то не плохое, хорошее. Все подробно изложено и работает.

 

Что можно улучшить до идеала. Попробовать кому-нибудь аналитику прикрутить с проверкой нашлась сигнатура или нет. Результат попробовать отправлять в сервис аналитики. Возможно Firebase или что-то похожее

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

  • 7 месяцев спустя...

объясни  пожалуйтса как сделать  в скрипте через readmem  когда инструкция типа

mov eax, [game.exe+1234]

когда изменяеться версия  игры то допустим  инструкция  меняеться на

mov eax, [game.exe+5678]

как  написать в скрипте что бы он  мог дальше работать когда  меняеться  game.exe+ ?

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

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

как  написать в скрипте что бы он


Для сигнатуры просто делаешь маску, типа 8B ? ? ? ?, главное чтобы она была уникальной. Дальше высчитываешь смещение от начала сигнатуры, до [game.exe+1234] и получаешь 4 байта указывающие на [game.exe+1234]

Вот для примера.

 

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

12 часов назад, Alex2411 сказал:

как  написать в скрипте

Скрин:

Спойлер

image.thumb.png.4e77741325c996a881db9256f5d9e9ab.png

Скрипт:

Спойлер

{ Game   : Tutorial-i386.exe
  Version: 
  Date   : 2019-03-29
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(INJECT,Tutorial-i386.exe,A1 E0 15 60 00 E8 CB) // should be unique
alloc(newmem,$1000)
label(code)
registersymbol(code)
label(return)
label(Value)
registersymbol(Value)
registersymbol(INJECT)

newmem:

code:
  readmem(INJECT,5)
  //mov eax,[Tutorial-i386.exe+2015E0]
  jmp return

Value:
  dd 0

INJECT:
  jmp newmem
return:

[DISABLE]
INJECT:
  readmem(code,5)
  // db A1 E0 15 60 00

unregistersymbol(Value)
unregistersymbol(code)
unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+240DB

"Tutorial-i386.exe"+240AF: 00 53 56                       -  add [ebx+56],dl
"Tutorial-i386.exe"+240B2: 89 C6                          -  mov esi,eax
"Tutorial-i386.exe"+240B4: E8 F7 63 FF FF                 -  call Tutorial-i386.exe+1A4B0
"Tutorial-i386.exe"+240B9: 89 F1                          -  mov ecx,esi
"Tutorial-i386.exe"+240BB: B8 0C 4B 5A 00                 -  mov eax,Tutorial-i386.exe+1A4B0C
"Tutorial-i386.exe"+240C0: BA 01 00 00 00                 -  mov edx,00000001
"Tutorial-i386.exe"+240C5: BB 0C 4B 5A 00                 -  mov ebx,Tutorial-i386.exe+1A4B0C
"Tutorial-i386.exe"+240CA: FF 93 C4 00 00 00              -  call dword ptr [ebx+000000C4]
"Tutorial-i386.exe"+240D0: A3 E0 15 60 00                 -  mov [Tutorial-i386.exe+2015E0],eax
"Tutorial-i386.exe"+240D5: 8B 96 3C 02 00 00              -  mov edx,[esi+0000023C]
// ---------- INJECTING HERE ----------
"Tutorial-i386.exe"+240DB: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
// ---------- DONE INJECTING  ----------
"Tutorial-i386.exe"+240E0: E8 CB EE 06 00                 -  call Tutorial-i386.exe+92FB0
"Tutorial-i386.exe"+240E5: 8B 96 E8 00 00 00              -  mov edx,[esi+000000E8]
"Tutorial-i386.exe"+240EB: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
"Tutorial-i386.exe"+240F0: E8 4B F1 06 00                 -  call Tutorial-i386.exe+93240
"Tutorial-i386.exe"+240F5: 8B 96 28 01 00 00              -  mov edx,[esi+00000128]
"Tutorial-i386.exe"+240FB: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
"Tutorial-i386.exe"+24100: E8 AB ED 06 00                 -  call Tutorial-i386.exe+92EB0
"Tutorial-i386.exe"+24105: 8B 96 30 02 00 00              -  mov edx,[esi+00000230]
"Tutorial-i386.exe"+2410B: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
"Tutorial-i386.exe"+24110: E8 1B EE 06 00                 -  call Tutorial-i386.exe+92F30
}

 

 

Скрин2:

Спойлер

image.png.3ee5a2e00602369cd099cb67e6a9577a.png

 

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

спасибо за ответы , но  мне нужно не много  другое. наверно я плохо объяснил . извините

 

код игры

BattleBrothers.exe+E4EF2 - A1 54D26F00           - mov eax,[BattleBrothers.exe+2FD254] // тут адресс для фильтра
BattleBrothers.exe+E4EF7 - F3 0F10 80 00010000   - movss xmm0,[eax+00000100]
BattleBrothers.exe+E4EFF - F3 0F10 88 FC000000   - movss xmm1,[eax+000000FC]
BattleBrothers.exe+E4F07 - F3 0F5C 46 0C         - subss xmm0,[esi+0C] // тут инжект
BattleBrothers.exe+E4F0C - F3 0F5C 4E 08         - subss xmm1,[esi+08]

ижект скрипта я делаю  на инструкцию BattleBrothers.exe+E4F07 . для фильтра  в своем скрипте  я беру  адрес [BattleBrothers.exe+2FD254]  из  инструкци которая выше. получаеться так

 subss xmm0,[esi+0C]
 push ecx
 mov ecx,[BattleBrothers.exe+2FD254] // адрес фильтра сюда
 mov ecx,[ecx+100]
 cmp ecx,[esi+0C]
 pop ecx
 jne

когда  выходят патчи на игру  смешение [+2FD254]  меняеться и скрипт  не работает . в последнем  патче адерс поменялся на [BattleBrothers.exe+2FF254] .
как  сделать что бы  скрипт продолжал  работать  когда смещение меняеться ?  пробовал  с начала  прочитать  смещение командой readmem в  метку, а  потом эту  метку ставить в скипт , но  что то делал не правильно  и скрипт не работает и  крашиться . не могу сообразить  как сделать .

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

Если сложно пока в одном скрипте все реализовать, то используй глобальные переменные. Первый скрипт, берет [BattleBrothers.exe+2FD254], помещает в глобальную переменную. Второй скрипт использует эту глобальную переменную.

 

##########Script 1##########
globalAlloc(Base, $4)

mov eax,[BattleBrothers.exe+2FD254]
mov [Base], eax

 

##########Script 2##########

subss xmm0,[esi+0C]
push ecx
mov ecx,[Base]
mov ecx,[ecx+100]
cmp ecx,[esi+0C]
pop ecx
jne

 

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

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

Первый скрипт, берет [BattleBrothers.exe+2FD254], помещает в глобальную переменную.

 

это я понимаю , но ведь  тогда скрипт перестанет  работать когда  смещение [+2FD254]  измениться ? вместо [BattleBrothers.exe+2FD254] будет [BattleBrothers.exe+2FF254] ?  с помощи aob  этот адрес не найти . по адресу [BattleBrothers.exe+2FD254] там не код , а разные  числа которые использует игра  они все время  меняються .
нужное  смещение [+2FD254] или [+2FF254] или другое всегда  есть  в инструкции

BattleBrothers.exe+E4EF2 - A1 54D26F00           - mov eax,[BattleBrothers.exe+2FD254]

 это смещение  меняеться с новым патчем. что бы  взять  смещение из этой инструкции  я пробовал  командой readmem  прочиать байты смещения 54D26F и подставить в свой  скрипт , но запутался . как это  правильно сделать ?

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

47 минут назад, Alex2411 сказал:

как это  правильно сделать ?

 сложить 1 + 1.

Короче. если затрудняешься кинь сюда два СЕ-ных АА- скрипта с Логами из инструкций  

1. 

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

BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254]

2.

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

BattleBrothers.exe+E4F07 - F3 0F5C 46 0C - subss xmm0,[esi+0C] // тут инжект

 

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

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

с помощи aob  этот адрес не найти

Почему? У тебя есть сигнатура с маской, маска решает проблему с меняющимися значениями, смещениями, переменными.

 

33 минуты назад, Garik66 сказал:

Короче. если затрудняешься кинь сюда два

ИМХО Не стоит, ему надо понять как сигнатуры работают, а это лишь дополнительные проблемы создаст.

 

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

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

как это  правильно сделать ?

Хотя можно и в одном скрипте попробовать.

Мне ждать тебя некогда, короче попробуй так (писал на коленке):

Спойлер

[ENABLE]
aobscanmodule(INJECT,BattleBrothers.exe,F3 0F 5C 46 0C)
alloc(newmem,$1000)
label(code)
registersymbol(code)
label(return)
registersymbol(INJECT)

newmem:
  subss xmm0,[esi+0C]
  push ecx
  mov ecx,[code+1] // адрес фильтра сюда
  mov ecx,[ecx+100]
  cmp ecx,[esi+0C]
  pop ecx
  jne
  //сюдым что нужно

code:
  readmem(INJECT-15,5)
  jmp return

INJECT:
  jmp newmem
return:

[DISABLE]
INJECT:
  subss xmm0,[esi+0C]

unregistersymbol(code)
unregistersymbol(INJECT)
dealloc(newmem)

 

 

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

Мне тоже интересно решение.

Что если так?

Спойлер

 //Инжект как и задумыалось сделать на subss xmm0,[esi+0C]
 ***********************************
 subss xmm0,[esi+0C]
 push ecx
 mov ecx,eax // в eax уже адрес фильтра
 mov ecx,[ecx+100]
 cmp ecx,[esi+0C]
 pop ecx
 jne
  ***********************************

 

 

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

1 минуту назад, Antonshka сказал:

в eax уже адрес фильтра

:D Черт....................... точно.

Вот оно - когда глаза замылены, не видим очевидного. :lol:

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

14 минут назад, Antonshka сказал:

в eax уже адрес фильтра

ЗЫ; так и в 

 movss xmm0,[eax+00000100]

xmm0 лежало уже то, с чем сравнивает ТС.
Т.е. сравнение можно было и совсем по другому организовать.

 

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

46 минут назад, partoftheworlD сказал:

Почему? У тебя есть сигнатура с маской, маска решает проблему с меняющимися значениями, смещениями, переменными.

 

она есть на  саму инструкцию

BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254]

на ее адрес  BattleBrothers.exe+E4EF2 , а на  адрес который  в этой инструкции BattleBrothers.exe+2FD254  нет . я  понимаю что  по маске  можно найти даже  если меняються смешения , но по адресу  [BattleBrothers.exe+2FD254]  лежат какие то числовые данные  и случайные адреса , а не код . они  каждый раз меняються  целиком . или  я не правильно понимаю как  оно работает ?

 

 

50 минут назад, Garik66 сказал:

попробуй так

 

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

 

 

22 минуты назад, Antonshka сказал:

Что если так?


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

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

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

а на  адрес который  в этой инструкции BattleBrothers.exe+2FD254  нет

В чем проблема посчитать?

В той статье на которую я давал ссылку, есть пример как рассчитать.
Если получишь 4 байта (54D26F00) относительный виртуальный адрес, достаточно будет эти 4 байта сложить с началом модуля, чтобы получить адрес указывающий на структуру. И сигнатура будет работать до тех пор, пока не изменится код функции в которой находятся эти инструкции и до тех пор пока этого не случиться у тебя будет работать скрипт.

 

UPD в x86 даже ничего рассчитывать не надо, байты являются абсолютным адресом, достаточно просто получить их.

 

BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254]
BattleBrothers.exe = 0x400000

0x4E4EF2 - A1 54D26F00 - mov eax,[0x6FD254]


aob(instr, 'A1 ? ? ? ? ...')

#####################################################
#mov eax, instr     //instr = 0x4E4EF2 (A1 54D26F00)#
#inc eax            // eax  = 0x4E4EF3 (54D26F00)   #
#mov eax, [eax]     // eax  = 0x6FD254              #
#mov ecx, [eax+100] //                              #
#cmp ecx, [esi+0C]  //                              #
#pop ecx            //                              #
#####################################################

 

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

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

Спойлер

[ENABLE]

aobscanmodule(_base,BattleBrothers.exe+E4EF2,a1xxxxxxxxf3xxxxxxxxxxxxxxf3xxxxxxxxxxxxxxf3xxxxxxxxf3)
alloc(newmem,4)

label(_filter)
registersymbol(_filter)
registersymbol(_base)

newmem:

_filter:
 readmem(_base+1,4) // тут

[DISABLE]

unregistersymbol(_filter)
unregistersymbol(_base)
dealloc(newmem)

 

 

всем спасибо  за помошь . век живи  век учись )))

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

10 минут назад, Alex2411 сказал:

надо было просто взять  из байт  сразу адрес

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

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

42 минуты назад, partoftheworlD сказал:

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

 

во  как . а если  игру 32 бит запускать на 64 бит  системе что тогда будет с  такими адресами из  байт в скрипте ?  будут  скрипт правильно  работать на 64  если работает на 32 ?

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

15 минут назад, Alex2411 сказал:

будут  скрипт правильно  работать на 64  если работает на 32 ?

Угу, все правильно будет вне зависимости от разрядности системы.

Специально перепроверил.

x86 - абсолютный адрес(никакие вычисления не нужны)

x64 - относительный адрес (нужны вычисления)

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

3 часа назад, Alex2411 сказал:

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

Спойлер

Не за что. :) 131728990_129893216_1f809c9bf138.png

 

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

  • 1 год спустя...
×
×
  • Создать...

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

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