강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

woohyun님의 프로필 이미지
woohyun

작성한 질문수

이해하면 인생이 바뀌는 Windows API hook

캐시 플러싱

8강과 9강에서 jmp해야하는 main의 상대 주소가 달라요.

해결된 질문

작성

·

50

0

안녕하세요 강사님.

8강과 9강에서는 testFunc을 targetFunc의 도입부에 넣어 실행을 시키고

main으로 다시 돌아오도록 코드가 되어있는데요

main의 시작점과 리턴을 희망하는 위치를 계산해보면 강의 자료보다 큰 값이 나옵니다.

질문1. x86으로 최적화를 하지 않고 똑같이 실행을 했는데 왜 다른지 궁금합니다.

제 코드를 디스어셈블리에서 보면 강의에서 보이는것보다 많은 기계어들이 보입니다.

질문2. "jmp main + 86h" 에서 86대신 D0 이런식으로 계산 결과가 나왔을 때 빌드 에러가 발생하고 있습니다. 0xD0 이런식으로 넣으면 빌드 에러는 나지 않지만 다른곳으로 점프를 하는것 같고요. 어떻게 해결을 해야할까요?

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

8, 9강의 내용은 함수 프롤로그/에필로그와 Naked 함수에 관한 것으로 질문과 다른 것입니다. 해서 강의 내용 중 질문에 가까운 내용은 12강 힙 메모리에 저장된 코드 실행하기로 추정학고 답변을 드립니다.

  1. 컴파일러 설정이 같다하더라도 운영체제 환경 및 컴파일러 버전에 따라 구체적인 값은 달라질 수 있습니다. 그리고 더 많은 기계어가 보인다는 것은 어쩌면 빌드 모드가 디버그 모드라 그럴 수 있습니다.

  2. 인라인 어셈블리 코드에서 상수값을 수정하더라도 빌드오류가 발생하지는 않습니다. 정확한 답변을 드리려면 구체적인 코드 및 에러 메시지를 봐야 답변을 드릴 수 있겠습니다.

참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다.
woohyun님 질문에 대한 답변 드리겠습니다.

질문1에 대해서는 컴파일러의 최적화 옵션이나 환경에 따라 생성되는 기계 코드가 달라질 수 있습니다. x86 환경에서 최적화를 하지 않더라도 컴파일러의 버전이나 설정에 따라 변동이 있을 수 있으며, 이러한 차이는 디스어셈블리에서 기계어의 차이로 나타날 수 있습니다. 컴파일러의 최적화 옵션을 확인하고 강의와 동일한 옵션을 사용하였는지 검토해보는 것이 좋습니다.

질문2에 대해서는 “jmp” 명령어를 사용할 때 상대 주소를 계산할 필요가 있습니다. 이때, jmp 명령어에서 -128부터 +127 사이의 바이트는 간편하게 처리되지만, 그 범위를 벗어나는 경우에는 절대 주소나 롱 점프를 사용해야 합니다. “jmp main + 0x86”과 같은 형식에서 계산 결과가 범위를 벗어난 경우, jmp/branch 명령어가 올바르게 작동하지 않을 수 있습니다. 따라서 계산된 상대 주소의 크기를 검토하고, 너무 큰 값이 계산된 경우에는 메모리 객체나 함수의 위치를 확인해야 합니다.

추가적으로, 해당 부분에 자세한 내용이 강의 내용에 포함되어 있으면 그 내용을 참고해 주시길 바랍니다. 더불어, GraalVM의 Native Image Compatibility Guide도 참고해 보시는 것을 추천드립니다.

감사합니다.

woohyun님의 프로필 이미지
woohyun

작성한 질문수

질문하기