저는 런타임에 메서드와 함수의 주소를 변경하는 FastMM 코드를 연구 중입니다. 그러나 나는 어떤 것을 이해하지 못했습니다.FastCode : 코드 공부 중
http://koders.com/delphi/fid356C72C9C454FA74A916971690F624B0FF9111E5.aspx?s=pos
내 의심의 여지가 라인 47에 "만약 PBYTE (AStub)^= $ E8 다음" 왜이 비교? 확인되었거나 지정되었는지 확인하십시오. 내가 잘못 ? 하지만 왜 $ E8 (232)입니까? 항상 같은 값일 경우 항상 동일한 결과를 얻지 못합니까?
나머지 코드는 내 마음 속에 "괜찮습니다". 그러나 어떤 사람이 그 모든 것을 설명 할 수 있다면 감사드립니다.
조언이 있습니다.
더 명확히하기 위해, AStub의 ** 주소 **가 아니라 AStub의 첫 번째 바이트 ** 내용 **을보고 있습니다 (역 참조 연산자'^'참고). 이것이 CALL 명령인지 확인합니다. –
훈 .... 나는 http://faydoc.tripod.com/cpu/call.htm에서 전화를 찾았습니다. 실제로 opcode는 E8입니다. : D 흥미 롭습니다. 나는 더 많은 질문을 할 것이고, 나는 곧 물을 것이다. –
@SaCi 정확히 말했듯이. 이 코드는 자체 수정 코드를 사용하여 한 함수를 다른 함수로 바꾸는 것에 관한 것입니다. FastcodeGetAddress는 변경 될 코드가 CALL ($ E8) 옆의 상대 주소를 디코딩하는 위치에서 작동합니다. 그런 다음 FastcodeAddressPatch가 해당 코드 (CALL 대상)를 찾아 JMP ($ E9)로 변경하여 새 구현으로 변경합니다. –