formatyk Temat założony przez niniejszego użytkownika |
Szyfrowanie kodu » 2012-08-11 13:46:18 Witam Szukam pomocy odnośnie zabezpieczenia programu . (Dokładniej i tak mi się wydaje ,że mam na myśli szyfrowanie kodu źródłowego ) Jak się nie mylę przesyłane dane można ' przechwycić ' a program poddać deasemblacji W skrócie o programie : Program ma korzystać z loginu i hasła - dane te są zdefiniowane w kodzie Do zabezpieczenia przesyłanych danych program<>serwer myślę korzystać z SSH (Jeżeli się mylę to proszę o inne porady ...). Wracając do programu - Jak zabezpieczyć login oraz hasło bądź cały kod źródłowy ? Jeśli ktoś mógłby opisać taką operacje na szyfrowaniu ROT13 Szyfr chyba łatwy do złamania , jednak łatwiej będzie mi na nim zrozumieć działanie takiego szyfrowania W kursach znalazłem przykłady szyfrowania ROT13 i na ich podstawię mógłbym (?): Napisać dodatkowy program korzystający z ROT13 który szyfrował by dane do pliku "hasło.txt" W docelowym programie hasło było by pobierane z "hasło.txt" oraz odszyfrowane . W praktyce miało by to wyglądać tak : Program szyfrujący w zmiennej 'a' definiuje hasło . Poniżej implementacja ROT13 (chyba prawidłowo ? ) while( a = ~getchar() ) putchar( ~a - 1 /( ~( a | 32 ) / 13 * 2 - 11 ) * 13 );
Następnie zaszyfrowane hasło jest zapisywane do hasło.txt Program dla docelowych użytkowników : Pobranie danych z hasło.txt Przekazanie do zmiennej 'a' oraz ponowne użycie ROT13 odszyfruje hasło . Czy można zaszyfrować cały kod źródłowy programu (Gdy ktoś mógł opisać jak by takie szyfrowanie wyglądało w teorii ) |
|
m4tx |
» 2012-08-11 13:54:13 program poddać deasemblacji |
Tak, ale kod Assemblera jest na tyle nieczytelny, że raczej żaden człowiek go nie przeczyta i nie zrozumie bez komentarzy, zwłaszcza, jeśli mamy do czynienia z zaawansowanym programem. A dekompilacji do kodu C++ się wykonać nie da. |
|
kubawal |
» 2012-08-11 13:54:59 Ja bym ci polecił TEA - Tiny Encryption AlgorithmNa tej stronie masz przy okazji implementacje Oto przykład wykorzystania(z inną implementacją): void encipher( const unsigned long * const v, unsigned long * const w, const unsigned long * const k ) { unsigned long y = v[ 0 ]; unsigned long z = v[ 1 ]; unsigned long sum = 0; unsigned long delta = 0x9E3779B9; unsigned long n = 32; while( n-- > 0 ) { z -=( y << 4 ^ z >> 5 ) + z ^ sum + k[ sum & 3 ]; sum -= delta; y -=( z << 4 ^ y >> 5 ) + y ^ sum + k[ sum >> 11 & 3 ]; } w[ 0 ] = y; w[ 1 ] = z; }
void decipher( const unsigned long * const v, unsigned long * const w, const unsigned long * const k ) { unsigned long y = v[ 0 ]; unsigned long z = v[ 1 ]; unsigned long sum = 0xC6EF3720; unsigned long delta = 0x9E3779B9; unsigned long n = 32; while( n-- > 0 ) { z -=( y << 4 ^ y >> 5 ) + y ^ sum + k[ sum >> 11 & 3 ]; sum -= delta; y -=( z << 4 ^ z >> 5 ) + z ^ sum + k[ sum & 3 ]; } w[ 0 ] = y; w[ 1 ] = z; }
int odszyfruj_plik( string klucz, ifstream & wejscie, ofstream & wyjscie ) { const int nchar = 2 * sizeof( long ); const int kchar = 2 * nchar; while( klucz.size() < kchar ) klucz += '0'; const unsigned long * key = reinterpret_cast < const unsigned long *>( klucz.data() ); unsigned long outptr[ 2 ]; char inbuf[ nchar ]; unsigned long * inptr = reinterpret_cast < unsigned long *>( inbuf ); int count = 0; while( wejscie.get( inbuf[ count ] ) ) { wyjscie << hex; if( ++count == nchar ) { encipher( inptr, outptr, key ); wyjscie << setw( 8 ) << setfill( '0' ) << outptr[ 0 ] << ' ' << setw( 8 ) << setfill( '0' ) << outptr[ 1 ] << ' '; count = 0; } } if( count ) { while( count != nchar ) inbuf[ count ] = '0'; decipher( inptr, outptr, key ); wyjscie << outptr[ 0 ] << ' ' << outptr[ 1 ] << ' '; } }
|
|
Admixior |
» 2012-08-11 14:18:56 @m4tx: ale jak program będzie cenny to i znajdą się osoby które (jeżeli nie będzie skomplikowany sposób) to uda im się :D
Nie wiem na czy dobrze mówię ale ROT13 to prawie jak szyfr cezara (13 znaków do przodu w alfabecie) Może zamiast szyfrować hasło, zrobisz sobie coś takiego że trzymasz sumę kontrolną (obliczoną w wymyślony przez siebie sposób). I później będziesz porównywać ów 2 sumy czy są takie same lub czy zależność między nimi jest odpowiednia (czyli hasło jest dobre).
BTW. Jak kiedyś zrobiłem sobie taką klasę i funkcje która traktowała znak binarnie (po prostu bajt) np: 10111001
i miałem 2 zestawy znaków. Jeżeli jest 1 to losowało znak z pierwszego zestawu a jeżeli 2 to z drugiego. Prosty a trudno odczytać. //Dodałem też inne rzeczy jak np fake bity (które były całkowicie losowe tylko dla utrudnienia i wartość ich nie zmieniała kodu)
Przykład: Text: Witam Zestaw pierwszy: `1234567890-=[]\;',./qwertyuiopasdfghjklzxcvbnm Zestaw drugi: ~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>? Po zaszyfrowaniu: \.w|iJgXc>@5(=\YP|iHgkx>2%*+E,q|iHfkBb1%
Prosty i fajny sposób :) |
|
DejaVu |
» 2012-08-11 14:30:47 Jeżeli komercyjne projekty są crackowane to czemu uważasz, że jest sens poświęcać czas na szyfrowanie kodu? Nie zabezpieczysz aplikacji w żaden sposób przed reverse engineering. |
|
ADAMANTAN |
» 2012-08-11 15:11:42 Jakieś dwa lata temu, zajmując się programowaniem sam postawiłem sobie pytanie czy istnieje 100% skuteczne zabezpieczenie programu przed kopiowaniem, zmienianiem, deasemblowaniem itd. Wciągnąłem się w tematykę „Reverse Engineering” aż do teraz (jestem po jasnej stronie mocy :-) Każde zabezpieczenie programu da się złamać. Jeśli kod programu jest zaszyfrowany lub spakowany lub "zaciemniany" - też da się go złamać. Kwestia czasu. Dekompilację do kodu podobnego do C/C++ da się zrobić. Debuger/Disasembler IDA z pluginem Hex-Ray jak to piszą twórcy: "It converts executable programs into a human readable C-like pseudocode text". Widziałem to w działaniu i jestem pod wrażeniem. Jeśli chodzi o zabezpieczanie własnych, pisanych programów przed krakerami polecam świetną moim zdaniem na początek pozycję Helionu ( mimo że jest już trochę stara): http://helion.pl/ksiazki/bezpieczne-programowanie-aplikacje-hakeroodporne-jacek-ross,beprog.htm. Dodatkowo polecam blog i video casty Gynvaela Coldwinda na temat ogólnie pojętego Reverse Engineering-u. To wszystko uświadomiło mi, że nie ma skutecznych zabezpieczeń a tylko zabezpieczenia, które "przedłużają czas" potrzebny na ich złamanie. Nie chciałem w ten sposób Cię zniechęcić tylko uświadomić i zachęcić do własnych eksperymentów z twoimi własnymi zabezpieczeniami. Zapoznaj się z tą pozycją co wskazałem powyżej. Jeśli zastosujesz kilka różnych opisanych tam sztuczek (oczywiście indywidualnie zmienionych przez ciebie) to otrzymasz na pewno lepiej zabezpieczony program niż niejeden program firm "światowej sławy". |
|
formatyk Temat założony przez niniejszego użytkownika |
» 2012-08-11 15:54:35 @m4tx moja wiedza na temat c++ ogranicza się do pisania niewielkich aplikacji ( często w trakcie pisania wspomagam się kursami ) Więc nie wiem jak jest z łamaniem kodu w c++ (jednak niektórzy to robią i później dają taki program na torrenty ... ) Dzięki wszystkim za zainteresowanie Jednak c++ traktuje hobbistycznie .Jeżeli opublikuje coś publicznie to za darmo ( ewentualnie dobrowolne dotacje ) Obecnie opisywany program służy mi do poznawania c++ .W końcowej wersji login oraz hasło prawdopodobnie będą przechowywane w MySql (Po lepszym opanowaniu winsock ). Czytając o szyfrowaniu połączeń klient<>serwer trafiłem na szyfrowanie danych z pliku czy zmiennej . Być może nie będzie mi potrzebne całe to szyfrowanie kodu - Jednak ciekawość ; ) W googlach znalazłem troche gotowych algorytmów oraz przykładów kodowania ciągu znaków To jest dla mnie jasne #include <cstdio> #include <iostream>
using namespace std;
void _xor( char * s, char xor_key ) { for( int i = 0; s[ i ] != NULL; i++ ) s[ i ] = s[ i ] ^ xor_key; }
int main() { char s[] = "SzyfrujMnie"; cout << "Dane do zaszyfrowania: \t" << s << endl; _xor( s, 12 ); cout << "Dane zaszyfrowane:\t" << s << endl; _xor( s, 12 ); cout << "Dane odszyfrowane:\t" << s << endl; return 0; }
Pobrany ciąg znaków 'SzyfrujMnie' jest szyfrowany i odszyfrowany Zastanawiam się czy i jak można zaszyfrować cały kod ? Jak teoretycznie wygląda działanie takiego programu ? |
|
m4tx |
» 2012-08-11 16:02:57 Zastanawiam się czy i jak można zaszyfrować cały kod ? |
Widziałem już coś takiego, że ktoś sobie pisał kod w asmie, kompilował, a potem skompilowany kod maszynowy wrzucał do .cpp jako tablica charów. Potem bodajże program skakał pod adres, gdzie ta tablica jest, co powodowało wykonanie zawartego w niej kodu. Prawdopodobnie można by było również skompilować kod nie asma, a C++, zaszyfrować go, a w runtimie go odszyfrowywać, ale... czy ma to sens? :P Jeśli chodzi o ten program, o którym pisałem, to był to program do uzyskania praw roota w Linuksie bez podawania hasła roota (exploit, na nowych kernelach Linuksa już nie działa). Nie pamiętam już jednak, jak się on zwał. EDIT: A, już wiem. Program ten to mempodipper; jest to program open-source, można sobie podejrzeć. EDIT2: A, jednak nie. mempodipper jednak uruchamia kod asma za pomocą innego programu... |
|
« 1 » 2 |