Есть необходимость пропатчить пару байт в dll для ОДНОГО процесса. Поиском в InMemoryOrderModuleList нахожу базовый адрес а дальше... пока нет никаких мыслей. Ну почти никаких 1) Найти в IAT процесса функцию из целевой dll и полистать вверх до "MZ" (?) 2) (совсем уж дико) Внедрить код в UserMode который это сделает... 3) Разобраться в механизме copy on write (что предпочтительнее... только нормальной инфы не нашел, а декомпилить очень некогда).
KeStackAttachProcess получить PEB найти модуль в списке по имени ZwProtectVirtualMemory InterlockedExchange
Хм. Или я чего-то не пойму, или одно из двух Код поиска dll: Код (Text): PVOID KrnlPEGetDllAddressByName(PUNICODE_STRING pusName) { __try { PPEB pPeb = PsGetProcessPeb(IoGetCurrentProcess()); if(pPeb == NULL) return NULL; PLIST_ENTRY pNext = pPeb->Ldr->InMemoryOrderModuleList.Flink; while( pNext != &pPeb->Ldr->InMemoryOrderModuleList) { PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(pNext, LDR_DATA_TABLE_ENTRY, MemoryOrder); if( !RtlCompareUnicodeString(&pEntry->ModuleName, pusName, TRUE)) return pEntry->ModuleBaseAddress; pNext = pNext->Flink; } } __except(EXCEPTION_EXECUTE_HANDLER) {return NULL;} return NULL; } Права на запись я добыть могу легко, но проблема в том, что то что я сделаю применяется для всех процессов юзающих dll, а нужно только для одного. (нужно защитить свой труд в случае неуплаты за исходники, поэтому хочу оставить в системе маленькую уязвимость которую залатаю после оплаты )
В таком случае только ZwProtectVirtualMemory() тебя и спасёт. Адрес NtProtectVirtualMemory() можно взять из SDT, либо адрес MiProtectVirtualMemory() можно найти дизасмом.
Да, точно, сори (. Тогда еще можно попробовать так MmProbeAndLockPages MmMapLockedPagesSpecifyCache(MmCached)
Можно-то можно, и оно даже работать будет, но автору не подходит это, потому что тогда изменения коснутся всех процессов, и даже исполняемого файла не диске, ему этого не нужно. Здесь только ZwProtectVirtualMemory() будет работать корректно, но её нужно найти, как это сделать я уже написал.