유저레벨에서 어떤 프로세스가 실행되자마자 DLL을 Injection 하려면 보통 ...


1. 프로세스 실행을 탐지하기 위해 실행중인 모든 프로세스에 DLL을 Injection하여 CreateProcess 류의 api를 후킹

2. CreateProcess가 호출되어 프로세스가 생성된 후 return된 직후에 DLL을 Injection


이런 식으로 합니다. 그런데 전 지금...


1. 커널 드라이버에서 PsSetCreateProcessNotifyRoutineEx 를 통해 Callback을 등록

2. Callback이 호출되었을 때 Application에 통지하여 새로 실행된 프로세스에 DLL을 Injection


이렇게 하고 있는데요... 문제가 있습니다.


PsSetCreateProcessNotifyRoutineEx 콜백이 호출되었을 때 즉시 Dll을 Injection하면 실패하는 경우가 발생합니다. 정확히 분석해본 것은 아니지만 아마도 Callback된 시점이 대상 프로세스가 완전히 생성되기 전이라 그렇다고 보여집니다. Sleep(100) 정도 쉬어준 후에 Dll을 Injection하면 잘 되거든요. (경우에 따라서는... 탐색기에서 에러창이 뜰때도 있습니다. -_-;;)



문제는... 지금 저의 상황에서 Sleep(100)이 너무 길다는 거죠... 

후킹해야 할 api가 그 전에 호출되어버리면 말짱 꽝이거든요...

DLL을 Injection할 수 있는 시점이 언제인지... 그걸 탐지하기가 참 곤란하네요... 

너무 빠르면 DLL Injection이 실패하고... 너무 늦으면 버스가 떠나버린 후가 되고...


고수님들... 이럴 때 좋은 방법 없을까요?? ^^;;



Posted by kuaaan

댓글을 달아 주세요

  1. sharememory 2014.09.06 10:40 신고  댓글주소  수정/삭제  댓글쓰기

    프로세스 콜백이 아닌 이미지 콜백을 사용하시고 인젝션 대상 프로세스에서 ntdll.dll 이 로드될 때를 캐치한 후 LdrLoadDll 함수를 사용해 주시면 완벽하게 됩니다 ^^

    명절 잘 보내세요 ㅎㅎ~~

  2. techshare 2014.09.10 10:56 신고  댓글주소  수정/삭제  댓글쓰기

    두분 대화에 ^^ 궁금한 것이 있는데요. 그럼, NT Legacy 드라이버를 만들고 PsSetLoadImageNotifyRoutine을 이용해 콜백되는 함수에서 ntdll.dll을 구분해서 그것이 로드되면, 그 드라이버 문맥에서 LdrLoadDll 함수를 사용하면 되는 건가요? Notify 콜백이 passive 레벨로 되어 있다고 하는데 그 상태가 프로세스 문맥으로 전환된 상태라서 LdrLoadDll을 호출하면 (현재 콜백대상의) 프로세스에서 로드된다는 의미인지요? ^^



사랑합니다. 편안히 잠드소서