Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
по-моему динамические переменные арт-мани не видит... ну или храни переменные в списках... в общем работай с указателями... тогда точно практически не найдет ничего....  smile

Автор: BaD_SeCt0R 23.9.2007, 15:55
Цитата(lukas @  23.9.2007,  15:37 Найти цитируемый пост)
в общем работай с указателями

А то их нельзя найти...

PS Snowy все разжевал дальше некуда.

Автор: Aprol 25.9.2007, 05:55
То есть нужно переделать переменные в динамические?
Код

var j:integer

поменять на 
Код

var j:integer^

Так?

Добавлено через 2 минуты и 9 секунд
Несколько переменных делать не вариант мне кажется, ведь артмоней и прочие найдут все значения...
А если еще делать хэш мд5, для нескольких переменных особо важных?

Автор: aktuba 25.9.2007, 07:03
Цитата

А если еще делать хэш мд5, для нескольких переменных особо важных? 


А как ты потом их значения достанешь????

Автор: Aprol 25.9.2007, 07:07
нет сделать нормальную переменную, а потом сравнивать её с хэшем. По идее значение этой переменной не должно меняться в ходе работы и задается только вначале.

Автор: Alexeis 25.9.2007, 09:23
Цитата(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,  11:41 Найти цитируемый пост)
если уж запустят твою прогу в отладчик, то и хеши тебе не помогут. 

  Боюсь что нужно и это судя по 
Цитата(Aprol @  21.9.2007,  11:04 Найти цитируемый пост)
можно изменить значения через Artmoney или другую софтину. 

Отладчик попадает в категорию "другая софтина."

Автор: W4FhLF 25.9.2007, 13:04
Цитата(Alexeis @  25.9.2007,  12:11 Найти цитируемый пост)
Отладчик попадает в категорию "другая софтина."


Насколько я понял, имелись ввиду только сканеры памяти. В таком случае, всё будет зависеть от уровня того, кто будет юзать "другую софтину". 

Автор: 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,  08:23 Найти цитируемый пост)
На счет объекта Пользователь, его что артмоней не возьмет?
В нём просто можно реализовать геттеры и сеттеры для прозрачного преобразования.
Также объект можно создать динамически, по принципу, который я описал выше.
Да. Артмани его не возьмёт, если проделать вышеуказанные мной операции.

Автор: Aprol 26.9.2007, 14:29
Цитата(Alexeis @ 26.9.2007,  09:20)
Ну можно сделать скажем набор чисел определяющие привелегии пользователя (например массив) и соответственно от этих чисел будет зависеть порядок некоторых операций, что в конечном итоге позволит или нет произвести операцию для которой нужны особые права. Можно смешать эти числа с другими данными о пользователе, а имя пользователя (его номер) использовать чисто для вывода на экран. Т.е. сверять пользователя не по имени, а по другим замаскированным под что-то полезное данным. Можно делать это даже в разное время. Типа сначала получить имя затем другие параметры. Желательно проверки на права осуществлять не в момент, когда нужно произвести операцию и не в момент, когда пользователь логинится , а некоторым образом между этими двумя событиями, таким образом при отладке нельзя будет определить момент, когда программа запретила что-то и исправить условный jne на безусловный jmp.

ТО есть нужно будет в базе вводить еще одно поле?
Ну оно у меня есть где обозначается тип пользователя.

Автор: Alexeis 26.9.2007, 15:58
Aprol, ну чтобы давать конкретные советы нужно уточнить, что и от кого нужно защитить? Т.е. если нужно разграничить права пользователей на доступ к информации, то это лучше делать на стороне сервера. Если нужно защитить данные на локальной машине от того что кто-то может запустить чужую машину и достать из нее информацию, то защита должна быть в программе. 
  Имя и тип пользователя это хорошо, когда эту информацию нельзя подменить.

Автор: Aprol 27.9.2007, 09:05
Alexeis,   конечно нужно и то и то.
Я сделал вывод: при каждой операции требующей определенные права, делается запрос на сервер и проверяется тип пользователя по его логину и id. Перед запросом программа-клиент проверяет верность этих данных, т.е. сверяет логин при авторизации с текущим.
правильно думаю?)))

Автор: Alexeis 27.9.2007, 09:24
  Если информацию нужно получить от сервера, то лучше во первых зашифровать, так чтобы расшифровать можно было только зная пароль, кроме этого при в запрос к данным должны входить имя пользователя и пароль, точнее не сами имя и пароль, а имя хеш сумма пароля, так как это не позволит злоумышленнику перехватывающему пакеты узнать из них пароль, а сервер может проверить пароль вычислив у себя хеш сумму и сравнить с присланной хеш суммой. Данные идущие с сервера нужно зашифровать так, чтобы ключ расшифровки можно было вычислить только имея пароль + от сессии к сессии ключ должен меняться, чтобы нельзя было расшифровать статистически. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)