2014-09-24 3 views
1

응용 프로그램 실행을 차단하는 미니 필터를 쓰고 있습니다. 미니 필터는 usermode 앱에 IRP_MJ_CREATE에 대한 파일 검사를 요청합니다. Usermode 응용 프로그램은 PE 파일 (.exe/.dll/etc) 실행 여부를 검사합니다.Minifilter : 알림 응용 프로그램 차단

현재 usermode 앱이 no라고하면 미니 필터는 액세스 거부 상태를 발생시키고 파일 열기를 취소합니다. 액세스 거부 반환 값을 발행 할 때 사용자의 관점에서,

문제이다 (예, FltCancelFileOpen 사용), 그들은 같은 시스템에서 메시지 상자를 얻을 것이다 : Windows cannot access the specified path or file. You may not have the appropriate permissions to access the item.

또 다른 예를 들어, 특정 차단하는 경우 로드되는 DLL을 다른 메시지 박스가 나타납니다

The application was unable to start correctly (0xc00000022)

내가 달성하고자하는 것은 여전히 ​​개방을 거부하지만, 메시지 상자를 표시하고 사용자 친화적 인 ERR은 내 자신의 통지를 가지고하는 것입니다 또는 앱이 차단되었음을 나타내는 메시지가 표시됩니다. 예는 Windows 8 smartscreen 기능과 유사합니다.이 기능은 액세스 거부 또는 유사한 메시지 상자없이 차단 된 exe를 실행할 때 사용자에게 알립니다. Windows 8 smart screen

어떻게하면됩니까?

답변

1

DLL 예제를 살펴 보겠습니다.

if (!LoadLibrary(szDllName)) 
{ 
    MessageBox("Application Error", ...); 
} 
else 
{ 
    DllMain = GetProcAddress("DllMain"); 
    DllMain(DLL_PROCESS_ATTACH); 

에 윈도우에 해당 코드 그래서 거기에 있기 때문에 당신이 코드의 첫 번째 분기가 될하지 않으려는 경우, 그 오류가 발생하면 DLL이로드 할 수 있습니다. 세 번째 옵션은 없습니다.

Windows 8 예제는 오해의 소지가 있습니다. Microsoft의 경우 물론 세 번째 옵션을 추가 할 수 있습니다.

[편집] 두 번째 생각에 FltCancelFileOpen을 사용하여 작업을 취소 했습니까? 그렇지 않다면 어떻게하셨습니까?

+0

통찰력을 가져 주셔서 감사합니다. 아마도 내가 찾고있는 것은 실행되기 전에 응용 프로그램을 종료시키는 것입니다. 예 : IIRC, PsSetImageNotify. –

+0

실행 가능한 계획처럼 들리지 않습니다. 해당 DLL의 로딩은 로더 잠금 상태에서 발생합니다. 로드가 성공하면 DllMain은 동일한 잠금 하에서 실행됩니다. 응용 프로그램을 종료하려면 DllMain이 완료 될 때까지 기다릴 수 있도록 로더 잠금도 필요합니다. (필자는 Windows가 요즘 런 어웨이 DllMains를 없앨 것이라고 생각하지만 순식간에 발생하지는 않습니다.) – MSalters

+0

여기에 그 실현 가능성에 대해서는 잘 모르겠다 고 생각합니다. 라이브러리를 열어 자신이 만든 다른 파일로 리디렉션 할 수 있습니다. 빈 DllMain. 이렇게하면 호출자가 성공적으로로드했다고 생각할 수 있습니다. 발신자가 다음에 시도하는 모든 항목에 여전히 문제가 있습니다. 즉, GetProcAddress가 실패합니다. GetProcAddress를 호출하기 전에 프로세스를 종료 할 수 있습니다. – lordjeb

관련 문제