Всю (почти) ночь рассматривал код, над тем как сделать фильтр, запарился, даже голова перестала варить. Сделал скрипт для снятия апгрейдов с соперников (с простым фильтром на основе адреса стека), больше ничего не смог придумать, может кому пригодится:
define(address,"speed.exe"+277D11)
define(bytes,D9 84 24 88 00 00 00)
[ENABLE]
assert(address,bytes)
alloc(newmem,$1000)
label(code)
label(point)
label(return)
newmem:
point:
cmp esp,0019F618
je code
mov dword ptr [esp+88],(float)0
code:
fld dword ptr [esp+00000088]
jmp return
address:
jmp newmem
nop
nop
return:
[DISABLE]
address:
db bytes
// fld dword ptr [esp+00000088]
dealloc(newmem)
там где cmp esp,0019F618 - 0019F618 это верхушка стека, дело в том, что на этом месте "speed.exe"+277D11-fld dword ptr [esp+00000088] получают доступ два разных адреса стека, первый адрес 7 раз, второй адрес 21 раз, получается такое соотношение. 1 (игрок) * 7 (видов апгрейда) : 3 (соперники) * 7 (видов апгрейда)) = 7:21.
(и чего не проверил это 2 дня назад.)
Спасибо за подсказки с fnstsw ax .