나는 잘못 작성된 코드의 수정 불가능한 라이브러리를 수용하기 위해 약간의 코드 해킹 문제에 다시 직면했다.함수의 주소를 가져올 때의 이상한 행동
조사 후 (함수 포인터에 어떤 종류의 상태도 넘길 수 없다는 것을 알게 된 후) EAX를 0xCCCCCCCC로 재설정하는 함수 헤더 내의 ASM 바이트를 NOP로 추출해야합니다.
내장 된 VC++ 디버거를 사용하여 함수의 '주소'를 가져 와서 치트 엔진에 바이트 항목 배열을 수동으로 생성하면 (이는 이런 종류의 일에 놀랍게 유용합니다), 바이트와 5 바이트 시퀀스를 수동으로 NOP 할 수 있습니다.
그러나 프로그래밍 방식으로 처리하는 것은 조금 다릅니다.
다음 중 하나를 수행 할 때 주소가 디버거에서보고하는 것보다 상당히 높습니다.이 주소는 잘못된 바이트를 가리키는 포인터입니다.
unsigned int ptr = reinterpret_cast<unsigned int>(testhack);
unsigned char* tstc = (unsigned char*)&testhack;
FARPROC prc = GetProcAddress(GetModuleHandle("mod.dll"), "testhack"); // Still
// returns the incorrect address (same as the previous two)
올바른 주소를 찾으려면 디버거가 무엇을 수행합니까? 프로그래밍 방식으로 올바른 주소를 찾는 방법은 무엇입니까?
왜 downvote? 이를 수행 할 수있는 다른 방법이 없습니다. – Qix
'EAX'를 저장하고 clobbered 후에 복원 하시겠습니까? –
@ MarkB 나는 그것을 제어 할 수 없다. – Qix