Недокументированная функция PsGetProcessImageFileName
CHAR* name;
int index;
name=(CHAR*)(proc); //proc - указатель на EPROCESS
strlen(name); //на строчке драйвер виснет
Debugger ругается:
Access violation - code c0000005 (!!! second chance !!!)
Driver!HookNtTerminateProcess+0x47:
f8bc4817 8a11 mov dl,byte ptr [ecx]
ну во первых у недокументированных функций такая специфика - вешать всё чужое. во-вторых, это access violation. чему равен name то?
name=(CHAR*)PsGetProcessImageFileName(proc); //proc - указатель на EPROCESS
1. "proc" равен NULL?
2. А не прекратил ли тот процесс включая ассоциированный с ним EPROCESS своего существования?
Цитата: Ramon
Единственное, что может быть интересно, так это то:
1. "proc" равен NULL?
1. "proc" равен NULL?
// функция-обработчик системного вызова NtTerminateProcess
NTSTATUS HookNtTerminateProcess(IN HANDLE ProcessHandle, IN NTSTATUS ExitStatus) {
NTSTATUS retstatus;
PVOID proc;
NTSTATUS status;
ULONG pid;
CHAR* name;
int index;
// получаем по хендлу указатель на объект процесса (EPROCESS)
status = ObReferenceObjectByHandle(ProcessHandle, 0, *PsProcessType, KernelMode, &proc, NULL);
(здесь несколько строк описал выше)
// вызываем NtTerminateProcess
retstatus = glRealNtTerminateProcess(ProcessHandle,ExitStatus);
return retstatus
}
Во всяком случае мне нужно достать поле ImageFileName из указателя proc в char*. Чтобы потом этот char* сравнивать с другим char*.
P.S.: Очень надеюсь на вашу помощь! Вопрос жизни и смерти:(
2. А отпустить объект посредством ObDereferenceObject?
Все, спасибо, Ramon, заработало, надо было и вправду проверять чему равен status