2010-01-27 7 views
-1

오프셋을 제공하고 라이브러리의 기본 주소를 아는 간단한 함수를 만들어서 거기에있는 값을 검색하거나 설정할 수 있습니다.메모리 혼란

질문 :

메모리 유형 간의 근본적인 차이점은 무엇입니까?

정확히 알고 싶습니다. 내가 투명하게 작동하게하려면 무엇을 고려해야합니까? 예를 들어, 메모리 유형에 따라 다른 플래그를 사용하거나 "읽기 + 쓰기 + 실행"설정을 모두 사용해야합니까? Windows와 Linux의 차이점은 무엇입니까?

+0

"메모리 유형"은 무엇을 의미합니까? RAM 대 ROM 대 메모리 매핑 -IO 또는 다른 것? –

+0

대부분의 컴퓨터는 Von Neumann 아키텍처입니다. 즉, 모든 메모리가 하나의 플랫 주소 공간에 들어가는 것을 의미합니다. 하버드 대저택에서만. 그런 종류의 메모리 주소 공간을 만나게 될 것입니다. (내장 된 물건에서 널리 사용됨) – Earlz

+0

라이브러리가있는 메모리. 내가 생각하는 램. – user246100

답변

0

* nix에 대해서는 잘 모릅니다 만 Windows에서는 라이브러리 내의 모든 곳을 쓸 수 없습니다. (Windows 문서에서 모듈이라고 부릅니다.)

라이브러리의 페이지 크기는 4k 또는 8k입니다 (8k는 현재 Alpha AXP에서만 사용되었으며 현재는 사용되지 않습니다). 기본 주소는 64k의 배수가됩니다. 페이지는 copy-on-write 또는 읽기 전용 중 하나입니다. 나는 코드를 포함한 모든 페이지가 copy-on-write 일 것이라고 믿는다. 데이터가 포함 된 페이지는 데이터가 선언 된 방법에 따라 읽기 전용 또는 복사시 복사됩니다.

플래그 또는 설정에 신경 쓸 필요가 없습니다. 당신은 글을 쓸 수 있거나하지 않을 것입니다. 모듈 경계에서 머물러있는 한 항상 읽을 수 있어야합니다.

당신은 Win32 API의 ReadProcessMemory 또는 WriteProcessMemory

편집을 사용하지 않는 한 당신은 당신의 자신의 과정에서 페이지를 작성할 수 있습니다, 당신이 사용

페이지 보호 플래그를 변경하려면 의견에 따라 VirtualProtect 또는 VirtualProtectEx

페이지를 읽기 전용에서 읽기 - 쓰기로 변경 한 다음 쓰기 작업을 수행하면 메모리 만 변경하지 않고 변경 사항을 라이브러리 파일에 다시 기록 할 위험이 있습니다. 대신 페이지 보호를 쓰기 복사로 변경해야합니다.

VirtualProtect를 사용하면 해당 페이지를 지원하는 시스템에서 페이지의 실행 권한을 변경할 수 있습니다.

+0

깃발에 대해 걱정할 필요가 없다는 것은 불가능합니다. 나는 읽기 전용으로 제공되는 메모리를 다루었으며 쓰기 가능하도록 만들어야합니다. 즉, 기능 패치를 위해. – user246100

0

프로그래밍 할 언어가 명시되어 있지 않으므로 C 및 파생물로 가정합니다.

unsigned char value = *(unsigned char *)address; 

을 그리고 당신이 원하는 경우를 작성 :

당신이 주소를 가지고 있다면, 당신은 포인터로 캐스팅하고 역 참조하여 해당 주소의 바이트를 읽을 수

*(unsigned char *)address = value; 

이 기능을 사용하려면 주소가 들어있는 페이지를 적절한 권한으로 주소 공간에 매핑해야합니다. 페이지가 매핑되지 않았거나 적절한 권한이없는 경우 OS가 일반적으로 프로그램을 종료합니다 (Linux에서는 SEGV라는 세그먼트 위반이 발생합니다).

+0

C++. 내가 정확히 원하는 것은 : 사람이 .dll이나 .so를보고 4.0을보고 6.0이되기를 바란다. 또는 "물건"이고 그것을 "물건"이되기를 원합니다. 기본 주소 (X)에서 오프셋을 취할 수 있고 그가 할 수있는 세트 (x, 16.0)를 원한다. – user246100

1

Linux에서 프로그램을 컴파일 할 때 elf32 링커의 특성으로 인해 읽기, 쓰기 및 실행이 가능합니다. 예를 들어 한 세그먼트를 읽기 전용으로, 다른 세그먼트를 쓰기 전용으로 가질 수 있습니다. Windows에서 링커가이를 수행 할 수 있는지 확실하지 않습니다. 다른 프로그램에서 공유하는 세그먼트가있을 수 있습니다.

이제는 투명하게 작동하게하기 위해 Windows와 Linux 모두에서이를 사용한다고 가정하십니까? 두 플랫폼 모두의 메모리는 사용자 토지 프로그램과 커널 코드 사이에 커널이 보호되어 있다는 점에서 개념이 비슷합니다. DOS의 옛날에

는 메모리 세그먼트로 분할되었다 : 오프셋 (offset)과 같이 함께 결합 할 때 : DOS 환경으로 어드레싱 모드 메모리의 특질 극복했다

 
segment + 
offset 
--------- 
physical memory for that segment 

for example: 
B800 + 
0000 
------ 
B8000 

수 2^20 바이트의 메모리 만 액세스하므로 세그먼트 + 오프셋 쌍이 16 비트 모드에서 사용되었습니다. 세그먼트가 얼마나 많은 줄 알려주는 BIOS에 위치한 0x484입니다

int heightScreen(void) 
{ 
    return (*(unsigned char far *) 0x484) + 1; 
} 

:

는 여기에 DOS 화면에서 얼마나 많은 라인을 확인할 수 있습니다 16 비트 코드의 예입니다.

32 비트 모드에서 세그먼트 선택기 : 세그먼트 (생각 ... 메모리에서이 글을 쓰고있는 것은 확실하지 않음), OS의 설계 방식에 따라 다른 방법으로 메모리에 액세스 할 수 있습니다. 수요 페이징, 가상 및 플랫 모드의 컨텍스트 ... 여기에 대한 참조는 인터넷의 pdf에있는 인텔 문서에서 찾을 수 있습니다. 관련 문서는 검색 할 수있는 '24143004.pdf'입니다.

프로세서는 권한있는 명령어와 메모리에만 액세스 할 수있는 ring0 모드를 가지고 있습니다. ring3은 응용 프로그램의 사용자 토지 도메인이 실행되는 곳이며 권한있는 명령어에 대한 액세스를 제한하거나 전혀 사용하지 않고 자신의 메모리 공간에 액세스 할 수 있습니다. ring2는 일반적으로 커널과 사용자 영역 사이의 중개자 역할을하는 장치 드라이버에 의해 점유됩니다. 또한 커널은 특정 권한을 요청하기 위해 콜 게이트 나 트랩을 제공했을 것입니다 (장치 드라이버 만이 할 수 있습니다).

권한이있는 메모리에 액세스하여 시스템을 무릎 꿇게 할 위험이있는 경우 Linux에서 해당 프로그램에 suid 비트를 제공하거나 루트로 실행하십시오. Windows의 경우 코드 사용 권한을 높이거나 프로세스 메모리에 코드 삽입을 수행하거나 커널 코드/메모리 공간과 상호 작용하는 장치 드라이버를 작성하고 사용자 토지 코드가 상호 작용할 API를 제공해야합니다.

액세스 권한이없는 권한있는 명령어 또는 메모리에 액세스하려고하면 커널이 "get lost, no way jose"라고 말한 것처럼 프로세스를 종료하여 프로그램을 종료합니다.

희망 요약이 도움이됩니다.

+0

보세요. 변수와 함수가 많은 라이브러리가 있습니다. 함수의 주소를 알고 있다면 쓰기 가능으로 설정하고 원하는 바이트를 패치 할 수 있습니다. 그러나 다른 종류의 메모리 위치, 즉 ".rodata", ".text"및 ".data"와 함께 작업 한 적이 없다는 것도 알고 있습니다. 제가하고 싶은 것은 모든 종류의 메모리를 패치하기 위해 라이브러리의 시작부터 오프셋을받는 것입니다. – user246100

+0

왜 패치를 적용 하시겠습니까? – t0mm13b

+0

라이브러리의 동작을 변경하려면 다음을 수행하십시오. 라이브러리는 반감기 1 기반 게임에 속하며 메모리를 패치하면 끝없는 기능 변경이 허용됩니다. – user246100

0

나는 윈도우에서 잘 모르겠지만 * nix에서 나는 mmap이 일을 할지도 모른다라고 생각한다. 아마 동적으로 링크 된 메모리에 글쓰기는 여전히 그래도 위험하다. 귀하의 의견에서

난 당신이 내가 당신을 알려야합니다

//in the library 
void myfunction(){ 
    int x; 
    x=x+1; 
} 

//in the client 

uint8_t *ptr=(void*)&myfunction; 
ptr[0]=some_opcode; 

처럼 뭔가를하고 싶은 생각 것, 그것은 아마 내가 본 것 중 가장 안전하지 않은 것입니다. 이것은 OpenBSD와 같은 몇몇 보안 OS에서는 W^X이기 때문에 가능하지 않다는 것을 알고 있습니다. 실행 파일이 이미 고정 주소에 링크되어 있기 때문에 mmap을 사용할 수 없으므로 로컬이 아닌 변수 액세스가 중단됩니다 (x86-64에서, 나는 x86-32에서도 그렇다고 생각한다.)

진지하게. 왜 이런 종류의 자체 수정 코드를 수행 할 수 있어야합니까?

+0

이미 응답했습니다. 그러나 여기에 다시 간다 : \t "라이브러리는 반감기 1 기반 게임에 속하며 메모리를 패치하면 끝없는 기능 변경이 허용됩니다" – user246100

+0

코드가 실행되기 전에 라이브러리를 패치하지 않는 이유는 무엇입니까? ? 이것은 약간의 ELF/PE 파싱을 필요로하지만, 현재의 생각보다 훨씬 더 가능합니다. – Earlz

+0

이것은 ilegal이고 다른 사람들이 원하는대로 사용하기위한 라이브러리입니다. 이것은 이미 다른 사람들이하고 있으며 절대적으로 가능하고 쉽습니다. Windows 용으로 만 만들어졌으며 Linux 용 차이점을 배우고 싶습니다. – user246100