Здравствуйте, kr4nt, Вы писали:
То, что сразу бросается в глаза.
K>pCodeEntryPoint = PEFile_GetEntryPointOffset32(ImageInfo->ImageBase, TRUE);
Судя по названию, возвращается не указатель, а смещение.
K> mdl = MmCreateMdl(NULL, pCodeEntryPoint, 8);
Функция устарела. Лучше использовать IoAllocateMdl.
K> MmBuildMdlForNonPagedPool(mdl);
Вызов этой функции неуместен. Образ находится в страничной памяти
K> mdl->>MdlFlags = mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
BAD_BAD_BAD_HACK?
Проверяли, что находится в памяти, до записи в нее?
K>Появилась проблема c приложением загружающим драйвер — намертво зависает после патча точки входа драйвера.
K>Тестировалось с разными драйверами, лоадерами.
K>Внедряемый шелл код аналогичен инструкциям:
K>__asm хоr eax, eax;
K>__asm dec, eax;
K>__asm ret;
K>Зависает в случае патча точки входа как в памяти при загрузке, так и в бинарнике — скорректировав CheckSum.
Каким же образом производился патчинг
драйвера в памяти из
приложения?
Раз идет речь о модификации драйвера, то видимо система 32-х разрядная (иначе — подпись). А раз так, что выход должен быть:
retn 8
Ведь точка входа в драйвер —
sdtcall
Здравствуйте!
Возникла проблема. Win XP SP2 32 бита
Необходимо перезаписать байты по адресу переменной pCodeEntryPoint.
Все функции отрабатывают хорошо, но, как показывает сравнение, участок памяти не изменяется.
Что делаю не так?
PsSetLoadImageNotifyRoutine(MonitorLoadImageNotifyRoutine);
VOID MonitorLoadImageNotifyRoutine(IN PUNICODE_STRING FullImageName, IN HANDLE ProcessId, IN PIMAGE_INFO ImageInfo)
{
PMDL mdl;
PVOID MappedImTable;
PVOID pCodeEntryPoint;
UCHAR pNumBuf[16];
if(..)
return;
pCodeEntryPoint = PEFile_GetEntryPointOffset32(ImageInfo->ImageBase, TRUE);
if(pCodeEntryPoint)
{
memcpy(pNumBuf, pCodeEntryPoint, 8);
DbgPrint("ENTRY POINT1: %02X, %02X, %02X, %02X, %02X, %02X, %02X, %02X\n",
pNumBuf[0],
pNumBuf[1],
pNumBuf[2],
pNumBuf[3],
pNumBuf[4],
pNumBuf[5],
pNumBuf[6],
pNumBuf[7]);
mdl = MmCreateMdl(NULL, pCodeEntryPoint, 8);
if(mdl)
{
MmBuildMdlForNonPagedPool(mdl);
mdl->MdlFlags = mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
MappedImTable = MmMapLockedPages(mdl, KernelMode);
if(MappedImTable)
{
DbgPrint("OK\n");
memcpy(MappedImTable, pShellCode, 8);
MmUnmapLockedPages(MappedImTable, mdl);
}
IoFreeMdl(mdl);
pCodeEntryPoint = PEFile_GetEntryPointOffset32(ImageInfo->ImageBase, TRUE);
memcpy(pNumBuf, pCodeEntryPoint, 8);
DbgPrint("ENTRY POINT1: %02X, %02X, %02X, %02X, %02X, %02X, %02X, %02X\n",
pNumBuf[0],
pNumBuf[1],
pNumBuf[2],
pNumBuf[3],
pNumBuf[4],
pNumBuf[5],
pNumBuf[6],
pNumBuf[7]);
}
}
}
Спасибо, Psybot, вопрос решился использованием следующей последовательностью функций:
IoAllocateMdl
MmProbeAndLockPages
MmGetSystemAddressForMdlSafe
MmProtectMdlSystemAddress
MmUnlockPages
IoFreeMdl
Появилась проблема c приложением загружающим драйвер — намертво зависает после патча точки входа драйвера.
Тестировалось с разными драйверами, лоадерами.
Внедряемый шелл код аналогичен инструкциям:
__asm хоr eax, eax;
__asm dec, eax;
__asm ret;
Зависает в случае патча точки входа как в памяти при загрузке, так и в бинарнике — скорректировав CheckSum.
Я ожидаю что после внедрения шелл кода, драйвер выгрузится с кодом -1
С чем может быть связана данная проблема?
Спасибо, EreTIk, проблему решило:
__asm ret 8;
Загрузка драйвера завершается кодом -1.
> Каким же образом производился патчинг драйвера в памяти из приложения?
Патчинг производится при загрузке образа драйвера, в MonitorLoadImageNotifyRoutine.
64х битные системы тоже актуальны, в тестовом режиме позволяют загружаться драйверам без подписи.