1

inject_and_interpose 코드를 사용하여 삽입 및 삽입 할 수 있도록 실제로 실행되기 전에 새로 시작한 프로세스 (일반적인 닫힌 소스 사용자 응용 프로그램)의 PID를 가져와야합니다.새 프로세스가 실행되기 전에 PID를 가져 오는 방법은 무엇입니까?

명확하게 말하면, "빨리 알아 차려야합니다"보다 더 잘 수행해야합니다. 폴링을하거나 비동기식 알림을 수신 할 수 없습니다. 이는 해당 프로세스가 이미 몇 밀리 초 동안 실행되었음을 의미합니다. 나는 행동을 취한다.

단일 명령문이 실행되기 전에 주사 및 끼우기를 할 수있는 기회가 필요합니다.

특정 이름의 프로세스가 존재할 때 동기식으로 통지되는 백그라운드 프로세스를 작성하는 데 익숙합니다. 또한 대상 응용 프로그램을 실행하는 실행 프로그램을 작성하는 데 익숙합니다.

모든 솔루션은 최소 10.5 (Leopard)에서 10.8 (Mountain Lion) 미만의 64 비트 코드를 지원해야합니다.

이것은 고통스럽게 단순한 것으로 판명되었으므로 나는 먼저 가서 OS X에 익숙하다는 것을 인정합니다 :) 감사합니다!

+0

윈도우에서는 'CreateProcess'를 호출 할 때'CREATE_SUSPENDED' 플래그를 설정하여 일시 중단 된 상태에서 프로세스를 시작하면됩니다. 그런 다음 당신이 원할 때 까다로운 일을 다 끝내면 ResumeThread를 호출합니다. 어쩌면 이것이 올바른 방향으로 나아가는 데 도움이 될 것입니다. –

+0

프로세스 실행을 통제하지 않는 한 새로 선언 된 프로세스를 동 기적으로 가로 챌 수있는 방법이 없다는 것을 확신합니다. –

+0

@JonathonReinhart, 나는이 Windows를하는 데 관여했지만 아직 OS X에서는 운이 없다. 그래서 "올바른 방향을 찾고있다"는 내가 여기에서 시도하고있다.) 고마워! – bland328

답변

1

Linux에서이 작업을 수행하는 방법을 알고 있기 때문에 OSX에서 같은 (-ish) 일 수 있습니다.

먼저 프로세스를 복제하려면 fork()으로 전화하십시오. fork()의 리턴 값은 g 용자가 s 위 또는 하위인지를 나타냄니다. 부모 프로세스는 자식 프로세스의 PID를 가져오고 자식 프로세스는 0이됩니다.

그런 다음 자식은 exec()을 호출하여 실제로 새 실행 파일을 실행하기 시작합니다. fork 호출 이전에 생성 된 파이프를 사용하여 자식은 부모가 새 실행 파일을 실행하기 전에 필요한 모든 작업을 수행 할 수 있습니다.

pid_t pid = fork(); 
if (pid == -1) { 
    perror("fork"); 
    exit(1); 
} 
if (pid > 0) { 
    // I am the parent, and pid is the PID of the child process. 

    //TODO: If desired, somehow notify child to proceed with exec 
} 
else { 
    // I am the child. 

    //TODO: If desired, wait no notification from parent to continue 

    execl("path/to/executable", "executable", "arg1", NULL); 

    // Should never get here. 
    fprintf(stderr, "ERROR: execl failed!\n"); 
} 
+0

나는 따라하지 않는다, 조나단. 어떻게 이것이 실행되기 전에 "새로운 실행 파일"의 PID를 얻을 수 있습니까? 부모 프로세스가 fork()에서 자식 프로세스의 PID를 가져오고 exec() 프로세스가 자식 프로세스의 컨텍스트에서 실행되므로 해당 PID를 가질 것이라고 말하고 있습니까? – bland328

+0

네, 그렇습니다. 그것이 exec가 작동하는 방식입니다. * 현재 실행중인 프로세스 이미지를 대체합니다. –

+0

제 편집보기 : 몇 가지 예제 코드가 추가되었습니다. –