Dll +copy on write

Тема в разделе "WASM.NT.KERNEL", создана пользователем Wizard109, 8 окт 2009.

  1. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Есть необходимость пропатчить пару байт в dll для ОДНОГО процесса.
    Поиском в InMemoryOrderModuleList нахожу базовый адрес а дальше... пока нет никаких мыслей.

    Ну почти никаких :)
    1) Найти в IAT процесса функцию из целевой dll и полистать вверх до "MZ" (?)
    2) (совсем уж дико) Внедрить код в UserMode который это сделает...
    3) Разобраться в механизме copy on write (что предпочтительнее... только нормальной инфы не нашел, а декомпилить очень некогда).
     
  2. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    KeStackAttachProcess
    получить PEB
    найти модуль в списке по имени
    ZwProtectVirtualMemory
    InterlockedExchange
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не экспортируется, можно через MDL.
     
  4. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Хм. Или я чего-то не пойму, или одно из двух :)

    Код поиска dll:
    Код (Text):
    1. PVOID KrnlPEGetDllAddressByName(PUNICODE_STRING pusName)
    2. {
    3.     __try
    4.     {
    5.         PPEB    pPeb = PsGetProcessPeb(IoGetCurrentProcess());
    6.         if(pPeb == NULL) return NULL;
    7.  
    8.         PLIST_ENTRY pNext = pPeb->Ldr->InMemoryOrderModuleList.Flink;
    9.         while( pNext != &pPeb->Ldr->InMemoryOrderModuleList)
    10.         {
    11.             PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(pNext,
    12.                 LDR_DATA_TABLE_ENTRY, MemoryOrder);
    13.             if( !RtlCompareUnicodeString(&pEntry->ModuleName, pusName, TRUE))
    14.                 return pEntry->ModuleBaseAddress;
    15.             pNext = pNext->Flink;
    16.         }
    17.     }
    18.     __except(EXCEPTION_EXECUTE_HANDLER) {return NULL;}
    19.     return NULL;
    20. }
    Права на запись я добыть могу легко, но проблема в том, что то что я сделаю применяется для всех процессов юзающих dll, а нужно только для одного. (нужно защитить свой труд в случае неуплаты за исходники, поэтому хочу оставить в системе маленькую уязвимость которую залатаю после оплаты :) )
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В таком случае только ZwProtectVirtualMemory() тебя и спасёт. Адрес NtProtectVirtualMemory() можно взять из SDT, либо адрес MiProtectVirtualMemory() можно найти дизасмом.
     
  6. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    Да, точно, сори (.
    Тогда еще можно попробовать так

    MmProbeAndLockPages
    MmMapLockedPagesSpecifyCache(MmCached)
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Можно-то можно, и оно даже работать будет, но автору не подходит это, потому что тогда изменения коснутся всех процессов, и даже исполняемого файла не диске, ему этого не нужно. Здесь только ZwProtectVirtualMemory() будет работать корректно, но её нужно найти, как это сделать я уже написал.
     
  8. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Всем спасибо. Помогло. :)