Ring0. Перезапись памяти в пользовательском АП
От: kr4nt  
Дата: 22.03.13 11:12
Оценка:
Здравствуйте!

Возникла проблема. 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]);
        }
    }
}
Re: Ring0. Перезапись памяти в пользовательском АП
От: Psybot  
Дата: 22.03.13 12:23
Оценка: +1
Здравствуйте, 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?

Проверяли, что находится в памяти, до записи в нее?
Re[2]: Ring0. Перезапись памяти в пользовательском АП
От: kr4nt  
Дата: 22.03.13 14:01
Оценка:
Спасибо, Psybot, вопрос решился использованием следующей последовательностью функций:


IoAllocateMdl
MmProbeAndLockPages
MmGetSystemAddressForMdlSafe
MmProtectMdlSystemAddress
MmUnlockPages
IoFreeMdl
Re[3]: Ring0. Перезапись памяти в пользовательском АП
От: kr4nt  
Дата: 22.03.13 15:51
Оценка:
Появилась проблема c приложением загружающим драйвер — намертво зависает после патча точки входа драйвера.
Тестировалось с разными драйверами, лоадерами.

Внедряемый шелл код аналогичен инструкциям:

__asm хоr eax, eax;
__asm dec, eax;
__asm ret;

Зависает в случае патча точки входа как в памяти при загрузке, так и в бинарнике — скорректировав CheckSum.

Я ожидаю что после внедрения шелл кода, драйвер выгрузится с кодом -1
С чем может быть связана данная проблема?
Re[4]: Ring0. Перезапись памяти в пользовательском АП
От: EreTIk EreTIk's Box
Дата: 22.03.13 16:15
Оценка: +1
K>Появилась проблема c приложением загружающим драйвер — намертво зависает после патча точки входа драйвера.
K>Тестировалось с разными драйверами, лоадерами.
K>Внедряемый шелл код аналогичен инструкциям:
K>__asm хоr eax, eax;
K>__asm dec, eax;
K>__asm ret;
K>Зависает в случае патча точки входа как в памяти при загрузке, так и в бинарнике — скорректировав CheckSum.

Каким же образом производился патчинг драйвера в памяти из приложения?

Раз идет речь о модификации драйвера, то видимо система 32-х разрядная (иначе — подпись). А раз так, что выход должен быть:
retn 8

Ведь точка входа в драйвер — sdtcall
Re[5]: Ring0. Перезапись памяти в пользовательском АП
От: EreTIk EreTIk's Box
Дата: 22.03.13 16:16
Оценка:
ETI>Ведь точка входа в драйвер — sdtcall
Тьфу, stdcall, конечно же)
Re[6]: Ring0. Перезапись памяти в пользовательском АП
От: kr4nt  
Дата: 23.03.13 02:48
Оценка:
Спасибо, EreTIk, проблему решило:

__asm ret 8;


Загрузка драйвера завершается кодом -1.


> Каким же образом производился патчинг драйвера в памяти из приложения?



Патчинг производится при загрузке образа драйвера, в MonitorLoadImageNotifyRoutine.

64х битные системы тоже актуальны, в тестовом режиме позволяют загружаться драйверам без подписи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.