Честно говоря, совсем запутался Может ламерский вопрос, но все-таки... Как я понял, в экспортах ядра функции ZwCreateProcess/ZwCreateProcessEx нет (прямой вызов в драйвере обламывается, поскольку они экспортируются из ntdll.dll), соответственно MmGetSystemRoutineAddress возвращает NULL. Нужно программно в r0 определить адрес, куда они грузятся. Как? Пропарсить SST?
Если я правельно понял вопрос, то: Чтоб определить адрес ZwWriteVirtualMemory(она так же не экспортируемая) я делал так - Грузил с диска ntdll - получал ее RVA по имени - переходил к файловому смещению - прибовлял полученный адрес к базе ntdll - далее *(PULONG)((PUCHAR)(полученый адрес)+1) ее номер в SST - потом обращался к SST как к масиву используя номер и получал адрес http://wasm.ru/forum/viewtopic.php?id=24179 Если нужен оригинальный адрес нужно читать с диска ntoskrnl.exe
vanilly_cpp Да, я видел твой код, только мне нужен не номер, а адрес функции для ее вызова. Просто, есть ли более простой вариант? А то каждый байт на счету... ))
А что если тебе попробовать в r3 загрузить ntdll c диска, Код (Text): HMODULE hntdll_real = LoadLibrary("D:/temp/ntdll.dll"); VOID* hooked = GetProcAddress(hntdll, "ZwWriteVirtualMemory"); DWORD num = *(PULONG)((PUCHAR)hooked+1); потом передаешь num драйверу и в r0 Код (Text): KeServiceDescriptorTable.ServiceTableBase[num] и узнаешь адрес
...я думал над этим вариантом, но если бы все было так просто в r3 вылезать не могу... Ладно, значит, будем подгружать ntdll.dll...