Ostatnio przypomniał mi się start poradnik o zabezpieczaniu pluginu na ip i łamaniu tego zabezpieczenia
http://darkgl.pl/index.php/2012/12/29/zabezpieczanie-pluginu-na-ip-nic-prostszego-do-zlamania/ pomyślałem aby sposób nieco utrudnić.
Najpierw kod samego sprawdzania ip:
#include
new const serverIP[] = "5.9.89.100:27176";
public plugin_init() {
register_plugin("nazwa", "1.0", "autor");
new szIp[ 33 ];
get_user_ip( 0, szIp, charsmax( szIp ) );
if( !equal( szIp , serverIP ) ){
server_print("IP nieprawidlowe");
set_fail_state("Plugin nie dziala na tym serwerze.");
}
server_print("IP prawidlowe");
}
Prosty prawda ? Ale drzemie w nim moc , możemy go znacznie skomplikować poprzez get_pcvar/set_pcvar oraz zakodowanie stringów. To drugiej dalej w wpisie ;).
Kodowanie stringów
Początkowy kod:
#include
new const serverIP[] = "5.9.89.100:27176";
public plugin_init() {
register_plugin("nazwa", "1.0", "autor");
new szIp[ 33 ];
get_user_ip( 0, szIp, charsmax( szIp ) );
if( !equal( szIp , serverIP ) ){
server_print("IP nieprawidlowe");
set_fail_state("Plugin nie dziala na tym serwerze.");
}
server_print("IP prawidlowe");
}
Przeniesienie stringa do zmiennych:
#include
public plugin_init() {
register_plugin("nazwa", "1.0", "autor");
new serverIP[] = "5.9.89.100:27176";
new szIp[ 33 ];
get_user_ip( 0, szIp, charsmax( szIp ) );
if( !equal( szIp , serverIP ) ){
server_print("IP nieprawidlowe");
set_fail_state("Plugin nie dziala na tym serwerze.");
}
server_print("IP prawidlowe");
}
Rozbicie na litery:
new serverIP[ 22 ];
serverIP[ 1 ] = '1';
serverIP[ 2 ] = '4';
serverIP[ 3 ] = '4';
serverIP[ 4 ] = '.';
serverIP[ 5 ] = '7';
serverIP[ 6 ] = '6';
serverIP[ 7 ] = '.';
serverIP[ 8 ] = '1';
serverIP[ 9 ] = '1';
serverIP[ 10 ] = '0';
serverIP[ 11 ] = '.';
serverIP[ 12 ] = '2';
serverIP[ 13 ] = '3';
serverIP[ 14 ] = '1';
serverIP[ 15 ] = ':';
serverIP[ 16 ] = '2';
serverIP[ 17 ] = '7';
serverIP[ 18 ] = '0';
serverIP[ 19 ] = '1';
serverIP[ 20 ] = '5';
serverIP[ 21 ] = '^0';
Zmiana na integer i dodanie + 10
new serverIP[ 22 ];
serverIP[ 1 ] = 0x3B;
serverIP[ 2 ] = 0x3E;
serverIP[ 3 ] = 0x3E;
serverIP[ 4 ] = 0x38;
serverIP[ 5 ] = 0x41;
serverIP[ 6 ] = 0x40;
serverIP[ 7 ] = 0x38;
serverIP[ 8 ] = 0x3B;
serverIP[ 9 ] = 0x3B;
serverIP[ 10 ] = 0x3A;
serverIP[ 11 ] = 0x38;
serverIP[ 12 ] = 0x3C;
serverIP[ 13 ] = 0x3D;
serverIP[ 14 ] = 0x3B;
serverIP[ 15 ] = 0x44;
serverIP[ 16 ] = 0x3C;
serverIP[ 17 ] = 0x41;
serverIP[ 18 ] = 0x3A;
serverIP[ 19 ] = 0x3B;
serverIP[ 20 ] = 0x3F;
serverIP[ 21 ] = 0x0A;
Dekodowanie w locie:
new serverIP[ 22 ];
serverIP[ 1 ] = 0x3B;
serverIP[ 2 ] = 0x3E;
serverIP[ 3 ] = 0x3E;
serverIP[ 4 ] = 0x38;
serverIP[ 5 ] = 0x41;
serverIP[ 6 ] = 0x40;
serverIP[ 7 ] = 0x38;
serverIP[ 8 ] = 0x3B;
serverIP[ 9 ] = 0x3B;
serverIP[ 10 ] = 0x3A;
serverIP[ 11 ] = 0x38;
serverIP[ 12 ] = 0x3C;
serverIP[ 13 ] = 0x3D;
serverIP[ 14 ] = 0x3B;
serverIP[ 15 ] = 0x44;
serverIP[ 16 ] = 0x3C;
serverIP[ 17 ] = 0x41;
serverIP[ 18 ] = 0x3A;
serverIP[ 19 ] = 0x3B;
serverIP[ 20 ] = 0x3F;
serverIP[ 21 ] = 0x0A;
for( new iPosition = 0 ; iPosition < sizeof( serverIP ); iPosition++ ){
serverIP[ iPosition ] -= 0x0A;
}
Całość
#include
public plugin_init() {
register_plugin("nazwa", "1.0", "autor");
new szIp[ 33 ];
get_user_ip( 0, szIp, charsmax( szIp ) );
new serverIP[ 22 ];
serverIP[ 1 ] = 0x3B;
serverIP[ 2 ] = 0x3E;
serverIP[ 3 ] = 0x3E;
serverIP[ 4 ] = 0x38;
serverIP[ 5 ] = 0x41;
serverIP[ 6 ] = 0x40;
serverIP[ 7 ] = 0x38;
serverIP[ 8 ] = 0x3B;
serverIP[ 9 ] = 0x3B;
serverIP[ 10 ] = 0x3A;
serverIP[ 11 ] = 0x38;
serverIP[ 12 ] = 0x3C;
serverIP[ 13 ] = 0x3D;
serverIP[ 14 ] = 0x3B;
serverIP[ 15 ] = 0x44;
serverIP[ 16 ] = 0x3C;
serverIP[ 17 ] = 0x41;
serverIP[ 18 ] = 0x3A;
serverIP[ 19 ] = 0x3B;
serverIP[ 20 ] = 0x3F;
serverIP[ 21 ] = 0x0A;
for( new iPosition = 0 ; iPosition < sizeof( serverIP ); iPosition++ ){
serverIP[ iPosition ] -= 0x0A;
}
if( !equal( szIp , serverIP ) ){
server_print("IP nieprawidlowe");
set_fail_state("Plugin nie dziala na tym serwerze.");
}
server_print("IP prawidlowe");
}
Czy osoba znająca asemblera w stopniu dobrym, będzie potrafiła złamać to zabezpieczenie?
Tak
Tak, bo nadal slaba strona zostaje to…
if( !equal( szIp , serverIP ) ){
Mam nadzieję że niedługo pojawia się kolejne artykuły dotyczące skomplikowania tego
Nie można by było zrobić coś takiego, że sprawdza czy pierwszy znak ip to „x” za pomocą stringu, następny za pomocą liczby, następny za pomocą np liczba * 152 = „y”. Myśle że to by znacznie utrudniło złamanie takiego zabezpieczenia.
To co zrobisz to już leży w Twoim interesie jednak wszystko da się złamać