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

Задать условие FPU


CTIGRA

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

Подскажите пожалуйста как задать вот такое условие при работе с FPU (double)

Если X<10000 AND Y<10000

где

X

fld qword ptr [eax+08]   // значение
fstp qword ptr [edi+08] // запись в структуру

Y

fld qword ptr [eax+10]
fstp qword ptr [edi+10]

пробовал наподобии


push eax
fld [ValueX]
fcom [ValueY]
fstsw ax
sahf
jl Rezult1 -если X<Y
jnle Rezult2 -если X>Y
je Rezult3 -если X=Y
pop eax

но тут получается только ИЛИ

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

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

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

Например, это можно сделать используя Visual Studio C++. После того как код написан, то в среде разработки можно поставить брейкпоинт на выполнение инструкции подсмотреть дизассемблерный код.

Пример:

post-3-0-80467100-1397047905_thumb.png

На скриншоте код не соответствует условию X<10000 AND Y<10000. Поэтому надо переписать, подсмотреть и переделать под инъекцию кода в процесс игры.

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

спасибо, попробую. Надо только студио скачать будет...

Ещё 2 вопроса если можно )

1) По условию будет прыжок, а у нас eax в стеке. Как же достать его из стека? ставить ещё метку или можно сделать это после returnhere?

2) автоассемблер переходит на метку cheat, потом прыгает на cheatByteCode

в результате имеем такой код

cheat:
jmp cheatByteCode
nop

получается что данный код это 6 байт?

(потому что это 6ть байт

fld qword ptr [eax+08] // значение
fstp qword ptr [edi+08] // запись в структуру

)

таким образом, мне нужно ещё добавить nop'ов после jmp cheatByteCodeпо формуле (кол-во байт на выполнение условия минус 6)?

или можно не добавлять nop? просто перезаписать значения в адресах [edi+08] и [edi+10] согласно условию?

в результате я хочу менять значения в X и Y но при условии что описано выше.

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

Выложите пример скрипта с готовыми инжектами... и состояние стека fpu после загрузки каждого из значений.

Может быть загрузить последовательно все значения, и сортировать FCOMIP ST,ST(i) FCOMI ST,ST(i).... в зависимости от количества и расположения инжектов по коду...

Хотя можно до fld [] поработать с eax+08/10


aobscan(cheat, XX XX XX XX XX XX XX XX XX XX XX)
alloc(cheatByteCode, 2048)
registersymbol(cheat)
label(metka)

cheatByteCode:
pushf
cmp [eax+08],#10000
jge metka
cmp [eax+10],#10000
jge metka
mov [eax+08], {0000} // тут присваеваем требуемое значение x
mov [eax+10], {0000} // тут присваеваем требуемое значение y
metka:
popf
fld qword ptr [eax+08]
fstp qword ptr [edi+08]
//fld qword ptr [eax+10]
//fstp qword ptr [edi+10]
ret

cheat:
call cheatByteCode
nop

[DISABLE]
cheat:
db XX XX XX XX XX XX XX XX XX XX XX

dealloc(cheatByteCode)
unregistersymbol(cheat)
[ENABLE]

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

Вот что получилось, но не работает...

что я делаю не так?

[ENABLE]
alloc(newmemZ,2048)
label(returnhereZ)
label(cheatByteCodeZ)
label(QWordValueZ)
label(QWordValue)
label(cheatZ)
registersymbol(cheatZ)
aobscan(aob_scanZ,DD 40 18 DD 5F 18 8B)

newmemZ:

newmemZ + 64:
QWordValueZ:
dq (double)10000

QWordValue:
dq (double)10

cheatByteCodeZ:

fld qword ptr [eax+18]
fstp qword ptr [edi+18]

push eax
fld [QWordValueZ]
fcomp qword ptr [edi+08]
fnstsw ax
test ah,0x41
jne returnhereZ

fld [QWordValueZ]
fcomp qword ptr [edi+10]
fnstsw ax
test ah,0x41
jne returnhereZ

fld qword ptr [QWordValue]
fstp qword ptr [edi+08]
fld qword ptr [QWordValue]
fstp qword ptr [edi+10]

jmp returnhereZ

aob_scanZ:
cheatZ:
jmp cheatByteCodeZ
nop

returnhereZ:
pop eax

[DISABLE]
cheatZ:
fld qword ptr [eax+18]
fstp qword ptr [edi+18]

unregistersymbol(cheatZ)
dealloc(newmemZ)

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


[ENABLE]
alloc(cheatByteCodeZ,2048)
label(returnhereZ)

aobscan(aob_scanZ,DD 40 18 DD 5F 18 8B)
label(aob_scanZ)
registersymbol(aob_scanZ)

label(QWordValueZ)
registersymbol(QWordValueZ)
label(QWordValue)
registersymbol(QWordValue)

//########################################

cheatByteCodeZ:
fld qword ptr [eax+18]
fstp qword ptr [edi+18]
push eax

fld [QWordValueZ] // подгрузил, возможно вытолкнул что нужное стека...
fcomp qword ptr [edi+08]
fnstsw ax
test ah,0x41
jne returnhereZ

// fld [QWordValueZ] // уже загружал
fcomp qword ptr [edi+10]
fnstsw ax
test ah,0x41
jne returnhereZ

fld qword ptr [QWordValue]
fstp qword ptr [edi+08]
fld qword ptr [QWordValue]
fstp qword ptr [edi+10]

returnhereZ:
fstp [QWordValueZ] // подгрузил, но оставил невыгруженным.
pop eax
ret //*****************возврат к месту вызова

//****************объявить переменные можно в конце страницы cheatByteCodeZ
QWordValueZ:
dq (double)10000
QWordValue:
dq (double)10

//########################################
//*****************инжект вызова процедуры cheatByteCodeZ
aob_scanZ:
call cheatByteCodeZ
nop
//########################################

[DISABLE]
//****************возвращаем как было
aob_scanZ:
fld qword ptr [eax+18]
fstp qword ptr [edi+18]
//****************стираем все что создавали
unregistersymbol(aob_scanZ)
unregistersymbol(QWordValueZ)
unregistersymbol(QWordValue)
dealloc(cheatByteCodeZ)


FPREM... посмотри, или переделай без стека fpu, он тут не принципиален....
Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...
[ENABLE]alloc(cheatByteCodeZ,2048)label(returnhereZ)aobscan(aob_scanZ,DD 40 18 DD 5F 18 8B)label(aob_scanZ)registersymbol(aob_scanZ)label(QWordValueZ)registersymbol(QWordValueZ)label(QWordValue)registersymbol(QWordValue)//########################################cheatByteCodeZ:fld qword ptr [eax+18]fstp qword ptr [edi+18]push eaxfld [QWordValueZ] // подгрузил, возможно вытолкнул что нужное стека...fcomp qword ptr [edi+08]fnstsw axtest ah,0x41jne returnhereZ// fld [QWordValueZ] // уже загружалfcomp qword ptr [edi+10]fnstsw axtest ah,0x41jne returnhereZfld qword ptr [QWordValue]fstp qword ptr [edi+08]fld qword ptr [QWordValue]fstp qword ptr [edi+10]returnhereZ:fstp [QWordValueZ] // подгрузил, но оставил невыгруженным.pop eaxret  //*****************возврат к месту вызова//****************объявить переменные можно в конце страницы cheatByteCodeZQWordValueZ:dq (double)10000QWordValue:dq (double)10//########################################//*****************инжект вызова процедуры cheatByteCodeZaob_scanZ:call cheatByteCodeZnop//########################################[DISABLE]//****************возвращаем как былоaob_scanZ:fld qword ptr [eax+18]fstp qword ptr [edi+18]//****************стираем все что создавалиunregistersymbol(aob_scanZ)unregistersymbol(QWordValueZ)unregistersymbol(QWordValue)dealloc(cheatByteCodeZ)

FPREM... посмотри, или переделай без стека fpu, он тут не принципиален....

 

 

 

aobscan(aob_scanZ,DD 40 18 DD 5F 18 8B)

label(aob_scanZ) ошибка вылазиит в этой строке is not a valid identifier

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

Помогите не получается обещал людям телепортацию сделать.И так и сяк не получается игра вылетает

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

Помогите не получается обещал людям телепортацию сделать.И так и сяк не получается игра вылетает

Кенг же писал видео урок как сделать телепорт. Почему не посмотришь?

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

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

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

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