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

[Drug Dealer Simulator] Постигаю азы, прошу помощи


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

Всем привет! Решил познакомиться с ассемблером путем взлома сингл игр.

Выбор пал на игру Drug Dealer Simulator (v1.1.0.25, в этой версии ввели какие-то сложности для геймхацкеров, но не знаю какие). Взлом игры, в целом, не представляет из себя что-то сложное для людей знающих, но и не что-то банально легкое.

В этой теме планирую выкладывать вопросы по мере их поступления.

  1. [Вопрос открыт]Первый вопрос, с которым я столкнулся: Пользовался методами push/pop следующим образом:
push dword ptr [adress]
pop dwprd ptr [adress]

      Делал с значениями 4byte, но когда попробовал этот метод со значениями типа float, то последовал краш, гуглил что-то, пытался что-то, следовал краш.

      Вопрос следующий: Это просто совпадение, что с этими стеками крашило, или для типа float нужен другой метод? Если нужен другой, то какой и как правильно применять?

      

       Ситуация:

Спойлер

Хочу сделать некончающуюся выносливость. Именно НОПнуть, а не просто заморозить. Нашел адрес и поинтеры.

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

опкод выглядит следующим образом:

89 08  - mov [rax],ecx

в структуре RAX текущее значение выносливости - оффсет +0

в той же структуре максимальное значение выносливости - оффсет +0А68

 

пишу следующий скрипт:

[ENABLE]

aobscanmodule(stamina,VCRUNTIME140.dll,89 08 C3 0F 1F 00) // should be unique
alloc(newmem,$1000,stamina)

label(code)
label(return)

newmem:
  push dword ptr [rax+0A68]
  pop dword ptr [rax+0]
code:
  mov [rax],ecx
  ret 
  nop dword ptr [rax]
  jmp return

stamina:
  jmp newmem
return:
registersymbol(stamina)
[DISABLE]
stamina:
  db 89 08 C3 0F 1F 00

unregistersymbol(stamina)
dealloc(newmem)

Краш. Тыкните пальцем ламеру, что не так)))

 

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

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

Даже если бы не было краша, дальше идёт

code:
  mov [rax],ecx

поэтому твои действия учитываться не будут

Хорошо, а что может провоцировать краш? И еще, как можно это "обыграть" ? Я могу удалить эту строку просто, может ?

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

  • mahonya изменил название на [Drug Dealer Simulator] Постигаю азы, прошу помощи
3 минуты назад, mahonya сказал:

Хорошо, а что может провоцировать краш? И еще, как можно это "обыграть" ? Я могу удалить эту строку просто, может ?

1. Выкладывайте скрипты, не удаляя логи, которые делает СЕ. (так более понятен игровой код.
2. и снова стандартная ошибка всех новичков - посмотри мое одноименно видео,  imaginary тебе об этом написала.

Выложи скрипт с логами (используя теги спойлера и кода). посмотрим

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

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

1. Выкладывайте скрипты, не удаляя логи, которые делает СЕ. (так более понятен игровой код.
2. и снова стандартная ошибка всех новичков - посмотри мое одноименно видео,  imaginary тебе об этом написала.

Выложи скрипт с логами (используя теги спойлера и кода). посмотрим

Где я могу найти логи CE ?

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

2 минуты назад, mahonya сказал:

Где я могу найти логи CE ?

ты их удалил в своем скрипте.
автоматически СЕ делает их внизу скрипта

 

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

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

ты их удалил в своем скрипте.
автоматически СЕ делает их внизу скрипта

 

Спойлер
{ Game   : DrugDealerSimulator-Win64-Shipping.exe
  Version: 
  Date   : 2022-02-10
  Author : ??????

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscanmodule(stam,VCRUNTIME140.dll,89 08 C3 0F 1F 00) // should be unique
alloc(newmem,$1000,stam)

label(code)
label(return)

newmem:
  mov [rax],ecx
  push dword ptr [rax+0A68]
  pop dword ptr [rax+0]
code:
  ret 
  nop dword ptr [rax]
  jmp return

stam:
  jmp newmem
return:
registersymbol(stam)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
stam:
  db 89 08 C3 0F 1F 00

unregistersymbol(stam)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: VCRUNTIME140.memcpy+CA

VCRUNTIME140.memcpy+AD: C3              - ret 
VCRUNTIME140.memcpy+AE: 66 90           - nop 2
VCRUNTIME140.memcpy+B0: 4C 8B 02        - mov r8,[rdx]
VCRUNTIME140.memcpy+B3: 0F B7 4A 08     - movzx ecx,word ptr [rdx+08]
VCRUNTIME140.memcpy+B7: 44 0F B6 4A 0A  - movzx r9d,byte ptr [rdx+0A]
VCRUNTIME140.memcpy+BC: 4C 89 00        - mov [rax],r8
VCRUNTIME140.memcpy+BF: 66 89 48 08     - mov [rax+08],cx
VCRUNTIME140.memcpy+C3: 44 88 48 0A     - mov [rax+0A],r9l
VCRUNTIME140.memcpy+C7: C3              - ret 
VCRUNTIME140.memcpy+C8: 8B 0A           - mov ecx,[rdx]
// ---------- INJECTING HERE ----------
VCRUNTIME140.memcpy+CA: 89 08           - mov [rax],ecx
// ---------- DONE INJECTING  ----------
VCRUNTIME140.memcpy+CC: C3              - ret 
VCRUNTIME140.memcpy+CD: 0F 1F 00        - nop dword ptr [rax]
VCRUNTIME140.memcpy+D0: 8B 0A           - mov ecx,[rdx]
VCRUNTIME140.memcpy+D2: 44 0F B6 42 04  - movzx r8d,byte ptr [rdx+04]
VCRUNTIME140.memcpy+D7: 89 08           - mov [rax],ecx
VCRUNTIME140.memcpy+D9: 44 88 40 04     - mov [rax+04],r8l
VCRUNTIME140.memcpy+DD: C3              - ret 
VCRUNTIME140.memcpy+DE: 66 90           - nop 2
VCRUNTIME140.memcpy+E0: 8B 0A           - mov ecx,[rdx]
VCRUNTIME140.memcpy+E2: 44 0F B7 42 04  - movzx r8d,word ptr [rdx+04]
}

 

 

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

14 минут назад, mahonya сказал:
  Скрыть контент
{ Game   : DrugDealerSimulator-Win64-Shipping.exe
  Version: 
  Date   : 2022-02-10
  Author : ??????

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscanmodule(stam,VCRUNTIME140.dll,89 08 C3 0F 1F 00) // should be unique
alloc(newmem,$1000,stam)

label(code)
label(return)

newmem:
  mov [rax],ecx
  push dword ptr [rax+0A68]
  pop dword ptr [rax+0]
code:
  ret 
  nop dword ptr [rax]
  jmp return

stam:
  jmp newmem
return:
registersymbol(stam)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
stam:
  db 89 08 C3 0F 1F 00

unregistersymbol(stam)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: VCRUNTIME140.memcpy+CA

VCRUNTIME140.memcpy+AD: C3              - ret 
VCRUNTIME140.memcpy+AE: 66 90           - nop 2
VCRUNTIME140.memcpy+B0: 4C 8B 02        - mov r8,[rdx]
VCRUNTIME140.memcpy+B3: 0F B7 4A 08     - movzx ecx,word ptr [rdx+08]
VCRUNTIME140.memcpy+B7: 44 0F B6 4A 0A  - movzx r9d,byte ptr [rdx+0A]
VCRUNTIME140.memcpy+BC: 4C 89 00        - mov [rax],r8
VCRUNTIME140.memcpy+BF: 66 89 48 08     - mov [rax+08],cx
VCRUNTIME140.memcpy+C3: 44 88 48 0A     - mov [rax+0A],r9l
VCRUNTIME140.memcpy+C7: C3              - ret 
VCRUNTIME140.memcpy+C8: 8B 0A           - mov ecx,[rdx]
// ---------- INJECTING HERE ----------
VCRUNTIME140.memcpy+CA: 89 08           - mov [rax],ecx
// ---------- DONE INJECTING  ----------
VCRUNTIME140.memcpy+CC: C3              - ret 
VCRUNTIME140.memcpy+CD: 0F 1F 00        - nop dword ptr [rax]
VCRUNTIME140.memcpy+D0: 8B 0A           - mov ecx,[rdx]
VCRUNTIME140.memcpy+D2: 44 0F B6 42 04  - movzx r8d,byte ptr [rdx+04]
VCRUNTIME140.memcpy+D7: 89 08           - mov [rax],ecx
VCRUNTIME140.memcpy+D9: 44 88 40 04     - mov [rax+04],r8l
VCRUNTIME140.memcpy+DD: C3              - ret 
VCRUNTIME140.memcpy+DE: 66 90           - nop 2
VCRUNTIME140.memcpy+E0: 8B 0A           - mov ecx,[rdx]
VCRUNTIME140.memcpy+E2: 44 0F B7 42 04  - movzx r8d,word ptr [rdx+04]
}

 

 

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

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

4 минуты назад, mahonya сказал:

Верно заметил :D

попробуй так, вдруг прокатит :)))  ( но посмотри видео)

 

Спойлер
[ENABLE]
aobscanmodule(stam,VCRUNTIME140.dll,8B 0A 89 08 C3 0F 1F 00)
alloc(newmem,$1000,stam)
label(code)
label(return)
registersymbol(stam)

newmem:
  mov ecx,[rax+0A68]

code:
  mov [rax],ecx
  ret
  jmp return

stam:
  jmp newmem
return:

[DISABLE]
stam:
  db 8B 0A 89 08 C3 0F 1F 00

unregistersymbol(stam)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: VCRUNTIME140.memcpy+CA

VCRUNTIME140.memcpy+AD: C3              - ret
VCRUNTIME140.memcpy+AE: 66 90           - nop 2
VCRUNTIME140.memcpy+B0: 4C 8B 02        - mov r8,[rdx]
VCRUNTIME140.memcpy+B3: 0F B7 4A 08     - movzx ecx,word ptr [rdx+08]
VCRUNTIME140.memcpy+B7: 44 0F B6 4A 0A  - movzx r9d,byte ptr [rdx+0A]
VCRUNTIME140.memcpy+BC: 4C 89 00        - mov [rax],r8
VCRUNTIME140.memcpy+BF: 66 89 48 08     - mov [rax+08],cx
VCRUNTIME140.memcpy+C3: 44 88 48 0A     - mov [rax+0A],r9l
VCRUNTIME140.memcpy+C7: C3              - ret
VCRUNTIME140.memcpy+C8: 8B 0A           - mov ecx,[rdx]
// ---------- INJECTING HERE ----------
VCRUNTIME140.memcpy+CA: 89 08           - mov [rax],ecx
// ---------- DONE INJECTING  ----------
VCRUNTIME140.memcpy+CC: C3              - ret
VCRUNTIME140.memcpy+CD: 0F 1F 00        - nop dword ptr [rax]
VCRUNTIME140.memcpy+D0: 8B 0A           - mov ecx,[rdx]
VCRUNTIME140.memcpy+D2: 44 0F B6 42 04  - movzx r8d,byte ptr [rdx+04]
VCRUNTIME140.memcpy+D7: 89 08           - mov [rax],ecx
VCRUNTIME140.memcpy+D9: 44 88 40 04     - mov [rax+04],r8l
VCRUNTIME140.memcpy+DD: C3              - ret
VCRUNTIME140.memcpy+DE: 66 90           - nop 2
VCRUNTIME140.memcpy+E0: 8B 0A           - mov ecx,[rdx]
VCRUNTIME140.memcpy+E2: 44 0F B7 42 04  - movzx r8d,word ptr [rdx+04]
}

 

 

7 минут назад, mahonya сказал:

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

не нормально - нужно выходить на игровую инструкцию

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

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

видео все-таки ты не посмотрел

Блин, у меня уже глаза плывут от белого фона сайта, после резкого перехода с IDE с темной темы, я неправильно прочитал тебя) Я читаю как "видео посмотрел" ?

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

 

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

нужно выходить на игровую инструкцию

Как это сделать ?

 

З.Ы. Видео посмотрел) И вообще, приметил кучу видео, которые буду позже смотреть)

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

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

скрипт попробовал? не прокатило?

Краш(

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

 

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

нужно выходить на игровую инструкцию

Вообще странно, все, что пытаюсь брейкпоинтом поймать, все выводит к VCRUNTIME140.dll . Это нужно через трасировку искать игровую инструкцию ?

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

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

нужно выходить на игровую инструкцию

Так, я немного в тупике. Есть подсказки что можно попробовать ?

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

25 минут назад, mahonya сказал:

Так, я немного в тупике. Есть подсказки что можно попробовать ?

быстро не ответишь

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

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

1. Игра на Unreal Engine 4. Игры на этом движке с особенностями.

2. Эта инструкция работает с множеством адресов

3.Начало структуры не в RAX а в R12

Спойлер
VCRUNTIME140.memcpy+11C:
7FFD14621409 - C3 - ret 
7FFD1462140A - 8B 0A  - mov ecx,[rdx]
7FFD1462140C - 89 08  - mov [rax],ecx <<
7FFD1462140E - C3 - ret 
7FFD1462140F - 90 - nop 

RAX=000001F332DDC2C4
RBX=0000000000000000
RCX=000000004333EC58
RDX=00000075CDACEA58
RSI=000001F32A437840
RDI=000001F3196D7080
RSP=00000075CDACE898
RBP=00000075CDACE8C0
RIP=00007FFD1462140E
R8=0000000000000004
R9=00007FFD1462140A
R10=00007FFD14620000
R11=000001F332DDC2C4
R12=000001F332DDBA40
R13=00007FF798E46430
R14=00000075CDACEAB0
R15=0000000000000000

 

 

1.Поставил бряк на начало структуры(на правильное начало)

2.Сделал правильный скрипт.

Спойлер
[ENABLE]
aobscanmodule(Stamina,DrugDealerSimulator-Win64-Shipping.exe,4C 8B ? 4C 8D ? ? ? 48 8B ? 48 8B ? 41 FF ? ? ? ? ? 48 8B ? ? ? 0F 28)
alloc(newmem,$1000,Stamina)
label(return)
registersymbol(Stamina)

newmem:
  fld [rbx+880]
 fstp [rbx+884]
  mov r9,[rbx]
  lea r8,[rsp+40]
  jmp return

Stamina:
  jmp newmem
  nop 3
return:

[DISABLE]
Stamina:
db 4C 8B 0B 4C 8D 44 24 40
unregistersymbol(Stamina)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: DrugDealerSimulator-Win64-Shipping.exe+1734E4F
DrugDealerSimulator-Win64-Shipping.exe+1734E28: E8 03 E9 FF FE        - call DrugDealerSimulator-Win64-Shipping.exe+733730
DrugDealerSimulator-Win64-Shipping.exe+1734E2D: 48 85 C0              - test rax,rax
DrugDealerSimulator-Win64-Shipping.exe+1734E30: 74 32                 - je DrugDealerSimulator-Win64-Shipping.exe+1734E64
DrugDealerSimulator-Win64-Shipping.exe+1734E32: 48 8B CF              - mov rcx,rdi
DrugDealerSimulator-Win64-Shipping.exe+1734E35: F3 0F 11 74 24 40     - movss [rsp+40],xmm6
DrugDealerSimulator-Win64-Shipping.exe+1734E3B: E8 80 85 01 FF        - call DrugDealerSimulator-Win64-Shipping.exe+74D3C0
DrugDealerSimulator-Win64-Shipping.exe+1734E40: 48 8B 57 08           - mov rdx,[rdi+08]
DrugDealerSimulator-Win64-Shipping.exe+1734E44: 48 8B C8              - mov rcx,rax
DrugDealerSimulator-Win64-Shipping.exe+1734E47: 48 8B D8              - mov rbx,rax
DrugDealerSimulator-Win64-Shipping.exe+1734E4A: E8 01 E9 FF FE        - call DrugDealerSimulator-Win64-Shipping.exe+733750
// ---------- INJECTING HERE ----------
DrugDealerSimulator-Win64-Shipping.exe+1734E4F: 4C 8B 0B              - mov r9,[rbx]
// ---------- DONE INJECTING  ----------
DrugDealerSimulator-Win64-Shipping.exe+1734E52: 4C 8D 44 24 40        - lea r8,[rsp+40]
DrugDealerSimulator-Win64-Shipping.exe+1734E57: 48 8B D0              - mov rdx,rax
DrugDealerSimulator-Win64-Shipping.exe+1734E5A: 48 8B CB              - mov rcx,rbx
DrugDealerSimulator-Win64-Shipping.exe+1734E5D: 41 FF 91 00 02 00 00  - call qword ptr [r9+00000200]
DrugDealerSimulator-Win64-Shipping.exe+1734E64: 48 8B 7C 24 48        - mov rdi,[rsp+48]
DrugDealerSimulator-Win64-Shipping.exe+1734E69: 0F 28 74 24 20        - movaps xmm6,[rsp+20]
DrugDealerSimulator-Win64-Shipping.exe+1734E6E: 48 83 C4 30           - add rsp,30
DrugDealerSimulator-Win64-Shipping.exe+1734E72: 5B                    - pop rbx
DrugDealerSimulator-Win64-Shipping.exe+1734E73: C3                    - ret 
DrugDealerSimulator-Win64-Shipping.exe+1734E74: CC                    - int 3 
}

 

 

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

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

2.Сделал правильный скрипт.

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

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

А вообще касательно UE4.

Ищется указатель на UWorld и уже от него строится цепочка указателей.

Картинка

Не ту игру вы выбрали для пробы

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

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

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

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