문제

답을 찾지 못해서 이전에 여기에서 묻는 질문에 나는 다른 접근 방식을 시도하고 있습니다.

두 프로세스 간에 메모리를 공유하는 방법이 있습니까?

두 번째 프로세스는 더 이상 지원되지 않는 레거시 프로그램이므로 주입에서 정보를 가져옵니다.

내 생각은 거기에 일부 코드를 삽입하는 것입니다. 삽입된 프로그램에 전달하는 구조체에서 실행해야 하는 데이터가 있는 공유 메모리에 주소(또는 무엇이든)를 전달합니다.데이터를 얻은 후에는 삽입된 스레드 내부에 자체 변수를 채울 것입니다.

이것이 가능한가?어떻게?

코드를 높이 평가합니다.

편집하다:

명확하지 않은 것 같아서 설명하겠습니다.나는 주사하는 방법을 알고 있다.나는 이미 그것을 하고 있다.여기서 문제는 동적 데이터를 주입에 전달하는 것입니다.

도움이 되었습니까?

해결책

당신은 시도 할 수 있습니다 메모리 매핑 파일.

이것 좀 더 단계별 세부 사항을 제공합니다.

다른 팁

Windows는 ITS를 통해 공유 메모리를 지원하지만 파일 매핑 API, 당신은 다른 프로세스에 직접 공유 메모리 매핑을 쉽게 주입 할 수 없습니다. MapViewoffileEx 프로세스 논쟁을 취하지 않습니다.

그러나 다른 프로세스에서 메모리를 할당하여 일부 데이터를 주입 할 수 있습니다. VirtualAllocex 그리고 WriteProcessMemory. 당신이 사용한 핸들에 복사 해야하는 경우 Duplicathhandle, 그런 다음 호출하는 스터브를 주입하십시오 MapViewoffileEx, 다른 프로세스에서 공유 메모리 매핑을 설정할 수 있습니다. 어쨌든 코드를 주입하는 것처럼 들리기 때문에 이것은 당신에게 잘 작동해야합니다.

요약하려면 다음을 수행해야합니다.

  • 호출하여 익명 공유 메모리 세그먼트 핸들을 만듭니다 CreateEfilemapping hfile의 경우 invalid_handle_value와 lpname의 경우 null을 사용합니다.
  • 이 핸들을 대상 프로세스에 복사하십시오 Duplicathhandle
  • 코드를 사용하여 메모리를 할당하십시오 VirtualAllocex, flallocationtype = mem_commit | mem_reserve 및 flprotect = page_execute_readwrite
  • 스텁 코드를이 메모리에 사용하여 사용하십시오 WriteProcessMemory. 이 스터브는 어셈블러로 작성해야 할 것입니다. 여기 어딘가에 작성하여 Duplicathhandle에서 핸들을 전달하십시오.
  • 스텁을 사용하여 실행하십시오 Createremotethread. 그런 다음 스텁은 호출하기 위해 얻은 핸들을 사용해야합니다. MapViewoffileEx. 프로세스는 공통 공유 메모리 세그먼트를 갖습니다.

스터브가 외부 라이브러리를로드하면 조금 더 쉬울 수 있습니다. 즉,로드 리브러리를 호출하십시오 (Loadlibrary의 주소를 찾는 것은 독자에게 연습으로 남겨 둡니다). 이 경우 명명 된 공유 메모리를 사용하는 것은 Duplicathhandle과 함께 주위를 쫓는 것보다 간단 할 수 있습니다. MSDN 기사를 참조하십시오 CreateEfilemapping 자세한 내용은 본질적으로 HFILE에 대한 Invalid_handle_value를 통과하고 lpname의 이름을 전달하십시오.

편집하다: 문제가 실제 코드 주입이 아닌 데이터를 전달하기 때문에 몇 가지 옵션이 있습니다.

  1. 가변 크기의 공유 메모리를 사용하십시오. 스터브는 크기와 공유 메모리의 이름 또는 핸들을 가져옵니다. 교환 데이터 만 한 번만 필요한 경우 적절합니다. 공유 메모리 세그먼트의 크기는 생성 후에 쉽게 변경할 수 없습니다.
  2. a 명명 된 파이프. 스터브는 파이프의 이름 또는 손잡이를 가져옵니다. 그런 다음 적절한 프로토콜을 사용하여 가변 크기의 블록을 교환 할 수 있습니다 (예 : 길이에 대한 size_t를 작성한 다음 실제 메시지를 작성하십시오. 또는 pipe_type_message 및 pipe_readmode_message를 사용하고 Error_More_Data를보고 메시지가 끝나는 위치를 결정하십시오. 데이터를 여러 번 교환 해야하는 경우 적절합니다.

편집 2: 여기에 스텁을위한 핸들 또는 포인터 스토리지를 구현할 수있는 방법에 대한 스케치가 있습니다.

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

고정 이름 만 사용할 수도 있습니다.

공유 메모리를 사용할 수 있습니다

파이프(메모리용) 또는 직렬화(객체용)를 사용하려고 했습니까?파일을 사용하여 프로세스 간 메모리를 관리할 수 있습니다.소켓은 프로세스 간 통신에도 좋습니다.

메모리 매핑은 갈 길입니다. 영구 메모리 공간을 만들 필요조차 없습니다. 공유 공유가 종료 될 때 메모리 섹터가 범위를 벗어납니다. 다른 방법도 있습니다. 한 C 앱에서 다른 C 앱으로 데이터를 전달하는 빠르고 더러운 방법은 OS를 사용하는 것입니다. 명령 줄 유형에서 app1 | app2. 이로 인해 APP2가 APP1의 출력 대상이되거나 IOW APP1의 printf 명령이 APP2로 보냅니다 (이를 배관이라고 함).

사용해 볼 수 있습니다 boost.interprocess 두 프로세스간에 의사 소통합니다. 그러나 지원되는 소프트웨어가 아닌 이전에 기존의 코드를 주입하려면 @bdonlan의 방식으로 사용해야합니다. WriteProcessMemory.

Windows에 대해 이야기하고 있다면 주요로드 블록은 프로세스가 각각 고유 한 가상 주소 공간에 살고 있다는 것입니다. 불행히도 프로세스에서 프로세스까지 정상적인 메모리 주소를 전달할 수 없으며 기대할 수있는 결과를 얻을 수 없습니다. (반면에 실은 모두 같은 주소 공간에 살고 있기 때문에 나사산은 같은 방식으로 메모리를 볼 수 있습니다.)

그러나 Windows에는 공유 메모리 공간이있어 올바르게 관리해야합니다. 공유 메모리 공간에 공간을 할당하는 모든 프로세스는 해당 메모리를 명시 적으로 풀어야합니다. 이것은 로컬 메모리와 대조적이며, 프로세스가 죽을 때 다소 사라집니다.

보다 이 MSDN 샘플 기사 공유 메모리 공간을 사용하여 전 세계를 점령하는 방법에 대한 아이디어. ER, 레거시 소프트웨어와의 인터페이스. 또는 무엇이든 : 행운을 빕니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top