Доброго времени суток. Есть чужая программа Main.exe, мне необходимо написать алгоритм в своей программе MyProgram.exe, чтобы он смог засечь запись данных в область памяти программы Main.exe; Вносить изменения в код программы Main.exe я не могу, так как нет исходников, это чужая программа. Задача: Мне необходимо определить факт записи данных в область памяти программы Main.exe, а не защитить процесс от записи! - Моя программа MyProgram.exe будет запущена всё время на протяжение работы программы Main.exe, и делать какие-то манипуляции по обнаружению записи в чужой процесс. То есть, нужно что-то из этого: 1. Либо обнаруживать открытие чужого процесса. (OpenProcess) 2. Либо обнаруживать чтение чужого процесса. (ReadProcessMemory) 3. Либо обнаруживать запись в чужой процесс. (WriteProcessMemory) - Нужно что-то придумать по одному из этих методов - Без драйвера. P.S. -> Надеюсь на ваши советы, предложения. - Необходимо защитится от программ типа ArtMoney...
Вы предлагаете делать инжект во все процессы системы на функцию WriteProcessMemory? - Мне бы хотелось как-то без внедрения в чужие процессы.
Нужно в комплексе и желательно пониже (на уровне Nt/Zw). +Вариант - инжектнуцо в защищаемую прогу, поставить странице ноаксес и ловить/обрабатывать сепшны.
Вот по этому методу можно немного по подробнее. На сколько я понимаю вы имеете ввиду сделать инжект в Main.exe, и вызвать функции VirtualLock(), VirtualProtectEx() с атрибутом "PAGE_EXECUTE_READ"? - И поставить обработчик на исключение в том приложении?
ну вообще-то я имел ввиду PAGE_NOACCESS, но в вашем случае возможно и PAGE_EXECUTE_READ достаточно. а в общем - да, вы все правильно понимаете.
В лузермоде ваша задача не решается полноценно. Даже вычисление CRC и прочих сумм для сегмента кода не поможет решить задачу - если очень захотеть всегда можно найти способ пропатчить клиента так, чтобы ни одна защита не вякнула. Даже если сделаете отдельный поток для проверки целостности - его просто остановят Ну и вариации на тему...
Почему не решается? Задача "защитить от всего" и в кернелмоде не решается полностью. А задачу защитить процесс от "OpenProcess,WriteProcessMemory,ReadProcessMemory" можно решать в юзермоде, и достаточно эффективно. Наиболее оптимальным будет защитить себя от открытия процесса с помощью process token, достаточно блокировать PROCESS_VM_READ и PROCESS_VM_WRITE. Только для этого нужно изначально создавать процесс со специальным token, и защита не будет работать от кернелмода, хотя кернелмод всё равно не использует Read\WriteProcessMemory
не достаточно... как быть с дублированием хендла из самого процесса или из csrss.exe... вот это довольно весело, поддерживаю!)
Если для объекту процесса на старте присвоить security descriptor такой, что никто к этому процессу доступа иметь не может, то его нельзя будет открыть. Есть проблема, пользователь SYSTEM, админ или ещё какой пользователь который имеет SeDebugPrivilege будет игнорировать DACL для процесса (Могу тут врать, если вру поправьте). Однако если а) пользователь не сидит под админом б) у всех процессов суметь отнять SeDebugPrivilege каким либо образом, то описанной проблемы не будет. Точно так же нет проблемы клонирования хендла из csrss.exe т.к. он защищён подобным образом. Правда судя по первому посту человеку не подходит этот метод... Хотя если суметь отнять SeDebugPrivilege у "программ типа ArtMoney", то всё сработает.
щас проверил, для того чтобы дублировать хендл с PROCESS_ALL_ACCESS у процесса на том же Integrity Level под вистой SeDebugPrivilege не нужно... хендл csrss.exe не получить в любом случае, так как он на более высоком Integrity Level... насчет csrss.exe в xp - не помню, возможно потребуется SeDebugPrivilege... решение с залочиванием памяти мне как то гораздо больше нравится...