문제

나는 "개선"을하려는 PC 게임의 코드를 살펴보고 있습니다. (알았어 어쩌면 나는 게임을 빨아 들였지만 여전히 플레이하고 싶다). 다음 코드를 살펴 보시겠습니까?

fld dword ptr[ebp+00007B1C]
fsub dword ptr[esp+64]
fst dword ptr[ebp+00007B1C]
call 004A2E48

이 코드는 레벨 카운트 다운 타이머의 경우 매 초마다 호출됩니다. 몇 분 동안 특정 수준에 머물러야합니다. 위의 코드를 수정하여 주소 [EBP+00007B1C]로 푸시 된 값이 0이되도록 게임 레벨은 항상 시간이 걸리며 미친 "생존"미니 게임을 연주 할 수 있습니다.

이 코드에서 내가 이해하는 것을 설명하겠습니다. 걱정하지 마세요, 당신은 이것에 깊이 들어갈 필요가 없습니다.에서 첫째 줄 타이머 값을 얻습니다. 예를 들어 97 초가 남아 있으면이 값이로드됩니다.
에서 두 번째 줄 값 (1 초)은 97에서 빼냅니다.
에서 세 번째 줄 96은 다시 메모리로 옮겨졌습니다. 마지막으로 남은 시간에 따라 다른 처리를 수행 할 기능 호출이 있습니다.

이제 내가해야 할 일은이 코드 조각을 어떻게 든 패치하는 것입니다.
이것으로 나를 도와 줄 수 있습니까?

도움이 되었습니까?

해결책

바꾸다

fld dword ptr[ebp+00007B1C]
fsub dword ptr[esp+64]

~와 함께

fldz ; Push zero on to top of floating point stack
nop ; From the end of the fldz to the beginning of the store instruction

다른 팁

다른 패치 :
바꾸다

fld dword ptr[ebp+00007B1C]

~와 함께

fld dword ptr[esp+64]
NOP
NOP

두 번째 명령을 nop하십시오. 즉, FSUB 명령이 얼마나 많은 바이트가 취하는 바이트를 찾아서 많은 수술 없음 바이트 코드 (0x90)로 덮어 씁니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top