в общем, ставлю свой калбек на ImageLoadNotify Код (Text): VOID ImageLoadNotify(IN PUNICODE_STRING FullImageName,IN HANDLE ProcessId,IN PIMAGE_INFO ImageInfo) { if(r_wcsncmp((PWCHAR) FullImageName->Buffer,L"wininet.dll")) { DbgPrint("WININET FOUND"); if(NT_SUCCESS(WriteShell(ProcessId))) { DbgPrint("writeshell ok"); } } } затем... Код (Text): NTSTATUS WriteShell(IN HANDLE ProcessId) { HANDLE hProcess; CLIENT_ID ClientId; OBJECT_ATTRIBUTES ObjectAttributes; ULONG uPageSize = 1024,uShellSize; PVOID BaseAddress = NULL,ShellAddress = NULL; ClientId.UniqueProcess = ProcessId; ClientId.UniqueThread = 0; RtlZeroMemory(&ObjectAttributes,sizeof(OBJECT_ATTRIBUTES)); if(!NT_SUCCESS(ZwOpenProcess(&hProcess,PROCESS_DUP_HANDLE,&ObjectAttributes,&ClientId))) { DbgPrint("ZwOpenProcess - failed"); return STATUS_UNSUCCESSFUL; } if(!NT_SUCCESS(ZwAllocateVirtualMemory(hProcess,&BaseAddress,0,&uPageSize,MEM_COMMIT,PAGE_READWRITE))) { DbgPrint("ZwAllocateVirtualMemory - failed"); return STATUS_UNSUCCESSFUL; } DbgPrint("BaseAddress: %0.8X",BaseAddress); ShellAddress = &ShellCode; uShellSize = 10; if(!NT_SUCCESS(ZwWriteVirtualMemory(hProcess,BaseAddress,ShellAddress,uShellSize,0))) { DbgPrint("ZwWriteVirtualMemory - failed"); return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS; } вот вся трабла в том, что когда идет вызов ZwAllocateVirtualMemory у меня в ней "зависает", т.е. аналогично вечному лупу ) процесс, в котором выделяю память при этом 100% проца хавает.... и невозможно потом выгрузить дровину.... в чем грабли?
не в тему, но строки лучше сравнивать через RtlCompareUnicodeString, чем через wcscmp который из двух
у меня подобный код и подобная проблема. также виснет (а потом вылетает) на ZwAllocateVirtualMemory. agent007, нашел в чем трабла?
Stub протесть вначале код на Ринге 3, посмотри. З.Ы. Если по быстрому, то Код (Text): ZwOpenProcess(&hProcess,[b]PROCESS_DUP_HANDLE[/b],&ObjectAttributes,&ClientId) может PROCESS_VM_OPERATION + PROCESS_VM_READ +PROCESS_VM_WRITE Хотя в любом лсучае, это не причина лупа.
конкретно в данном моем случае я так и не нашел причину лупа. а вообще всю свою идеию реализовал по-другому
dead_body И PROCESS_DUP_HANDLE пробовал, и вообще кучу всего перебрал - всеравно глючит. Так вот может есть ограничение в данном случае на использование этой ф-ции? Т.е. когда пытаешься именно из колбэка данного типа вызвать эту ф-цию.
Stub вроде нет. Проверь свой код, на Ринге 3, без колббэка. Если будет работать, то тогда или софтайс ставь и смотри или ЛивКД. Я сколько функцией пользовался нормально.
dead_body В Ring3 код отлично работает (во всяком случае ничего не виснет ). Под сайсом в r0 и дебажил. --------------------- В инете нарыл, что эта ф-ция гонит у всех, когда она вызывается из данного вида коллбэков на этапе загрузки DLL'ок, которые идут после ntdll.dll и kernel32.dll. Как с этим можно бороться? --------------------- В общем в этом коллбэке вообще нельзя выделить память в процессе никаким известным мне образом (пытался и промапить IoAllocateMdl/MmProbeAndLockPages/MmMapLockedPagesSpecifyCache) - все приводит к одному и тому же результату.