Нет, готового кода, постоянно удаляю что не работает (не нужное). Тот участок описывает примерно вот такую логику, а вся запарка с fnstsw ax, просто счетчик:
// upgrade_percent = значению в стеке.
if(upgrade_percent == 1.0)
{
//далее работаем с формулами для максимального апгрейда,
//поэтому замена значения upgrade_percent не вызывает никакого эффекта.
return;
} else if(upgrade_percent == 0.0)
{
//далее работаем с формулами для апгрейда равного 0,
//поэтому замена значения upgrade_percent не вызывает никакого эффекта.
return;
}
// если процент апгрейдов средний работаем с формулами для среднего апгрейда,
// который будет использовать значение которое лежит на upgrade_percent.
// и который должен соответствовать условию 0 < upgrade_percent < 1.
// смысл условия в том что походу в некоторых формулах 0 и 1 могут дать одинаковый результат.
// а в случае с апгрейдом машин 0 и 1 должны давать разный результат
Используя такую инъекцию, обхожу проверку условий (т.к. машина у меня имеет макс.апгрейды), чтоб дойти до требуемой стандартной формулы:
[ENABLE]
"speed.exe"+277D11:
jmp speed.exe+277D69
nop
nop
[DISABLE]
"speed.exe"+277D11:
fld dword ptr [esp+00000088]
//Alt: db D9 84 24 88 00 00 00
Дальше ставить трейсер на эту точку (ставя перед условиями проверки, попадем сюда тока после овер миллион инструкций, на что не хватит либо оперативки либо нервов на ожидание):
speed.exe+277EDD - mov eax,[esp+00000090] // Достаем из стека процент апгрейда
speed.exe+277EE4 - lea edx,[esp+40]
speed.exe+277EE8 - push edx
speed.exe+277EE9 - push eax // Обратно кладем в стек (процент апгрейда будет иметь другой адрес)
speed.exe+277EEA - push esi
speed.exe+277EEB - lea ecx,[esp+3C]
speed.exe+277EEF - push ecx
speed.exe+277EF0 - lea edx,[esp+30]
speed.exe+277EF4 - push edx
speed.exe+277EF5 - call speed.exe+276280 // Вызов формулы
Ну и код самой формулы и куда кладется результат:
speed.exe+2762DA - fld dword ptr [speed.exe+49096C] { [1.00] }
speed.exe+2762E0 - mov ecx,[esp+20]
speed.exe+2762E4 - fsub dword ptr [esp+1C] // процент апгрейда
speed.exe+2762E8 - mov eax,[ecx+0C]
speed.exe+2762EB - test eax,eax
speed.exe+2762ED - fmul dword ptr [esp+04]
speed.exe+2762F1 - fld dword ptr [esp+08]
speed.exe+2762F5 - fmul dword ptr [esp+1C] // процент апгрейда
speed.exe+2762F9 - faddp
speed.exe+2762FB - fstp dword ptr [esp+1C]
...
speed.exe+276311 - mov edx,[esp+1C]
speed.exe+276315 - mov [eax],edx
При загрузке, к инструкции speed+276315 получают доступ 72 адреса, может и больше. Теперь уже можно подумывать написать фильтр.
Если кто тоже хочет покопаться в поиске фильтра "моя/не моя тачка", началось всё отсюда:
speed.exe+2F4A07 - mov esi,eax // тут должен лежать адрес структуры (или чего там) текущей машины
// апгрейды в 4 байтом значении (0 - нет апгрейда, 1-4 - уровни апгрейдов)
// начиная с [esi/eax+78] вроде
speed.exe+2F4A16 - repe movsd
speed.exe+2F4A09 - mov ecx,00000066 { 102 }
speed.exe+2F4A0E - lea edi,[esp+78]
speed.exe+2F4A12 - lea eax,[esp+78]
speed.exe+2F4A18 - mov [esp+70],eax
А тут уже вычисляется float значение, которую называл процентом апгрейда:
speed.exe+278B40 - fild dword ptr [esp+3C]
speed.exe+278B44 - lea edx,[esp+10]
speed.exe+278B48 - fidiv dword ptr [esp+0C]
speed.exe+278B4C - fstp dword ptr [esp+3C]