| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Защита данных |
| Автор: Aprol 21.9.2007, 11:04 |
| Как можно защитить значения переменных от чужих рук? А то так получается что можно изменить значения через Artmoney или другую софтину. |
| Автор: Alexeis 21.9.2007, 11:51 |
| Никак. Винда разрешает это сделать, разве что взять под контроль всю систему и перехватывать все опасные функции, но это не дружественно. |
| Автор: Snowy 21.9.2007, 12:11 |
| 1. Продублировать в нескольких местах и регулярно синхронизировать их значения. 2. Хранить не в виде отображения. То есть, например в игре написано "здоровье 55%" а в переменной храни 255, и при отображении вычитай 200. 3. Конвертировать в другой вид. Например шифрованием, ксором или другим алгоритмом преобразования. 4. Не использовать статичное хранение в памяти. То есть выделить область памяти рэндомного размера, потом создать переменную и освободить память. Это лишит артемона возможности делать савы к найденому значению - адрес всегда разный. |
| Автор: Mikh@il 23.9.2007, 10:04 |
| а можешь значения хранить в картинках |
| Автор: lukas 23.9.2007, 15:37 |
| по-моему динамические переменные арт-мани не видит... ну или храни переменные в списках... в общем работай с указателями... тогда точно практически не найдет ничего.... |
| Автор: BaD_SeCt0R 23.9.2007, 15:55 |
А то их нельзя найти... PS Snowy все разжевал дальше некуда. |
| Автор: Aprol 25.9.2007, 05:55 | ||||
То есть нужно переделать переменные в динамические?
поменять на
Так? Добавлено через 2 минуты и 9 секунд Несколько переменных делать не вариант мне кажется, ведь артмоней и прочие найдут все значения... А если еще делать хэш мд5, для нескольких переменных особо важных? |
| Автор: aktuba 25.9.2007, 07:03 | ||
А как ты потом их значения достанешь???? |
| Автор: Aprol 25.9.2007, 07:07 |
| нет сделать нормальную переменную, а потом сравнивать её с хэшем. По идее значение этой переменной не должно меняться в ходе работы и задается только вначале. |
| Автор: Aprol 25.9.2007, 10:09 |
| Она берется из базы данных и обозначает номер пользователя... |
| Автор: Alexeis 25.9.2007, 10:30 |
| Тут может оказаться узким местом само получение, т.е. вызов внешней функции, но все это уже относиться скорее к отладке программами типа OllyDebug или просто к дизассемблированию с поиском нужной функции. Лучше чтобы это все в самой базе было уже зашифровано определенным образом, а затем нетривиальным образом сверялось. Т.е. не так чтобы if (UserNum = 007) then SetAllPrivileges(); |
| Автор: Snowy 25.9.2007, 10:34 |
| Ну так сделай её полем объекта "Пользователь" Сделай для неё сеттер и геттер, которые будут выполнять преобразования при назначении и получении. |
| Автор: W4FhLF 25.9.2007, 11:41 |
| Ксорь переменную на константу, которую генерируй для одного сеанса рандомно. Никто в жизни не угадает значения, если специально программу исследовать не будут, придумывать хеши какие-то, лишние телодвижения... если уж запустят твою прогу в отладчик, то и хеши тебе не помогут. |
| Автор: Alexeis 25.9.2007, 12:11 | ||
Боюсь что нужно и это судя по Отладчик попадает в категорию "другая софтина." |
| Автор: W4FhLF 25.9.2007, 13:04 |
Насколько я понял, имелись ввиду только сканеры памяти. В таком случае, всё будет зависеть от уровня того, кто будет юзать "другую софтину". |
| Автор: Aprol 26.9.2007, 08:23 |
| На счет объекта Пользователь, его что артмоней не возьмет? 2Alexeis , "Лучше чтобы это все в самой базе было уже зашифровано определенным образом, а затем нетривиальным образом сверялось. Т.е. не так чтобы if (UserNum = 007) then SetAllPrivileges(); " каждый раз делать запрос к базе на проверку привелегий? |
| Автор: Alexeis 26.9.2007, 09:20 |
| Ну можно сделать скажем набор чисел определяющие привелегии пользователя (например массив) и соответственно от этих чисел будет зависеть порядок некоторых операций, что в конечном итоге позволит или нет произвести операцию для которой нужны особые права. Можно смешать эти числа с другими данными о пользователе, а имя пользователя (его номер) использовать чисто для вывода на экран. Т.е. сверять пользователя не по имени, а по другим замаскированным под что-то полезное данным. Можно делать это даже в разное время. Типа сначала получить имя затем другие параметры. Желательно проверки на права осуществлять не в момент, когда нужно произвести операцию и не в момент, когда пользователь логинится , а некоторым образом между этими двумя событиями, таким образом при отладке нельзя будет определить момент, когда программа запретила что-то и исправить условный jne на безусловный jmp. |
| Автор: Snowy 26.9.2007, 09:54 |
| В нём просто можно реализовать геттеры и сеттеры для прозрачного преобразования. Также объект можно создать динамически, по принципу, который я описал выше. Да. Артмани его не возьмёт, если проделать вышеуказанные мной операции. |
| Автор: Aprol 26.9.2007, 14:29 | ||
ТО есть нужно будет в базе вводить еще одно поле? Ну оно у меня есть где обозначается тип пользователя. |
| Автор: Alexeis 26.9.2007, 15:58 |
| Aprol, ну чтобы давать конкретные советы нужно уточнить, что и от кого нужно защитить? Т.е. если нужно разграничить права пользователей на доступ к информации, то это лучше делать на стороне сервера. Если нужно защитить данные на локальной машине от того что кто-то может запустить чужую машину и достать из нее информацию, то защита должна быть в программе. Имя и тип пользователя это хорошо, когда эту информацию нельзя подменить. |
| Автор: Aprol 27.9.2007, 09:05 |
| Alexeis, конечно нужно и то и то. Я сделал вывод: при каждой операции требующей определенные права, делается запрос на сервер и проверяется тип пользователя по его логину и id. Перед запросом программа-клиент проверяет верность этих данных, т.е. сверяет логин при авторизации с текущим. правильно думаю?))) |
| Автор: Alexeis 27.9.2007, 09:24 |
| Если информацию нужно получить от сервера, то лучше во первых зашифровать, так чтобы расшифровать можно было только зная пароль, кроме этого при в запрос к данным должны входить имя пользователя и пароль, точнее не сами имя и пароль, а имя хеш сумма пароля, так как это не позволит злоумышленнику перехватывающему пакеты узнать из них пароль, а сервер может проверить пароль вычислив у себя хеш сумму и сравнить с присланной хеш суммой. Данные идущие с сервера нужно зашифровать так, чтобы ключ расшифровки можно было вычислить только имея пароль + от сессии к сессии ключ должен меняться, чтобы нельзя было расшифровать статистически. |