Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szyfrowanie kodu

Ostatnio zmodyfikowano 2012-08-12 21:32
Autor Wiadomość
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 ? )
C/C++
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 )


 
P-62227
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.
P-62229
kubawal
» 2012-08-11 13:54:59
Ja bym ci polecił TEA - Tiny Encryption Algorithm
Na tej stronie masz przy okazji implementacje
Oto przykład wykorzystania(z inną implementacją):
C/C++
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 ); // rozmiar porcji danych
    const int kchar = 2 * nchar; // rozmiar klucza
   
    while( klucz.size() < kchar ) klucz += '0'; // dopełnianie klucza '0', by uzyskał rozmiar z kchar
   
    const unsigned long * key = reinterpret_cast < const unsigned long *>( klucz.data() ); // zamienianie klucza na tablicę liczb
    unsigned long outptr[ 2 ]; // wyjscie
    char inbuf[ nchar ]; // bufor, do którego będą tymczasowo zapisywane dane ze strumienia
    unsigned long * inptr = reinterpret_cast < unsigned long *>( inbuf ); // zamiana adresu inbuf na tablicę liczb
    int count = 0; // licznik danych w inbuf
   
    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 ] << ' ';
    }
   
}
P-62230
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 :)
P-62235
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.
P-62237
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".    
P-62239
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
C/C++
#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  ? 


P-62243
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...
P-62245
« 1 » 2
  Strona 1 z 2 Następna strona