Bien, copias el valor del registro st(0) a la pila, y luego dejas st(0) a su valor anterior, pero no entiendo el mov, porque mueves el valor del registro st(0) y luego reescribes el valor de la pila con el mov?
No es mejor hacer el mov directamente.
Y sobre fnstsw, luego comparas el valor para saber como esta el estado?
Un saludo.
No es mejor hacer el mov directamente.
Y sobre fnstsw, luego comparas el valor para saber como esta el estado?
Un saludo.
El código original es:
Código
Project1.exe+1CF0 - D9 46 34 - fld dword ptr [esi+34] Project1.exe+1CF3 - DC 05 90104000 - fadd qword ptr [Project1.exe+1090] Project1.exe+1CF9 - D9 5E 34 - fstp dword ptr [esi+34] Project1.exe+1CFC - DFE0 - fnstsw ax Project1.exe+1CFE - A8 0D - test al,0D Project1.exe+1D00 - 75 26 - jne Project1.exe+1D28 Project1.exe+1D02 - C7 45 FC 00000000 - mov [ebp-04],00000000 Project1.exe+1D09 - 8B 45 08 - mov eax,[ebp+08] Project1.exe+1D0C - 50 - push eax Project1.exe+1D0D - 8B 10 - mov edx,[eax] Project1.exe+1D0F - FF 52 08 - call dword ptr [edx+08] Project1.exe+1D12 - 8B 45 FC - mov eax,[ebp-04] Project1.exe+1D15 - 8B 4D EC - mov ecx,[ebp-14] Project1.exe+1D18 - 5F - pop edi Project1.exe+1D19 - 5E - pop esi Project1.exe+1D1A - 64 89 0D 00000000 - mov fs:[00000000],ecx Project1.exe+1D21 - 5B - pop ebx Project1.exe+1D22 - 8B E5 - mov esp,ebp Project1.exe+1D24 - 5D - pop ebp Project1.exe+1D25 - C2 0400 - ret 0004 Project1.exe+1D28 - E9 9FF3FFFF - jmp Project1.exe+10CC
Yo lo que hago es inyectar (añadir una sola instrucción) en la cuarta línea:
Código
Project1.exe+1CF0 - D9 46 34 - fld dword ptr [esi+34] Project1.exe+1CF3 - DC 05 90104000 - fadd qword ptr [Project1.exe+1090] Project1.exe+1CF9 - D9 5E 34 - fstp dword ptr [esi+34] mov [esi+34],42C80000 Project1.exe+1CFC - DFE0 - fnstsw ax Project1.exe+1CFE - A8 0D - test al,0D Project1.exe+1D00 - 75 26 - jne Project1.exe+1D28 Project1.exe+1D02 - C7 45 FC 00000000 - mov [ebp-04],00000000 Project1.exe+1D09 - 8B 45 08 - mov eax,[ebp+08] Project1.exe+1D0C - 50 - push eax Project1.exe+1D0D - 8B 10 - mov edx,[eax] Project1.exe+1D0F - FF 52 08 - call dword ptr [edx+08] Project1.exe+1D12 - 8B 45 FC - mov eax,[ebp-04] Project1.exe+1D15 - 8B 4D EC - mov ecx,[ebp-14] Project1.exe+1D18 - 5F - pop edi Project1.exe+1D19 - 5E - pop esi Project1.exe+1D1A - 64 89 0D 00000000 - mov fs:[00000000],ecx Project1.exe+1D21 - 5B - pop ebx Project1.exe+1D22 - 8B E5 - mov esp,ebp Project1.exe+1D24 - 5D - pop ebp Project1.exe+1D25 - C2 0400 - ret 0004 Project1.exe+1D28 - E9 9FF3FFFF - jmp Project1.exe+10CC
La idea es modificar lo menos posible el código original. Dicha modificación se efectua en tiempo de ejecución (con WriteProcessMemory) y cuanto menos se modifique la imagen del ejecutable en runtime, mejor xD El fin de todo ésto es conseguir que la variable valga 100 al ejecutar ese código, así con un simple mov lo soluciono, es cierto que la instrucción anterior se podría quitar, pero mejor no tocar el código original ya que si quiero volver a dejar la función original, solo tendré que nopear el mov que he inyectado yo.
Es un poco enrevesado, pero a la hora de programar trainers es mejor hacerlo así.