Я играл с CheatEngine и видел, что он может просматривать всю мою строку в приложении на стороне клиента. Интересно, что я должен сделать, чтобы заставить чит-движок не видеть мою строку во время выполнения. Я пробовал каждый подход, который я знал, но всякий раз, когда у меня есть строка, CheatEngine может ее просматривать. Я хотел бы предотвратить это, или, по крайней мере, CheatEngine визуализировать зашифрованные строки.Как я могу избежать мошенничества, чтобы увидеть мои строки во время выполнения
ответ
То, о чем вы просите, очень сложно выполнить правильно.
Многие укажут, что класс SecureString
может использоваться для сохранения сохраненных в памяти строк. Есть лот предостережений для использования безопасной строки.
- Необходимо, чтобы создать безопасно. Если у вас уже есть
string
, вы можете просто скопировать его в SecureString, перейдя по каждому символу. Это ничего не делает, потому что исходная строка все еще существует. Он может получить сбор мусора позже, но сбор мусора не означает, что память строки обнуляется. Вы можете использовать небезопасный код или платформу для вызова строки в среде CLR. Однако, если ваша строка интернирована, вы можете завершить свою программу. - Предположим, что вы надежно создали
SecureString
и убедитесь, что источник защищенной строки обнулен. Вы не можете действительно сделать много сSecureString
. Не многие API-интерфейсы могут что-либо с ними делать. В какой-то момент вам нужно преобразовать их обратно в обычную старую строку, использовать строку и нуль. Если базовый API делает что-либо небезопасно, как и сделать его копию, то вы не сможете узнать, где копировать. И за этот короткий период времени, когда в памяти существует простая старая строка, движок, который постоянно контролирует память вашего процесса, может захватить его.
Что я действительно за рулем здесь, так это то, что защита памяти процесса от кого-то, у кого есть права администратора на коробке, более или менее невозможна, и .NET Framework усложняет это. CLR предназначен для управления памятью для вас, которая может противоречить вашим потребностям явного управления памятью.
Спасибо @vcsjones! Ты дал мне направление. Я мог бы создать неуправляемую dll на C++ и обрабатывать выделение и освобождение памяти вручную (или обнулить строку) для некоторых случаев, например создание connectionstring. Не уверен, что это сработает. Но это может быть хороший подход. –
Попробуйте использовать SecureString класс!
Представляет собой текст, который следует хранить конфиденциальным. Текст зашифровывается для обеспечения конфиденциальности при использовании и удаляется из памяти компьютера, когда он больше не нужен. Этот класс не может быть унаследован.
Я, кажется, помню, что SecureString на самом деле не защищен - т. Е. Тривиально доступные инструменты проверки будут автоматически * получать дешифрованный текст - hawkeye и т. Д. –
Я пробовал это, но мне нужно преобразовать обратно в строку (например, для создания контура базы данных строка), и в этот момент CheatEngine видит это снова. –
@ Flávio Если вы «распоряжаетесь» своей строкой сразу после того, как вы ее использовали, я думаю, что движок чита будет иметь некоторую боль, чтобы найти его. –
Вы пытались использовать 'SecureString'? –
Помимо очевидного отсутствия исследовательских усилий, почему нисходящие и закрытые голоса? Я думаю, что это правильный и интересный вопрос. – CodeCaster
Использование «SecureString» возможно, но это очень сложно сделать. Я проверил много кода, который просто сделал это неправильно. Вы не можете просто магически защитить строку в памяти с ней - ей нужен безопасный источник. – vcsjones