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

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

Есть игра Loop Hero она сделана в game maker*е

Поэтому всё хранится как double.

Вопрос в том как работать с double через стек?

С float всё понятно fld fstp

Выкрутился так

Спойлер

[ENABLE]
aobscanmodule(_Hp,Loop Hero.exe,89 04 ? e8 ? ? ? ? 83 c4 ? 85 c0 7e ? c7 46 2c)
alloc(newmem,$1000)
label(doub)
label(return)
registersymbol(doub)
registersymbol(_Hp)

newmem:
  movsd xmm2,[doub]
  movsd [eax],xmm2
  xorpd xmm2,xmm2
  mov [esp],eax
  call "Loop Hero.exe"+16FC210
  jmp return

doub:
dq (double)1000

_Hp:
  jmp newmem
  nop 3
return:

[DISABLE]
_Hp:
db 89 04 24 E8 18 E0 AC 00
unregistersymbol(doub)
unregistersymbol(_Hp)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Loop Hero.exe+C2E1F0
Loop Hero.exe+C2E1AF: C7 46 38 00 00 00 00           - mov [esi+38],00000000
Loop Hero.exe+C2E1B6: C7 86 68 05 00 00 A6 00 00 00  - mov [esi+00000568],000000A6
Loop Hero.exe+C2E1C0: F3 0F 7E 05 28 9B BB 01        - movq xmm0,["Loop Hero.exe"+1B69B28]
Loop Hero.exe+C2E1C8: C7 46 2C 4A 00 00 00           - mov [esi+2C],0000004A
Loop Hero.exe+C2E1CF: 83 EC 14                       - sub esp,14
Loop Hero.exe+C2E1D2: 8B 86 EC 01 00 00              - mov eax,[esi+000001EC]
Loop Hero.exe+C2E1D8: 66 0F D6 44 24 08              - movq [esp+08],xmm0
Loop Hero.exe+C2E1DE: C7 44 24 10 01 00 00 00        - mov [esp+10],00000001
Loop Hero.exe+C2E1E6: 89 44 24 04                    - mov [esp+04],eax
Loop Hero.exe+C2E1EA: 8B 86 10 01 00 00              - mov eax,[esi+00000110]
// ---------- INJECTING HERE ----------
Loop Hero.exe+C2E1F0: 89 04 24                       - mov [esp],eax
// ---------- DONE INJECTING  ----------
Loop Hero.exe+C2E1F3: E8 18 E0 AC 00                 - call "Loop Hero.exe"+16FC210
Loop Hero.exe+C2E1F8: 83 C4 14                       - add esp,14
Loop Hero.exe+C2E1FB: 85 C0                          - test eax,eax
Loop Hero.exe+C2E1FD: 7E 30                          - jle "Loop Hero.exe"+C2E22F
Loop Hero.exe+C2E1FF: C7 46 2C 4A 00 00 00           - mov [esi+2C],0000004A
Loop Hero.exe+C2E206: FF 35 20 E7 C4 01              - push ["Loop Hero.exe"+1BFE720]
Loop Hero.exe+C2E20C: E8 EF E1 AB 00                 - call "Loop Hero.exe"+16EC400
Loop Hero.exe+C2E211: 83 C4 04                       - add esp,04
Loop Hero.exe+C2E214: 8B 8E 10 01 00 00              - mov ecx,[esi+00000110]
Loop Hero.exe+C2E21A: FF B6 EC 01 00 00              - push [esi+000001EC]
}

 

xmm2 изначально был равен нулю

как в [eax] правильно записать 1000 double????

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

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

Вопрос в том как работать с double через стек?

Через какой стек? Стек FPU? fld qword ptr, например. 

 

34 минуты назад, Partizan сказал:

как в [eax] правильно записать 1000 double????

сначала в фпу стек загоняешь дабл, а затем пишешь его fstp qword ptr [eax]

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

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

как в [eax] правильно записать 1000 double????

тебе же не в [eax]. нужно а в eax вроде

Спойлер

newmem:
 // movsd xmm2,[doub]                   - т.е. 
 // movsd [eax],xmm2                    - не   
 // xorpd xmm2,xmm2                     - так
  movsd eax,[doub] 
  mov [esp],eax

 

 

 

Зы: хотя не так

 

 

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

Спойлер

  mov eax,(float)1000 
  mov [esp],eax

 

 

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

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

Хорошая попытка затолкать 8 байт в 4-байтный регистр.

:))) я поправился
просто больше смотрел на [eax] 

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

Всем спасибо.

вот так сработало

  fld qword ptr [doub]
  fstp qword ptr [eax]

просто если не указать qword ptr СЕ думает что это float

в этом и был весь затык

 

а так это тепер рабочий скрипт для Loop hero версии 1.0

Спойлер

[ENABLE]
aobscanmodule(_Hp,Loop Hero.exe,89 04 ? e8 ? ? ? ? 83 c4 ? 85 c0 7e ? c7 46 2c)
alloc(newmem,$1000)
label(doub)
label(return)
registersymbol(doub)
registersymbol(_Hp)

newmem:
  fld qword ptr [doub]
  fstp qword ptr [eax]
  mov [esp],eax
  call "Loop Hero.exe"+16FC210
  jmp return

doub:
dq (double)1000

_Hp:
  jmp newmem
  nop 3
return:

[DISABLE]
_Hp:
db 89 04 24 E8 18 E0 AC 00
unregistersymbol(doub)
unregistersymbol(_Hp)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Loop Hero.exe+C2E1F0
Loop Hero.exe+C2E1AF: C7 46 38 00 00 00 00           - mov [esi+38],00000000
Loop Hero.exe+C2E1B6: C7 86 68 05 00 00 A6 00 00 00  - mov [esi+00000568],000000A6
Loop Hero.exe+C2E1C0: F3 0F 7E 05 28 9B BB 01        - movq xmm0,["Loop Hero.exe"+1B69B28]
Loop Hero.exe+C2E1C8: C7 46 2C 4A 00 00 00           - mov [esi+2C],0000004A
Loop Hero.exe+C2E1CF: 83 EC 14                       - sub esp,14
Loop Hero.exe+C2E1D2: 8B 86 EC 01 00 00              - mov eax,[esi+000001EC]
Loop Hero.exe+C2E1D8: 66 0F D6 44 24 08              - movq [esp+08],xmm0
Loop Hero.exe+C2E1DE: C7 44 24 10 01 00 00 00        - mov [esp+10],00000001
Loop Hero.exe+C2E1E6: 89 44 24 04                    - mov [esp+04],eax
Loop Hero.exe+C2E1EA: 8B 86 10 01 00 00              - mov eax,[esi+00000110]
// ---------- INJECTING HERE ----------
Loop Hero.exe+C2E1F0: 89 04 24                       - mov [esp],eax
// ---------- DONE INJECTING  ----------
Loop Hero.exe+C2E1F3: E8 18 E0 AC 00                 - call "Loop Hero.exe"+16FC210
Loop Hero.exe+C2E1F8: 83 C4 14                       - add esp,14
Loop Hero.exe+C2E1FB: 85 C0                          - test eax,eax
Loop Hero.exe+C2E1FD: 7E 30                          - jle "Loop Hero.exe"+C2E22F
Loop Hero.exe+C2E1FF: C7 46 2C 4A 00 00 00           - mov [esi+2C],0000004A
Loop Hero.exe+C2E206: FF 35 20 E7 C4 01              - push ["Loop Hero.exe"+1BFE720]
Loop Hero.exe+C2E20C: E8 EF E1 AB 00                 - call "Loop Hero.exe"+16EC400
Loop Hero.exe+C2E211: 83 C4 04                       - add esp,04
Loop Hero.exe+C2E214: 8B 8E 10 01 00 00              - mov ecx,[esi+00000110]
Loop Hero.exe+C2E21A: FF B6 EC 01 00 00              - push [esi+000001EC]
}

 

 

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

11 минут назад, Partizan сказал:

просто если не указать qword ptr СЕ думает что это float

В СЕ по умолчанию [  ] - это 4 байта
Если нужно другое то нужно указывать.

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

Почему писал в [eax] а не в [esp]

Я уже говорил игра на гейм мейкере. Поэтому в инструкции на теже хп куча адресов

1111.png

Поэтому поставил трейс с условием ESI==0x0CEF17F0

22222.png

333333.png

Если крутить вниз и следить за регистрами то наткнёмся на это

44444.png

В регистре еах будет адресс хп.

И инструкция работает только с одним адрессом

555555.png

 

 

 

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

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

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

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