2013-08-11 3 views
0

간단한 질문입니다. C++이나 windows api에서는별로 좋지 않지만 주입 할 dll을 작성했습니다. 기본적으로 나는 바꿀 라인의 알려진 메모리 오프셋을 가지고 있습니다.DLL inject 알려진 오프셋의 문자열 바꾸기 C++

IDA에서

: 는 .text : 0051CA30 푸시 REC 디 컴파일에서 16D8h

: (5848) _push;

5848 또는 16D8h는 파일에서 읽는 값 이상입니다. 내가하고 싶은 것은 오프셋을 훅하고 내 텍스트를 인쇄하는 것뿐입니다. 이것은 매우 간단해야하지만 나는 내 인생과 내가 시도한 모든 프로그램을 계속 충돌하는 것으로 파악할 수 없다. 파일에서 텍스트를 바꾸는 것은 슬프게도 쉽게 대체 할 수 있고 속이기 위해 사용할 수있는 옵션이 아닙니다.

필자가 수행 한 모든 기능 대체에 detours가 사용됩니다.

+0

DLL을 ['WriteProcessMemory'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681674.aspx)로 작성하지 않고 삽입해야하는 이유가 있습니까? ? –

+0

나는 주사를하지 않아도되지만, 내 다른 주입 된 기능과 같은 DLL에 있어야합니다. –

답변

0

대상 프로세스에서 문자열을 바꾸려면 삽입 된 DLL에서 다음 코드 단편을 사용할 수 있습니다.

char* buffer = reinterpret_cast<char*>(base + 0x16D8); 
size_t length = strlen(buffer) + 1; 

char myStr[length] = "..."; 

DWORD oldProtect; 
VirtualProtect(buffer, length, PAGE_EXECUTE_READWRITE, &oldProtect); 
memcpy(buffer, myStr, length); 
VirtualProtect(buffer, length, oldProtect, nullptr); 

참고 : 새로운 문자열의 길이가 원래의보다 작거나 같아야합니다.

+1

문자열과 동일한 페이지에 코드가있는 경우 (일부 컴파일러는 코드 세그먼트에 읽기 전용 상수를 둡니다) 문자열을 패치하는 동안 다른 스레드가 코드를 실행하는 경우 PAGE_EXECUTE_READWRITE를 사용하십시오. –

+0

의견을 보내 주셔서 감사합니다. – Roland