2011-08-22 8 views
0

게임 (구체적으로 심즈 3)의 코딩이 잘못되어 무작위로 충돌을 멈추게하는 방법 중 하나는 DEP 예외 목록에 추가하는 것입니다. 그럴 필요가 없다면 그렇게하고 싶지는 않습니다. 그래서 외부 프로세스에서 SetProcessDEPPolicy를 사용하여 DEP를 비활성화하는 방법이 있는지 궁금합니다. 나는 훌륭한 프로그래머가 아니므로 더 많은 정보를 제공할수록 좋습니다.다른 프로세스에서 SetProcessDEPPolicy를 호출합니까?

답변

0

이는 원격 프로세스에 스레드 주입함으로써 그렇게 할 수있다 :

HMODULE hKernel32 = GetModuleHandle("kernel32"); 
// Procedures in kernel32.dll are loaded at the same address in all processes 
// so find the address in our own process, then use it in the target process 
FARPROC pSetProcessDEPPolicy = GetProcAddress(hKernel32, "SetProcessDEPPolicy"); 
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pSetProcessDEPPolicy, 0 /* disable DEP */, 0, NULL); 
if (hThread == NULL) { 
    // handle/report error 
} 
WaitForSingleObject(hThread); 
CloseHandle(hThread); 

그러나 이는 일반적으로 좋지이다; 프로세스가 시작될 때와 DEP가 활성화되는 동안 스레드 주입을 수행 할 때 사이에 시간대가 있으며, 치트 방지 또는 DRM 기능이 스레드 주입을 프로그램 해킹 시도로 볼 수 있습니다. 단순히 DEP 예외 목록을 설정하는 것이 훨씬 안정적이며 동일한 효과가 있습니다.

+0

그렇다면 내 프로그램이 출시를 듣고 대신 다른 응용 프로그램을 시작한 것이 가장 좋을까요? (C++에서 응용 프로그램을 시작하는 방법을 모르겠다. C#과 ahk로만 다뤘지만, 아마도 알아낼 것이다.) – Dragonshadow

+0

@Dragonshadow, 응용 프로그램을 시작하면이 작업이 더 쉬워지지 않습니다. 앱의 시작과 동기화하고 스레드를 삽입하는 방법이 있지만 상당히 복잡합니다.) 문제가있는 앱에 대해 DEP 블랙리스트를 설정하지 않는 것에 대해 왜 그렇게 강하게 생각하십니까? – bdonlan

+0

문제의 컴퓨터는 지금 당장 실행할 수없는 하드웨어 문제가 있으므로 다시 시작할지 여부는 도박입니다. DEP 블랙리스트를 설정하려면 컴퓨터를 다시 시작해야합니다. – Dragonshadow