Немного оффтопа
В том, что злоумышленнику достаточно будет только восстановить функцию для расшифровки. В Pawn это достаточно просто, на самом деле, т.к. используется совсем небольшой набор инструкций. В то же время, если хранить пароль внутри мода, будет больше возможностей спрятать его среди прочих данных. Или можно вообще составить пароль из других данных в моде (например, взять какие-нибудь случайные символы из строк, используемых под правила игры на сервере, сообщения об ошибках и т.п.) и этот пароль использовать для доступа к БД. Чтобы расшифровать такой пароль, злоумышленнику придётся не только восстановить функцию, но ещё и найти все те строки, которые используются для составления пароля.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Прибавляетем к паролю пару символов слева, по середине и в конец.
Используем Base64 (вот, кстати плагин)
И тогда мне будет очень, жаль "Тру хаскеров" которые будут это переводить. Алгоритм подстановки символов можно сделать через рандом.
А ещё можно одну часть пароля закодировать в Base64, а вторую часть например в sha512.
Потом скрепить строку и готово.
А кто чёрт возьми будет знать, что так сделано?
Последний раз редактировалось $continue$; 03.01.2016 в 17:30. Причина: upd
Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman
Тот, кто может дизассемблировать мод и восстановить шифрующую функцию. Есть такие люди.
Кстати говоря, с плагином даже проще, чем с кастомной функцией: восстанавливать нужно только код на Pawn и чем меньше такого кода, тем проще расшифровать пароль.
P.S.: Код не тестировался, используйте на свой страх и риск.PHP код:
new const DATABASE_CONFIG_FILE_NAME = "dbconf.txt";
#define DATABASE__USE_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "palladium"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else // !defined USE_MYSQL_CONFIG_FILE
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
public OnGameModeInit()
{
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
database_host = DATABASE__DEFAULT_HOST;
database_user = DATABASE__DEFAULT_USER;
database_name = DATABASE__DEFAULT_NAME;
database_pass = DATABASE__DEFAULT_PASSWORD;
return;
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "user", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "user", sizeof(database_pass) - 1);
fclose(config_file_handle);
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit
#endif // !defined USE_MYSQL_CONFIG_FILE
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Что тут не так могло пойти?PHP код:
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_host"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_name"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_pass"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_user"
[Anticheat]___Invisible Fly Hack
[Anticheat]____Weapon/Ammo Hack
[Function]______ResetPlayerWeaponSlot
[Function]_______FIX_SetPlayerAmmo
[ServerMod]______TDM | Zombie Apokalypse
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
PHP код:
//и куда его вписывать если он в инклуде как бы уже вписан
D:\Program\12\pawno12\mod.pwn(44747) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
PHP код:
//Поменял в самом моде
ConnectMySQL(database_host, database_user, database_name, database_pass);
//и выбило
error 035: argument type mismatch (argument 1)
//Вот как построен коннект
stock ConnectMySQL(host[], user[], db[], pass[])
{
connects = mysql_connect(host, user, db, pass);
if(mysql_errno() == 0) printf("Подключение к базе успешно");
else return printf("Подключиться к базе не удалось");
mysql_function_query(connects,"SET NAMES cp1251",false,"","");
mysql_function_query(connects,"set character_set_client=\'cp1251\'",false,"","");
mysql_function_query(connects,"set character_set_results=\'cp1251\'",false,"","");
mysql_function_query(connects,"set collation_connection=\'cp1251_general_ci\'",false,"","");
mysql_function_query(connects,"SELECT * FROM `bizz`",true,"LoadBizz","");
mysql_function_query(connects,"SELECT * FROM `House`",true,"LoadProperty","");
mysql_function_query(connects,"SELECT * FROM `meria`",true,"OnLoadKaznaCallback","");
mysql_function_query(connects,"SELECT * FROM `other`",true,"OnLoadMaterialsCallback","");
return 1;
}
[Anticheat]___Invisible Fly Hack
[Anticheat]____Weapon/Ammo Hack
[Function]______ResetPlayerWeaponSlot
[Function]_______FIX_SetPlayerAmmo
[ServerMod]______TDM | Zombie Apokalypse
В общем, вот как у меня вышло без перехвата
PHP код:
#define USE_MYSQL_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else
new const DATABASE_CONFIG_FILE_NAME[] = "dbconf.txt";
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
#endif
В коде DC достаточно недочётов. Сейчас попробую и версию с перехватом реализовать.PHP код:
public OnGameModeInit()
{
#if defined USE_MYSQL_CONFIG_FILE
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
strcat(database_host, DATABASE__DEFAULT_HOST, 64);
strcat(database_user, DATABASE__DEFAULT_USER, 16);
strcat(database_name, DATABASE__DEFAULT_NAME, 32);
strcat(database_pass, DATABASE__DEFAULT_PASSWORD, 32);
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "bd_name", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "bd_password", sizeof(database_pass) - 1);
fclose(config_file_handle);
strdel(database_host, strlen(database_host)-2, strlen(database_host));
strdel(database_user, strlen(database_user)-2, strlen(database_user));
strdel(database_name, strlen(database_name)-2, strlen(database_name));
strdel(database_pass, strlen(database_pass)-2, strlen(database_pass));
#endif
mysql_connect_ID = mysql_connect(database_host, database_user, database_name, database_pass);
return 1;
}
P.S. Только учти, что формат записей в конфиг-файле будет такой:
Для удобства работы можно перевести весь код под mxINI, дабы можно было к конфигурациям приписывать ключи, намекающие на предназначение этих конфигурацийPHP код:
localhost
root
sa-mp
- - - Добавлено - - -
Собственно, вот, вроде, рабочая версия перехвата
И вот скрин того, как должен выглядеть файл:PHP код:
#define USE_MYSQL_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "palladium"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else // !defined USE_MYSQL_CONFIG_FILE
new const DATABASE_CONFIG_FILE_NAME[] = "dbconf.txt";
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
public OnGameModeInit()
{
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
strcat(database_host, DATABASE__DEFAULT_HOST, 64);
strcat(database_user, DATABASE__DEFAULT_USER, 16);
strcat(database_name, DATABASE__DEFAULT_NAME, 32);
strcat(database_pass, DATABASE__DEFAULT_PASSWORD, 32);
return;
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "name", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "pass", sizeof(database_pass) - 1);
fclose(config_file_handle);
strdel(database_host, strlen(database_host)-2, strlen(database_host));
strdel(database_user, strlen(database_user)-2, strlen(database_user));
strdel(database_name, strlen(database_name)-2, strlen(database_name));
strdel(database_pass, strlen(database_pass)-2, strlen(database_pass));
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit
#endif // !defined USE_MYSQL_CONFIG_FILE
Если данные не указаны, под них обязательно должна быть пустая строка (даже если это последняя строка, как у меня, в случае с паролем)
Последний раз редактировалось DeimoS; 27.02.2016 в 00:34.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)