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

[Deadpool] [STEAM] Запись значения очков


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

Салют всем.

После некоторого перерыва на квесты решил кое-что поломать.

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

 

Вот код. Код вылетает, причём ещё до попытки записи значения, которое почему-то равно нулю, хотя в коде не так.

 

Спойлер

  { Game   : DP.exe
  Version: 1.0
  Date   : 2019-11-16
  Author : SergBrNord
}

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

aobscanmodule(DPOINTS,DP.exe,DD 5F 04 5F 5E 8B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [edi+90], #6              //Main filter
  jne code
  cmp [flag], 0                 //Check flag
  jne code
  fstp st(0)
  mov [edi+04], value           //Write DP value
  fld qword ptr [edi+04]
  mov byte ptr [flag], 1        //Set flag

code:
  fstp qword ptr [edi+04]
  pop edi
  pop esi
  jmp return

flag:
db 00
value:
dq (double)3000000

DPOINTS:
  jmp newmem
return:
registersymbol(DPOINTS)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
DPOINTS:
  db DD 5F 04 5F 5E

unregistersymbol(DPOINTS)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "DP.exe"+A1AE17

"DP.exe"+A1AE04: 89 77 04              -  mov [edi+04],esi
"DP.exe"+A1AE07: FF 46 08              -  inc [esi+08]
"DP.exe"+A1AE0A: 5B                    -  pop ebx
"DP.exe"+A1AE0B: 5F                    -  pop edi
"DP.exe"+A1AE0C: 5E                    -  pop esi
"DP.exe"+A1AE0D: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE0F: 5D                    -  pop ebp
"DP.exe"+A1AE10: C2 04 00              -  ret 0004
"DP.exe"+A1AE13: DD 46 04              -  fld qword ptr [esi+04]
"DP.exe"+A1AE16: 5B                    -  pop ebx
// ---------- INJECTING HERE ----------
"DP.exe"+A1AE17: DD 5F 04              -  fstp qword ptr [edi+04]
"DP.exe"+A1AE1A: 5F                    -  pop edi
"DP.exe"+A1AE1B: 5E                    -  pop esi
// ---------- DONE INJECTING  ----------
"DP.exe"+A1AE1C: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE1E: 5D                    -  pop ebp
"DP.exe"+A1AE1F: C2 04 00              -  ret 0004
"DP.exe"+A1AE22: 8B 56 04              -  mov edx,[esi+04]
"DP.exe"+A1AE25: 5B                    -  pop ebx
"DP.exe"+A1AE26: 89 57 04              -  mov [edi+04],edx
"DP.exe"+A1AE29: 5F                    -  pop edi
"DP.exe"+A1AE2A: 5E                    -  pop esi
"DP.exe"+A1AE2B: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE2D: 5D                    -  pop ebp
}

 

 

А вот как это дело выглядит в отладчике.

Спойлер

RuRA7xW.jpg

 

P.S.

Не понимаю, почему в моменте проверки флага отладчик секции комментариев пишет, что флаг уже вроде как равен 1, хотя это не так.

 

P.P.S.

Пошёл спать, благодарен за помощь ?

 

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

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

Не понимаю

Попробуй так:

Спойлер

{ Game   : DP.exe
  Version: 1.0
  Date   : 2019-11-16
  Author : SergBrNord
  Correction: Garik66
}

[ENABLE]
aobscanmodule(DPOINTS,DP.exe,DD 5F 04 5F 5E 8B) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(flag)
label(value)
registersymbol(DPOINTS)

newmem:
  cmp [edi+90], #6              //Main filter
  jne code
  cmp [flag],0                  //Check flag
  jne code
  fstp qword ptr [esi+04]
  fld qword ptr [value]        //Write DP value
  mov [flag],1                 //Set flag

code:
  fstp qword ptr [edi+04]
  pop edi
  pop esi
  jmp return

flag:
  dd 0
value:
  dq (double)3000000

DPOINTS:
  jmp newmem
return:

[DISABLE]
DPOINTS:
  db DD 5F 04 5F 5E

unregistersymbol(DPOINTS)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "DP.exe"+A1AE17

"DP.exe"+A1AE04: 89 77 04              -  mov [edi+04],esi
"DP.exe"+A1AE07: FF 46 08              -  inc [esi+08]
"DP.exe"+A1AE0A: 5B                    -  pop ebx
"DP.exe"+A1AE0B: 5F                    -  pop edi
"DP.exe"+A1AE0C: 5E                    -  pop esi
"DP.exe"+A1AE0D: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE0F: 5D                    -  pop ebp
"DP.exe"+A1AE10: C2 04 00              -  ret 0004
"DP.exe"+A1AE13: DD 46 04              -  fld qword ptr [esi+04]
"DP.exe"+A1AE16: 5B                    -  pop ebx
// ---------- INJECTING HERE ----------
"DP.exe"+A1AE17: DD 5F 04              -  fstp qword ptr [edi+04]
"DP.exe"+A1AE1A: 5F                    -  pop edi
"DP.exe"+A1AE1B: 5E                    -  pop esi
// ---------- DONE INJECTING  ----------
"DP.exe"+A1AE1C: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE1E: 5D                    -  pop ebp
"DP.exe"+A1AE1F: C2 04 00              -  ret 0004
"DP.exe"+A1AE22: 8B 56 04              -  mov edx,[esi+04]
"DP.exe"+A1AE25: 5B                    -  pop ebx
"DP.exe"+A1AE26: 89 57 04              -  mov [edi+04],edx
"DP.exe"+A1AE29: 5F                    -  pop edi
"DP.exe"+A1AE2A: 5E                    -  pop esi
"DP.exe"+A1AE2B: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE2D: 5D                    -  pop ebp
}

 

 

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

15 часов назад, SergBrNord сказал:

Не понимаю, почему в моменте проверки флага отладчик секции комментариев пишет, что флаг уже вроде как равен 1

Потому что он у тебя не 1 байт, а захватывает кусочек твоего double, надо писать cmp byte ptr [],* если хочешь проверятть байт

Попробуй вот такой скрипт:

Спойлер

 { Game   : DP.exe
  Version: 1.0
  Date   : 2019-11-16
  Author : SergBrNord
}

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

aobscanmodule(DPOINTS,DP.exe,DD 5F 04 5F 5E 8B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [edi+90], #6              //Main filter
  jne code
  cmp byte ptr [flag], 0                 //Check flag
  jne code
  mov byte ptr [flag], 1        //Set flag
  fstp st(0)
  fld dword ptr [value]

code:
  fstp qword ptr [edi+04]
  pop edi
  pop esi
  jmp return

flag:
db 00
value:
dd (float)3000000

DPOINTS:
  jmp newmem
return:
registersymbol(DPOINTS)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
DPOINTS:
  db DD 5F 04 5F 5E

unregistersymbol(DPOINTS)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "DP.exe"+A1AE17

"DP.exe"+A1AE04: 89 77 04              -  mov [edi+04],esi
"DP.exe"+A1AE07: FF 46 08              -  inc [esi+08]
"DP.exe"+A1AE0A: 5B                    -  pop ebx
"DP.exe"+A1AE0B: 5F                    -  pop edi
"DP.exe"+A1AE0C: 5E                    -  pop esi
"DP.exe"+A1AE0D: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE0F: 5D                    -  pop ebp
"DP.exe"+A1AE10: C2 04 00              -  ret 0004
"DP.exe"+A1AE13: DD 46 04              -  fld qword ptr [esi+04]
"DP.exe"+A1AE16: 5B                    -  pop ebx
// ---------- INJECTING HERE ----------
"DP.exe"+A1AE17: DD 5F 04              -  fstp qword ptr [edi+04]
"DP.exe"+A1AE1A: 5F                    -  pop edi
"DP.exe"+A1AE1B: 5E                    -  pop esi
// ---------- DONE INJECTING  ----------
"DP.exe"+A1AE1C: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE1E: 5D                    -  pop ebp
"DP.exe"+A1AE1F: C2 04 00              -  ret 0004
"DP.exe"+A1AE22: 8B 56 04              -  mov edx,[esi+04]
"DP.exe"+A1AE25: 5B                    -  pop ebx
"DP.exe"+A1AE26: 89 57 04              -  mov [edi+04],edx
"DP.exe"+A1AE29: 5F                    -  pop edi
"DP.exe"+A1AE2A: 5E                    -  pop esi
"DP.exe"+A1AE2B: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE2D: 5D                    -  pop ebp
}

 

 

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

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

Потому что он у тебя не 1 байт, а захватывает кусочек твоего double

Не поэтому image.png.7a9ef3fdc84686c1c62af4074b871dae.png
первый байт это flag, следующие 8 это value (double)3000000.
Как видищь - там ноль.
А потому, что скорее всего через фильтр проскакивает ещё что-то и флаг успевает замениться на 1. а количество очков уже не меняется.
Ну ещё вариант, что так как скрипт у ТС не верен (но например верен фильтр), то происходит вылет, а флаг успевает смениться.
Да и @imaginary ты же своим скриптом не записываешь нужного значения.

 

 

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

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

Код вылетает

Конечно вылетает, посмотри на эту строчку:

mov [edi+04],value          //Write DP value

value - это адрес

[value] - вот это DP value

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

 

 

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

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

не записываешь нужного значения

А, ты полностью прав, я перепутала edi и метку

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

10 часов назад, SergBrNord сказал:

Возникла проблема с добавлением определённого количества очков

А очки разве там не по такой сигнатуре.... ?

CC CC CC CC CC F3 0F * * * * * * * * F3 0F 11 81 08 05 00 00  + 15 байт.. не hex
movss [ecx+0508h],xmm0

Это я к тому, что там же не какие фильтра то и не нужны...  Я просто эту игру когда то смотрел.. таблицы уж нет.. А исход остался.

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

4 часа назад, LIRW сказал:

А очки разве там не по такой сигнатуре.... ?


CC CC CC CC CC F3 0F * * * * * * * * F3 0F 11 81 08 05 00 00  + 15 байт.. не hex

movss [ecx+0508h],xmm0

Это я к тому, что там же не какие фильтра то и не нужны...  Я просто эту игру когда то смотрел.. таблицы уж нет.. А исход остался.

 

Если не секрет, то как ты вышел на эту сигнатуру? Я искал очки банальным отсеиванием по значению, подбирая в комнате значки на 250 очков.

 

13 часов назад, Garik66 сказал:

Конечно вылетает, посмотри на эту строчку:


mov [edi+04],value          //Write DP value

value - это адрес

[value] - вот это DP value

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

 

 

 

Оно-то так, но при попытке сохранить скрипт начинается ругань именно на таким образом написанную строку. Что странно, как по мне.

 

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

14 часов назад, Garik66 сказал:

Попробуй так:

  Показать контент


{ Game   : DP.exe
  Version: 1.0
  Date   : 2019-11-16
  Author : SergBrNord
  Correction: Garik66
}

[ENABLE]
aobscanmodule(DPOINTS,DP.exe,DD 5F 04 5F 5E 8B) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(flag)
label(value)
registersymbol(DPOINTS)

newmem:
  cmp [edi+90], #6              //Main filter
  jne code
  cmp [flag],0                  //Check flag
  jne code
  fstp qword ptr [esi+04]
  fld qword ptr [value]        //Write DP value
  mov [flag],1                 //Set flag

code:
  fstp qword ptr [edi+04]
  pop edi
  pop esi
  jmp return

flag:
  dd 0
value:
  dq (double)3000000

DPOINTS:
  jmp newmem
return:

[DISABLE]
DPOINTS:
  db DD 5F 04 5F 5E

unregistersymbol(DPOINTS)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "DP.exe"+A1AE17

"DP.exe"+A1AE04: 89 77 04              -  mov [edi+04],esi
"DP.exe"+A1AE07: FF 46 08              -  inc [esi+08]
"DP.exe"+A1AE0A: 5B                    -  pop ebx
"DP.exe"+A1AE0B: 5F                    -  pop edi
"DP.exe"+A1AE0C: 5E                    -  pop esi
"DP.exe"+A1AE0D: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE0F: 5D                    -  pop ebp
"DP.exe"+A1AE10: C2 04 00              -  ret 0004
"DP.exe"+A1AE13: DD 46 04              -  fld qword ptr [esi+04]
"DP.exe"+A1AE16: 5B                    -  pop ebx
// ---------- INJECTING HERE ----------
"DP.exe"+A1AE17: DD 5F 04              -  fstp qword ptr [edi+04]
"DP.exe"+A1AE1A: 5F                    -  pop edi
"DP.exe"+A1AE1B: 5E                    -  pop esi
// ---------- DONE INJECTING  ----------
"DP.exe"+A1AE1C: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE1E: 5D                    -  pop ebp
"DP.exe"+A1AE1F: C2 04 00              -  ret 0004
"DP.exe"+A1AE22: 8B 56 04              -  mov edx,[esi+04]
"DP.exe"+A1AE25: 5B                    -  pop ebx
"DP.exe"+A1AE26: 89 57 04              -  mov [edi+04],edx
"DP.exe"+A1AE29: 5F                    -  pop edi
"DP.exe"+A1AE2A: 5E                    -  pop esi
"DP.exe"+A1AE2B: 8B E5                 -  mov esp,ebp
"DP.exe"+A1AE2D: 5D                    -  pop ebp
}

 

 

 

Попробовал. Вылетает всё также непонятно где, до точки останова. Но это уже не особо важно, буду использовать вариант Лирва. Только сначала надо узнать секреты мастерства ?

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

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

DP.exe+427F2A

Хотя все ещё проще F3 0F 11 81 08 05 00 00 есть и сигна в скрипте.

 

19 минут назад, SergBrNord сказал:

Только сначала надо узнать секреты мастерства ?

Так что секреты мастерства Женьки просты.

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

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

Хотя все ещё проще F3 0F 11 81 08 05 00 00 есть и сигна в скрипте.

 

Так что секреты мастерства Женьки просты.

Насколько я понял, когда не нашлось целочисленное значение, он сразу начал поиск по всем значениям. У него нашлась строковая переменная, которая на самом деле является числом с точкой, но CE при поиске её так почему-то не определяет. Я же сразу перешёл к поиску чисел с точкой и пролетел.

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

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

Если не секрет, то как ты вышел на эту сигнатуру?

Я на неё выходил как и всё.. отладчиком.. Адрес над просто правильный найти и всё... Так что @Garik66 у него просто даже адрес не правильный.. От того и делает в обще на другой инструкции.. которая с очками не чего общего не имеет. А тут всего то 2 отсева надо. 

Кстати можешь и вот так накатывать очки... За раз количество сам указывай.. 

Спойлер

[ENABLE]
aobscanmodule(_unlimited_score_,DP.exe,D8 44 24 0C D9 EE)
alloc(_score_mem,$1000)
label(_unlimited_score_back_)
label(_super_score_)
  _score_mem:
   fadd dword ptr [_super_score_]
   fldz
   jmp _unlimited_score_back_
   _super_score_:
   dd (float)10000
  _unlimited_score_:
   jmp _score_mem
   db 90
  _unlimited_score_back_:
registersymbol(_unlimited_score_)
registersymbol(_super_score_)
[DISABLE]
_unlimited_score_:
  db D8 44 24 0C D9 EE
unregistersymbol(_unlimited_score_)
unregistersymbol(_super_score_)
dealloc(_score_mem)

 

 

000000000000000.jpg

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

В 17.11.2019 в 17:44, LIRW сказал:

Я на неё выходил как и всё.. отладчиком.. Адрес над просто правильный найти и всё... Так что @Garik66 у него просто даже адрес не правильный.. От того и делает в обще на другой инструкции.. которая с очками не чего общего не имеет. А тут всего то 2 отсева надо. 

 

 

У меня CE упорно определяет это значение до выноса в таблицу как строковый тип. Я искал как вещественный тип и в мои отсевы нужный адрес не попадал.

KENiKCm.jpg

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

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

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

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