2012-07-26 2 views
0

나는 당신이 내가 이해하도록 도와 줄 수 있기를 바라는 문제에 걸려 넘어졌다.왜 실행 사이에 PE 섹션이 변경됩니까?

내 응용 프로그램에는 (ReadProcessMemory 또는 memcpy, 동일한 결과) 모든 코드를 복사하고 데이터 섹션 만 읽고 파일에 쓰는 스냅 샷 기능이 있습니다. 그런 다음 파일을 읽고 파일에있는 내용과 메모리에있는 내용에 대한 memcmp를 수행하는 확인 함수가 있습니다.

스냅 샷 기능을 실행 한 다음 동일한 세션에서 확인 기능을 실행하면 확인을 실행 한 횟수와 상관없이 동일한 것으로 계속 유지됩니다.

한 세션에서 스냅 샷을 찍은 다음 응용 프로그램을 다시 시작하고 메모리를 동일하게 만들었거나 확인하지 않으면 응용 프로그램을 3-4 재시작 할 때마다 완전히 무작위로 표시되는 경우가 있지만 조만간 ' 파일의 데이터가 PE 섹션 코드와 동일하다고 생각하지 마십시오. 여기

가 실행 사이의 체육 코드 섹션의 비교의 링크입니다 :

http://i45.tinypic.com/4kad7b.jpg

항상 같은 일이, 그것은 (?이 경우 고가 1) 다른 하나 개의 문자를 변화하고 있어요하지만, 언제 어떤 캐릭터가 다른가?

왜 이런 일이 일어 났는지 설명 할 수 있습니까? 이런 식으로해야 하는가? 그렇다면 왜 그렇습니까? 아니면 내가 잘못하고있는거야?

참고 : 디버거가 연결되어 있거나 연결되어 있지 않은 상태에서 디버그 및 릴리스 모두에서이 기능을 테스트했습니다.

답변

3

보안상의 이유로 최신 운영 체제는 프로세스의 메모리 레이아웃을 무작위로 지정합니다. 이 메커니즘은 Address Space Layout Randomization (ALSR)입니다.

실행 파일에 취약점이있는 경우 공격으로 응용 프로그램에 외부 코드를 삽입하는 것이 훨씬 더 복잡해집니다.

+0

그래, 나는 게시하기 전에 그 링크를 보았다. 그러나 내가 놓치지 않는 한 그것은 나의 문제를 일으키는 것이 아니다. 내 파일의 메모리에 상대 주소를 저장하고있어 파일에서 읽을 때 절대 주소에 매핑되며 새 모듈 주소 (PE 데이터가있는 위치)를 고려하여 절대 주소에 매핑됩니다. 그리고 비교에서 볼 수 있듯이 데이터가 거의 동일하다는 점을 제외하고는 1 바이트가 다른 위치로 대체됩니다. – user1553880

+0

아아 이제 모듈화 된 주소가 변경되지만 문제는 PE 코드 섹션이 메모리에로드 될 때 절대 주소를 포함한다는 것입니다.이 주소는 PE 파일의 .reloc 섹션의 도움으로 수정됩니다. exe가 실행됩니다. 이렇게하려면이 작업을 수행하기 위해 비교를 수행하기 전에 .reloc 섹션을 사용하여 저장된 파일의 주소를 수정해야합니다. – user1553880

관련 문제