я делаю перехват ZwOpenFile, запиываю в текстфайл имя того, что перехвачено и пытаюсь снова запустить етот перехваченный файл.
запускаю свою прогу, запускаю notepad.exe, создается текстовый файл там пишется "....notepad.exe", а потом вылезает ошибка "... notepad.exe Прараметр задан не верно". с другими Exe тоже самое,
подскажите что и где не так,
int WINAPI NewZwOpenFile(OUT PHANDLE FileHandle_o,IN ACCESS_MASK DesiredAccess_o,
IN POBJECT_ATTRIBUTES ObjectAttributes_o,
OUT PIO_STATUS_BLOCK IoStatusBlock_o,
IN ULONG ShareAccess_o,
IN ULONG OpenOptions_o)
{
WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)adr_ZwOpenFile,(void*)&old_ZwOpenFile, 6, &written_o);
PWCHAR wcsFileName = ObjectAttributes_o->pObjectName->Buffer;
char myString [256 + 1 ];
WideCharToMultiByte(CP_ACP, 0,wcsFileName, -1,myString, 256, NULL, NULL ) ;
if (strstr(myString,".exe")!= NULL)
{
strcat(myString,"!\r\n");
len_o = strlen(myString);
//------------------------------------------------------------------------------------------------------------
RtlInitUnicodeString(&fullFileName_o,L"\\??\\D:\\Example\\testfile_open.txt");
InitializeObjectAttributes(&oa_o,&fullFileName_o,OBJ_CASE_INSENSITIVE |
OBJ_KERNEL_HANDLE,NULL,NULL );
status_o = ZwCreateFile (&logo_fileHandle_o,GENERIC_WRITE | SYNCHRONIZE,&oa_o,&iostatus_temp,0,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_WRITE,
FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if( NT_SUCCESS(status_o))
{
LARGE_INTEGER Off = {0};
Off.LowPart = FILE_WRITE_TO_END_OF_FILE;
Off.HighPart = -1;
status_o = ZwWriteFile(logo_fileHandle_o, NULL,NULL,NULL,
&iostatus_temp,
myString, len_o,
&Off, NULL);
ZwClose(logo_fileHandle_o);
}
}
status_o = ZwOpenFile(FileHandle_o,DesiredAccess_o,ObjectAttributes_o,IoStatusBlock_o,
ShareAccess_o,
OpenOptions_o);
WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)adr_ZwOpenFile,(void*)&jump_ZwOpenFile,
6,&written_o);
return 0;
}
и это вызывается из функции
void InterceptFunctions(void)
{
adr_ZwOpenFile = (DWORD)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"ZwOpenFile");
jump_ZwOpenFile.instr_push = 0x68;
jump_ZwOpenFile.arg = (DWORD)&NewZwOpenFile;
jump_ZwOpenFile.instr_ret = 0xC3;
ReadProcessMemory(INVALID_HANDLE_VALUE, (void*)adr_ZwOpenFile,(void*)&old_ZwOpenFile, 6, &written_o);
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)adr_ZwOpenFile,(void*)&jump_ZwOpenFile, sizeof(jmp_far),&written_o);
}