2011-03-30 2 views
1

저는 런타임에 메서드와 함수의 주소를 변경하는 FastMM 코드를 연구 중입니다. 그러나 나는 어떤 것을 이해하지 못했습니다.FastCode : 코드 공부 중

http://koders.com/delphi/fid356C72C9C454FA74A916971690F624B0FF9111E5.aspx?s=pos

내 의심의 여지가 라인 47에 "만약 PBYTE (AStub)^= $ E8 다음" 왜이 비교? 확인되었거나 지정되었는지 확인하십시오. 내가 잘못 ? 하지만 왜 $ E8 (232)입니까? 항상 같은 값일 경우 항상 동일한 결과를 얻지 못합니까?

나머지 코드는 내 마음 속에 "괜찮습니다". 그러나 어떤 사람이 그 모든 것을 설명 할 수 있다면 감사드립니다.

조언이 있습니다.

답변

7

그 코드는 CALL 명령의 대상 주소를 반환합니다. 테스트는 루틴으로 전달 된 CALL 명령인지 확인하는 것입니다. 이것은 지시의 중간이나 심지어 코드가 아닌 것의 주소를 전달할 수 있기 때문에 어리석은 증거가 아닙니다.

그렇습니다. 함수가 올바르게 호출되면 테스트가 항상 성공해야합니다.

이 두 루틴은 아마도 함께 사용됩니다. 먼저 CALL 명령의 주소를 얻은 다음 해당 사이트의 코드가 JMP ($ E9)로 바뀝니다.

+0

더 명확히하기 위해, AStub의 ** 주소 **가 아니라 AStub의 첫 번째 바이트 ** 내용 **을보고 있습니다 (역 참조 연산자'^'참고). 이것이 CALL 명령인지 확인합니다. –

+0

훈 .... 나는 http://faydoc.tripod.com/cpu/call.htm에서 전화를 찾았습니다. 실제로 opcode는 E8입니다. : D 흥미 롭습니다. 나는 더 많은 질문을 할 것이고, 나는 곧 물을 것이다. –

+0

@SaCi 정확히 말했듯이. 이 코드는 자체 수정 코드를 사용하여 한 함수를 다른 함수로 바꾸는 것에 관한 것입니다. FastcodeGetAddress는 변경 될 코드가 CALL ($ E8) 옆의 상대 주소를 디코딩하는 위치에서 작동합니다. 그런 다음 FastcodeAddressPatch가 해당 코드 (CALL 대상)를 찾아 JMP ($ E9)로 변경하여 새 구현으로 변경합니다. –

관련 문제