2013-08-20 1 views
1

제목을 편집하려면 누군가가 필요합니다. 더 나은 제목을 찾을 수 없습니다. 다른 응용 프로그램의 주소 포인터를 변경하십시오.


는이이 간단한 프로그램은 source.exe라고 가정

#include <stdio.h> 

int main() 
{ 
    int a = 5; 
    printf("%p", &a); 
    return 0; 
} 

내가 위의 a를 변경 다른 응용 프로그램, change.exe을 쓰고 싶어요. 그것은 작동하지 않습니다

int main() 
{ 
    int * p = (int*) xxx; // xxx is what have printed above 
    *p = 1; 
    printf("%d", *p); 
    return 0; 
} 

:

나는 이런 식으로 뭔가를 시도했다. 관리자 권한이 있다고 가정 할 때 위에서 시도한 작업을 수행 할 수있는 방법이 있습니까? 감사.

+0

디버거가 할 수 있기 때문에 대답은 '예, 가능합니다'이지만 정상적으로하는 것은 아닙니다. 다른 모든 것들은'source.exe'가 간단히 실행되어'change.exe'의 실행이'source.exe'에서 무엇이든 바꿀 기회를 얻는 데 어려움을 겪을 것입니다. 'source.exe'의 종료를 지연시키는 메커니즘을 추가한다고 가정하면, 당신은 여전히 ​​모든 종류의 문제를 겪고 있습니다. O/S의 목적 중 하나는 ProcessA가 ProcessB의 메모리를 망치는 것을 중지하는 것입니다. 따라서 당신은 그 보호를 파괴하고 있습니다. –

+1

답변을 얻으려면 운영 체제가 필요합니다. Linux에서는 ptrace를 사용합니다. Windows에서는 WriteProcessMemory를 사용할 수 있습니다. –

+0

한 응용 프로그램의 주소가 다른 응용 프로그램의 주소와 같지 않습니다. 읽기 http://en.wikipedia.org/wiki/Virtual_address_space – chris

답변

0
  1. 왜 이것이 가능하다고 생각하십니까? - 디버거 만 읽을 수 있습니까?
  2. 가능한 경우 모든 종류의 신체 상해가 발생할 수 있습니다!
  3. 공유 메모리가 마음에 들었습니다.
+1

글쎄, * Windows에서 * WriteProcessMemory입니다. – chris

+1

그리고 Windows에서 지속적으로 발생하는 모든 종류의 신체 상해를 보시나요? – aschepler

+0

@Ed Heal은 "그것이 ** 간단하다면"을 의미한다고 생각합니다. –

1

첫 번째로 두 번째 프로그램을 실행하면 첫 번째 프로그램의 a이 길게 사라집니다 (또는 다른 위치에로드 됨). 두 번째로 많은 OS는 프로그램을 별도의 공간에로드하여 프로그램을 보호합니다.

당신이 정말로 찾고있는 것으로 보이는 것은 Inter-Process Communication (IPC) 메커니즘, 특히 공유 메모리 또는 메모리 매핑 파일입니다.

1

사람들이 다루는 대부분의 전통적인 컴퓨터에서 운영 체제는 가상 메모리를 사용합니다. 즉, 두 프로세스 모두 주소 0x12340000을 사용할 수 있으며 두 개의 다른 메모리 부분을 참조 할 수 있음을 의미합니다.

메모리 조각화를 비롯하여 여러 응용 프로그램이 임의의 시간에 여러 응용 프로그램을 시작하고 중지 할 수 있도록하는 등의 여러 가지 이유로 유용합니다.

예를 들어 TI DSP와 같은 일부 시스템에서는 MMU가 없으므로 가상 메모리가 없습니다. 이 시스템에서는 데모 응용 프로그램과 같은 기능을 사용할 수 있습니다.

1

나는 약간 모험적 이었기 때문에 WinAPI를 사용하여 Windows에서 이와 비슷한 것을 작성하려고했습니다. Linux의 ptrace처럼이 코드에서 사용되는 호출은 디버거에서만 사용해야하며 정상적인 응용 프로그램 코드에서는 일반적으로 볼 수 없습니다.

또한 쓰기를 위해 다른 프로세스의 메모리를 열려면 PROCESS_VM_WRITEPROCESS_VM_OPERATION 권한으로 프로세스 핸들을 열어야합니다. 그러나 이는 프로세스를 여는 응용 프로그램이 SeDebugPriviledge 권한을 사용할 수있는 경우에만 가능합니다. 관리자 권한으로 상승 된 모드에서 응용 프로그램을 실행했지만, 실제로 이것이 SeDebugPriviledge에 영향을 미치는지 여부는 알 수 없습니다.

여하튼, 여기에 내가 이것을 위해 사용한 코드가 있습니다. VS2008로 컴파일되었습니다.

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char cmd[2048]; 
    int a = 5; 
    printf("%p %d\n", &a, a); 

    sprintf(cmd, "MemChange.exe %lu %x", GetCurrentProcessId(), &a); 
    system(cmd); 

    printf("%p %d\n", &a, a); 

    return 0; 
} 

다음 코드는이 코드가 호출하는 MemChange.exe의 코드입니다.

#include <windows.h> 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    DWORD pId; 
    LPVOID pAddr; 
    HANDLE pHandle; 
    SIZE_T bytesWritten; 
    int newValue = 666; 

    sscanf(argv[1], "%lu", &pId); 
    sscanf(argv[2], "%x", &pAddr); 

    pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId); 
    WriteProcessMemory(pHandle, pAddr, &newValue, sizeof(newValue), &bytesWritten); 
    CloseHandle(pHandle); 

    fprintf(stderr, "Written %u bytes to process %u.\n", bytesWritten, pId); 
    return 0; 
} 

그러나이 코드를 사용하지 마십시오. 그것은 끔찍한 것이며 오류 체크가없고 거룩한 지옥처럼 누출 될 것입니다. WriteProcessMemory으로 수행 할 수있는 작업을 설명하기 위해 작성되었습니다. 희망이 도움이됩니다.

관련 문제