2010-03-29 4 views
8

런타임에 vtable에서 가져 오는 함수에 대한 포인터가 있고 어셈블러 코드를 변경하여 함수를 편집하고 싶습니다. 나는 memset을 사용해 보았고 mPtr [0] = X, mPtr [1] = Y 등등과 같은 새로운 값을 직접 할당하려고 시도했지만 세그먼트 오류가 계속 발생합니다. 코드를 변경하려면 어떻게해야합니까?런타임시 코드 변경

(전 C++을 사용하고 있습니다)

OS는 windows입니다.

+1

어떤 운영 체제입니까? – elcuco

+1

왜 이렇게하려고합니까? 확실히 유일한 이유는 디스크에서 코드 섹션을로드 할 수 있기 때문에 작업 메모리 양을 줄이는 것입니다. 네가하려는 일에 대해 설명하면 아마 우리가 도울 수있을거야. – thecoshman

+0

자체 수정 코드는 어렵습니다. 이 OS는 자체 수정 코드를 허용하는 구문이 중간 수준 언어에 없으므로 어셈블리로 완전히 작성되었습니다. http://valerieaurora.org/synthesis/SynthesisOS/abs.html. –

답변

6

일반적으로 메모리가 API 호출로 VirtualAlloc 호출로 할당 된 경우 API 호출 VirtualProtect을 사용하여 메모리 특성을 변경할 수 있습니다. API 호출로 첫 번째 메모리 특성 확인 VirtualQuery

+0

고마워,이게 내가 바라는거야. – polo

3

운영 체제 및/또는 아키텍처에 따라 실행 파일 페이지에 기록 할 수도 있고 기록하지 않을 수도 있습니다.

Intel (IA-32e) 설명서에서 페이지를 실행 가능 또는 읽기 전용으로 표시하는 방법에 대한 설명서를 확인하십시오. 코드가 읽기 전용 섹션에있을 수 있으므로 코드를 쓸 수 없습니다.

읽기 전용 페이지가 아닌 코드를 표시 할 수는 있지만 컴파일러에 따라 다릅니다 (JIT 컴파일러가 수행).

MSVC에서는 #pragma section을 사용하여 읽기/쓰기 섹션을 만들고 #pragma alloc_text을 사용하여 함수를 넣을 수 있습니다.

-1

코드가있는 메모리 섹션은 일반적으로 읽기 전용으로 표시됩니다. 그래서 세분화 실패가 발생합니다. 컴파일러에 대한 특수 키 (확실하지는 않음) 또는 바이너리 파일을 수정하여 섹션에서이 플래그를 제거 할 수 있습니다 (가능한 100 %가 아님).

0

일반적으로 쓰기를 시도하고 있습니다. 코드 세그먼트, 뭔가 새로운 운영 체제가 당신을 방지 할 것입니다. 이것이 일부 바이러스가 작동 한 방식입니다.

해당 보호 기능을 제거 할 수있는 API가 있지만 운영 체제에 따라 다릅니다.

관련 문제