Снятие дампа через механизмы межпроцессорного взаимодействия— это вчерашний день. Для борьбы с активными защитами хакеры внедряют код дампера непосредственно в "подопытный" процесс, что позволяет обойти как перехват API-функций, так и победить динамическую шифровку типа CopyMem.
Классический способ внедрения кода реализуется так: открываем процесс функцией OpenProcess, выделяем блок памяти вызовом VirtualAllocEx, копируем код дампера через WriteProcessMemory, а затем либо создаем удаленный поток функцией CreateRemoteThread (только на NT-подобных системах), либо изменяем регистр EIP в контексте чужого потока, обращаясь к SetThreadContext (действует на всех системах). Естественно, предыдущей EIP должен быть сохранен, а сам поток — остановлен.
Постойте! Но ведь это мало чем отличается от обычного межпроцессорного взаимодействия! Функции NtAllocateVirtualMemory/NtSetContextThread/NtCreateThread любая защита перехватит со смаком! (никакой ошибки тут нет, API-функция CreateRemoteThread в действительности представляет собой "обертку" вокруг ядерной функции NtCreateThread).
Хорошо, вот другой классический путь. Помещаем дампер в DLL и прописываем ее в HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs, в результате чего она будет отображаться на все процессы, какие только есть в системе и перед передачей управления на очередной запускаемый процесс первой получит управление наша DLL! К сожалению, об этой ветке знают не только протекторы, но и другие программы (антивирусы, персональные брандмауэры) и следят за ней. Наша запись может быть удалена еще до того, как дампер приступит к работе! Если же ему все-таки удастся получить управление, первое, что он должен сделать — выделить себе блок памяти внутри процесса, скопировать туда весь необходимый код и вернуть ветку AppInit_DLLs в исходное состояние. Поскольку, дамер получает управление еще до того, как защита начнет работать, она никак не сможет обнаружить, что здесь кто-то уже побывал.