Jak ukryć ciąg znaków w kodzie binarnym?

Czasami warto ukryć łańcuch znaków z pliku binarnego (wykonywalnego). Na przykład sensowne jest ukrywanie kluczy szyfrowania przed plikami binarnymi.

Kiedy mówię "Ukryj", mam na myśli utrudnianie znalezienia ciągów w skompilowanym pliku binarnym.

Na przykład ten kod:

const char* encryptionKey = "My strong encryption key";
// Using the key

Po kompilacji tworzy plik wykonywalny z następującym w jego sekcji danych:

4D 79 20 73 74 72 6F 6E-67 20 65 6E 63 72 79 70   |My strong encryp|
74 69 6F 6E 20 6B 65 79                           |tion key        |

Możesz zobaczyć, że nasz sekretny ciąg można łatwo znaleźć i / lub zmodyfikować.

I could hide the string ...

char encryptionKey[30];
int n = 0;
encryptionKey[n++] = 'M';
encryptionKey[n++] = 'y';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 's';
encryptionKey[n++] = 't';
encryptionKey[n++] = 'r';
encryptionKey[n++] = 'o';
encryptionKey[n++] = 'n';
encryptionKey[n++] = 'g';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 'e';
encryptionKey[n++] = 'n';
encryptionKey[n++] = 'c';
encryptionKey[n++] = 'r';
encryptionKey[n++] = 'y';
encryptionKey[n++] = 'p';
encryptionKey[n++] = 't';
encryptionKey[n++] = 'i';
encryptionKey[n++] = 'o';
encryptionKey[n++] = 'n';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 'k';
encryptionKey[n++] = 'e';
encryptionKey[n++] = 'y';
... Ale to nie jest miła metoda. Jakieś lepsze pomysły?

PS: wiem, że samo ukrywanie tajemnic nie działa przeciwko zdeterminowanemu napastnikowi, ale to o wiele lepsze niż nic ...

Wiem też o szyfrowaniu asymetrycznym, ale w tym przypadku jest to niedopuszczalne. Refaktoryzuję istniejącą aplikację, która używa szyfrowania Blowfish i przekazuje zaszyfrowane dane do serwera (serwer odszyfruje dane za pomocą tego samego klucza).

I nie mogę zmienić algorytm szyfrowania, ponieważ muszę zapewnić wsteczną kompatybilność. Nie mogę nawet zmienić klucza szyfrowania.

Author: Léo Lam, 2009-08-31

20 answers

Jak zaznaczono w komentarzu do odpowiedzi pavium , masz dwa wyjścia:

  • zabezpiecz klucz
  • zabezpiecz algorytm deszyfrowania

Niestety, jeśli musisz uciekać się do osadzania zarówno klucza, jak i algorytmu w kodzie, żadne z nich nie jest naprawdę tajne, więc pozostajesz z (znacznie słabszą) alternatywą security through obscurity. Innymi słowy, jak wspomniałeś, potrzebujesz sprytnego sposobu, aby ukryć jedno lub oba w swoim wnętrzu wykonywalny.

Oto kilka opcji, choć musisz pamiętać, że żadna z nich nie jest naprawdę bezpieczna zgodnie z najlepszymi praktykami kryptograficznymi, a każda z nich ma swoje wady: {]}

  1. Ukryj swój klucz jako ciąg znaków, który normalnie pojawiałby się w kodzie. przykładem może być ciąg formatujący printf(), który zwykle zawiera liczby, litery i znaki interpunkcyjne.
  2. Hash niektóre lub wszystkie segmenty kodu lub danych przy starcie i użyj tego jako klucza. (Musisz być trochę sprytny, aby upewnić się, że klucz nie zmieni się nieoczekiwanie!) Ma to potencjalnie pożądany efekt uboczny weryfikacji zaszyfrowanej części kodu za każdym razem, gdy jest uruchamiany.
  3. Wygeneruj klucz w czasie wykonywania z czegoś, co jest unikalne (i stałe) w systemie, na przykład przez haszowanie adresu MAC karty sieciowej.
  4. Utwórz klucz wybierając bajty z innych danych. jeśli masz dane statyczne lub globalne, niezależnie od typu (int, char, itd.), pobieraj bajt z każdej zmiennej po jej zainicjowaniu (oczywiście do niezerowej wartości) i zanim się zmieni.

Daj nam znać, jak rozwiązać problem!

Edit: skomentowałeś, że refaktorujesz istniejący kod, więc zakładam, że sam nie możesz wybrać klucza. W takim przypadku wykonaj 2-etapowy proces: użyj jednej z powyższych metod, aby Zaszyfruj sam klucz, a następnie użyj tego klucza, aby odszyfrować dane użytkowników.

 44
Author: Adam Liss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:18

Przepraszam za długą odpowiedź.

Twoje odpowiedzi są absolutnie poprawne, ale pytanie brzmiało, jak ukryć string i zrobić to ładnie.

Zrobiłem to w taki sposób:

#include "HideString.h"

DEFINE_HIDDEN_STRING(EncryptionKey, 0x7f, ('M')('y')(' ')('s')('t')('r')('o')('n')('g')(' ')('e')('n')('c')('r')('y')('p')('t')('i')('o')('n')(' ')('k')('e')('y'))
DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))

int main()
{
    std::cout << GetEncryptionKey() << std::endl;
    std::cout << GetEncryptionKey2() << std::endl;

    return 0;
}

HideString.h:

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/enum.hpp>

#define CRYPT_MACRO(r, d, i, elem) ( elem ^ ( d - i ) )

#define DEFINE_HIDDEN_STRING(NAME, SEED, SEQ)\
static const char* BOOST_PP_CAT(Get, NAME)()\
{\
    static char data[] = {\
        BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)),\
        '\0'\
    };\
\
    static bool isEncrypted = true;\
    if ( isEncrypted )\
    {\
        for (unsigned i = 0; i < ( sizeof(data) / sizeof(data[0]) ) - 1; ++i)\
        {\
            data[i] = CRYPT_MACRO(_, SEED, i, data[i]);\
        }\
\
        isEncrypted = false;\
    }\
\
    return data;\
}

Najbardziej skomplikowana linia w HideString.h jest:

BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ))

Pozwól mi wyjaśnić kwestię. Dla kodu:

DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))

BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)
Wygeneruj sekwencję:
( 'T'  ^ ( 0x27 - 0 ) ) ( 'e'  ^ ( 0x27 - 1 ) ) ( 's'  ^ ( 0x27 - 2 ) ) ( 't'  ^ ( 0x27 - 3 ) )

BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ))
Wygeneruj:
'T' ^ ( 0x27 - 0 ), 'e' ^ ( 0x27 - 1 ), 's' ^ ( 0x27 - 2 ), 't' ^ ( 0x27 - 3 )

I wreszcie

DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))
Wygeneruj:
static const char* GetEncryptionKey2()
{
    static char data[] = {
        'T' ^ ( 0x27 - 0 ), 'e' ^ ( 0x27 - 1 ), 's' ^ ( 0x27 - 2 ), 't' ^ ( 0x27 - 3 ),
        '\0'
    };
    static bool isEncrypted = true;
    if ( isEncrypted )
    {
        for (unsigned i = 0; i < ( sizeof(data) / sizeof(data[0]) ) - 1; ++i)
        {
            data[i] = ( data[i] ^ ( 0x27 - i ) );
        }
        isEncrypted = false;
    }
    return data;
}

Dane dla "Mój mocny klucz szyfrujący" wygląda następująco:

0x00B0200C  32 07 5d 0f 0f 08 16 16 10 56 10 1a 10 00 08  2.]......V.....
0x00B0201B  00 1b 07 02 02 4b 01 0c 11 00 00 00 00 00 00  .....K.........

Dziękuję bardzo za odpowiedzi!

 48
Author: Dmitriy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 01:44:01
  1. Post it as a code golf problem
  2. poczekaj na rozwiązanie napisane w J
  3. osadzenie interpretera J w aplikacji
 16
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 22:44:01

Ukrywanie haseł w kodzie jest zabezpieczeniem przez zaciemnienie. Jest to szkodliwe, ponieważ sprawia, że myślisz, że masz jakiś poziom ochrony, podczas gdy w rzeczywistości masz bardzo mało. Jeśli coś jest warte zabezpieczenia, warto zabezpieczyć je właściwie.

PS: wiem, że to nie działa przeciwko prawdziwemu hakerowi, ale to dużo lepsze to niż nic...

Właściwie w wielu sytuacjach nie ma nic lepszego niż słabe zabezpieczenia. Przynajmniej wiesz dokładnie, na czym stoisz. Nie potrzebujesz być "prawdziwym hakerem", aby obejść osadzone hasło ...

EDIT: odpowiadając na ten komentarz:

Wiem o parach kluczy, ale to nie dopuszczalne w tym przypadku. I refaktoryzacja istniejących aplikacji, które wykorzystują Szyfrowanie Blowfish. Zaszyfrowane dane przekazywane do serwera i deszyfrowanie serwera data. Nie mogę zmienić ecryption algorytmu, ponieważ powinienem zapewnić kompatybilność wsteczna.

Jeśli w ogóle zależy ci na bezpieczeństwie, utrzymuj kompatybilność jest naprawdę złym powodem, aby pozostawić siebie podatnym na ataki dzięki wbudowanym hasłom. Dobrze jest zerwać wsteczną kompatybilność z niezabezpieczonym schematem zabezpieczeń.

To tak, jak wtedy, gdy dzieci ulicy odkrywają, że zostawiasz klucz do drzwi pod wycieraczką, ale ciągle to robisz, ponieważ dziadek oczekuje, że go tam znajdziesz.

 11
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 09:56:00

Twój przykład w ogóle nie ukrywa ciągu znaków; łańcuch jest nadal prezentowany jako seria znaków w wyjściu.

Istnieje wiele sposobów zaciemniania ciągów. Istnieje prosty Cypher podstawienia , lub możesz wykonać operację matematyczną na każdym znaku (na przykład XOR), gdzie wynik jest przekazywany do następnego znaku operacji, itp., itd.

Celem byłoby uzyskanie danych, które nie wyglądają jak ciąg znaków, więc na przykład, jeśli pracujesz w większości zachodnich języków, większość wartości postaci będzie w zakresie 32-127 - więc twoim celem byłoby, aby operacja głównie umieścić je głównie out z tego zakresu, więc nie zwracają uwagi.

 8
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 11:02:11

Jest to tak bezpieczne, jak pozostawienie odblokowanego roweru w Amsterdamie, w Holandii, w pobliżu Dworca Centralnego. (Blink, and it ' s gone!)

Jeśli próbujesz dodać zabezpieczenia do swojej aplikacji, jesteś skazany na niepowodzenie od samego początku, ponieważ każdy schemat ochrony zawiedzie. Wszystko, co możesz zrobić, to sprawić, że haker znajdzie potrzebne informacje. Jeszcze kilka sztuczek:

*) upewnij się, że łańcuch jest zapisany jako UTF-16 w Twoim pliku binarnym.

*) Dodawanie liczb i specjalnych znaki do łańcucha.

*) użyj tablicy 32-bitowych liczb całkowitych zamiast ciągu! Konwertuj każdy z nich na łańcuch i połącz je wszystkie.

*) używaj GUID, przechowuj go jako binarny i przekonwertuj na ciąg znaków do użycia.

A jeśli naprawdę potrzebujesz wstępnie zdefiniowanego tekstu, zaszyfruj go i zapisz zaszyfrowaną wartość w swoim pliku binarnym. Odszyfruj go w trybie runtime, gdzie klucz do odszyfrowania jest jedną z opcji, o których wspomniałem wcześniej.

Czy zdajesz sobie sprawę, że hakerzy będą mieli tendencję do złamania twojego zastosowanie w inny sposób niż ten. Nawet ekspert od kryptografii nie będzie w stanie utrzymać czegoś bezpiecznego. Ogólnie rzecz biorąc, jedyną rzeczą, która cię chroni, jest zysk, jaki haker może uzyskać z hakowania Twojego kodu, w porównaniu do kosztów jego hakowania. (Koszty te często byłyby po prostu dużo czasu, ale jeśli hakowanie aplikacji zajmuje tydzień i tylko 2 dni, aby zhakować coś innego, coś innego jest bardziej prawdopodobne, aby zostać zaatakowanym.)


Odpowiedz na komentarz: UTF-16 to dwa bajty na znak, przez co trudniejszy do rozpoznania dla użytkowników, którzy patrzą na zrzut binarny, po prostu dlatego, że między każdą literą jest dodatkowy bajt. Ale wciąż widzisz te słowa. UTF-32 byłby nawet lepszy, ponieważ dodaje więcej przestrzeni między literami. Można również skompresować tekst, zmieniając go na schemat 6-bitowy na znak. Co 4 znaki będą następnie zwarte do trzech cyfr. Ale to ograniczyłoby Cię do 2x26 liter, 10 cyfr i być może spacji i kropki, aby uzyskać na 64 znaków.

Użycie GUID jest praktyczne, jeśli przechowujesz GUID w formacie binarnym, a nie tekstowym. GUID ma długość 16 bajtów i może być generowany losowo. Dlatego trudno odgadnąć identyfikator GUID, który jest używany jako hasło. Ale jeśli nadal musisz wysłać zwykły tekst, GUID może być przekonwertowany na reprezentację łańcucha znaków, aby był czymś w stylu "3F2504E0-4f89-11D3-9A0C-0305e82c3301". (Lub Base64-zakodowany jako " 7QDBkvCA1+B9K / U0vrQx1A==".) Ale użytkownicy nie zobaczą żadnego prostego tekst w kodzie, tylko jakieś pozornie przypadkowe dane. Nie wszystkie bajty w GUID są jednak losowe. W GUID jest ukryty numer wersji. Użycie identyfikatora GUID nie jest jednak najlepszą opcją do celów kryptograficznych. Jest obliczany na podstawie adresu MAC lub pseudolosowej liczby, dzięki czemu jest rozsądnie przewidywalny. Mimo to jest łatwy do tworzenia i łatwy do przechowywania, konwersji i użytkowania. Tworzenie czegoś dłużej nie wnosi większej wartości, ponieważ haker po prostu próbuje znaleźć inne sztuczki, aby złamać Ochrona. To tylko pytanie o to, jak chętni są zainwestować więcej czasu w analizę plików binarnych.

Ogólnie rzecz biorąc, najważniejszą rzeczą, która zapewnia bezpieczeństwo aplikacji, jest liczba osób, które są nią zainteresowane. Jeśli nikt nie dba o aplikacji wtedy nikt nie będzie zawracać sobie głowy, aby go włamać albo. Gdy jesteś najlepszym produktem z 500 milionami użytkowników, Twoja aplikacja zostanie pęknięta w ciągu godziny.

 7
Author: Wim ten Brink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 13:59:53

Byłem kiedyś w równie niezręcznej sytuacji. Miałem dane, które musiały być w binarnym, ale nie w zwykłym tekście. Moim rozwiązaniem było szyfrowanie danych za pomocą bardzo prostego schematu, który sprawił, że wyglądało to jak reszta programu. Zaszyfrowałem go pisząc program, który wziął ciąg znaków, przekonwertował wszystkie znaki na kod ASCII (wyściełany zerami w razie potrzeby, aby uzyskać trzycyfrowy numer), a następnie dodał losową cyfrę na początku i na końcu 3-cyfrowego kodu. Tak więc każda postać łańcuch był reprezentowany przez 5 znaków (wszystkie liczby)w zaszyfrowanym łańcuchu. Wkleiłem ten ciąg do aplikacji jako stałą, a następnie, gdy potrzebowałem go użyć, odszyfrowałem i zapisałem wynik w zmiennej wystarczająco długo, aby zrobić to, co musiałem.

Więc aby użyć Twojego przykładu, "mój silny klucz szyfrujący" staje się "207719121310329211541116181145111157110071030703283101101109309926114151216611289116161056811109110470321510787101511213". Wtedy, gdy potrzebujesz swojego klucz szyfrujący, odszyfrować go, ale cofnąć proces.

Na pewno nie jest kuloodporny, ale nie celowałem w to.

 4
Author: Corin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 22:47:38

Technologia szyfrowania jest wystarczająco silna, aby zabezpieczyć ważne dane Bez ukrywania ich w pliku binarnym.

A może twój pomysł na użycie pliku binarnego do ukrycia faktu, że coś jest ukryte?

To by się nazywało steganografia.

 3
Author: pavium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 11:01:51

To aplikacja klient-serwer! Nie przechowuj go w samym kliencie, to miejsce, w którym hakerzy będą oczywiście szukać. Zamiast tego dodaj (tylko dla nowego klienta) dodatkową funkcję serwera (przez HTTPS), aby odzyskać to hasło. Tak więc to hasło nigdy nie powinno trafić na dysk klienta.

Jako bonus, o wiele łatwiej naprawić serwer później. Po prostu za każdym razem wysyłaj inne, ograniczone czasowo hasło dla klienta. Nie zapomnij zezwolić na dłuższe hasła w nowym kliencie.

 3
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 12:32:00

Możesz zakodować łańcuch używając jakiegoś trywialnego kodowania, np. xor z binarnym 01010101. Oczywiście nie ma prawdziwej ochrony, ale folie użycie narzędzi takich jak string.

 2
Author: sleske,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 10:58:52

Jeśli przechowujesz klucz szyfrujący w odwrotnej kolejności ("yek noitpyrcne gnorts yM"), a następnie odwróć go w kodzie (String.Odwrotnej), zapobiegłoby to prostemu przeszukiwaniu tekstu klucza szyfrującego w pliku binarnym.

Aby powtórzyć punkt, jaki ma każdy inny plakat tutaj, jednak nie przyniesie to praktycznie nic dla ciebie pod względem bezpieczeństwa.

 2
Author: MusiGenesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 12:07:30

Oto przykład tego, co wyjaśnili, ale pamiętaj, że będzie to po prostu złamane przez każdego, kto jest "hakerem", ale zatrzyma dzieci z edytorem szesnastkowym. Przykład, który podałem, po prostu dodaje wartość 80 i odejmuje od niego indeks, a następnie ponownie tworzy ciąg znaków. Jeśli planujesz przechowywać to w pliku binarnym, istnieje wiele sposobów na przekonwertowanie ciągu znaków na tablicę bajtów [].

Kiedy masz to działa w aplikacji, chciałbym "math" użyłem trochę więcej complex

Żeby było jasne, dla tych, którzy nie rozumieją.... Zaszyfrować ciąg przed zapisaniem go więc nie jest zapisany w czystym tekście. Jeśli zaszyfrowany tekst nigdy się nie zmieni, nie włączasz nawet funkcji szyfrowania w swoim wydaniu, po prostu masz odszyfrować. Więc kiedy chcesz odszyfrować ciąg znaków, przeczytaj plik, a następnie odszyfruj zawartość. To znaczy, że Twój ciąg nigdy nie będzie zapisany w pliku w formacie zwykłego tekstu.

Można oczywiście również mieć zaszyfrowany ciąg przechowywany jako ciąg stały w aplikacji i odszyfrowywać, gdy jest to potrzebne, wybrać, co jest dla Ciebie problem w zależności od wielkości łańcucha i jak często się zmienia.

string Encrypted = EncryptMystring("AAbbBb");
string Decrypted = DecryptMystring(Encrypted);

string DecryptMystring(string RawStr)
    {
        string DecryptedStr = "";
        for (int i = 0; i < RawStr.Length; i++)
        {
            DecryptedStr += (char)((int)RawStr[i] - 80 + i);
        }

        return DecryptedStr;
    }

    string EncryptMystring(string RawStr)
    {
        string EncryptedStr = "";
        for (int i = 0; i < RawStr.Length; i++)
        {
            EncryptedStr += (char)((int)RawStr[i] + 80 - i);
        }

        return EncryptedStr;
    }
 2
Author: EKS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 13:37:45

Dla C sprawdź to: https://github.com/mafonya/c_hide_strings

Dla C++ to:

class Alpha : public std::string
{
public:
    Alpha(string str)
    {
        std::string phrase(str.c_str(), str.length());
        this->assign(phrase);
    }
    Alpha c(char c) {
        std::string phrase(this->c_str(), this->length());
        phrase += c;
        this->assign(phrase);

        return *this;
    }
};

Aby tego użyć, wystarczy podać Alfę i:

Alpha str("");
string myStr = str.c('T').c('e').c('s').c('t');

Więc mystr jest teraz "Test", a łańcuch jest ukryty w tabeli strings w pliku binarnym.

 2
Author: mafonya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 14:15:38

Możesz użyć biblioteki c++ , którą do tego celu stworzyłem. kolejny artykuł , który jest znacznie prostszy w implementacji, wygrał jako najlepszy artykuł c++ z września 2017 roku.

 1
Author: Michael Haephrati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 13:15:03

Myślę, że chcesz, aby wyglądało to jak instrukcje, twój przykład

X [Y++]= "M"; x [Y++]= 'y'; ...

Zrobiłoby to tak, długa sekwencja powtarzających się Instrukcji z małą zmiennością może się wyróżniać i to byłoby złe, dany bajt może zostać zakodowany w instrukcji tak, jak jest i to byłoby złe, więc być może metoda xor, a być może inne sztuczki, aby ta długa sekcja kodu nie wyróżniała się, być może niektóre fałszywe wywołania funkcji. Zależy od Twojego procesor, jak również, ARM na przykład jest naprawdę łatwo spojrzeć na dane binarne i wybrać instrukcje z danych i stamtąd (jeśli szukasz domyślnego klucza), aby ewentualnie wybrać, co może być kluczem, ponieważ są to dane, ale nie jest ascii i zaatakować, że. Podobnie blok podobnych instrukcji z natychmiastowym polem zmieniającym się, nawet jeśli masz kompilator xor danych ze stałą.

 0
Author: old_timer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 00:06:09

Zastanawiam się, czy po pierwszym zasłonięciu go tak, jak inni wspominali, mógłbyś osadzić swój ciąg w bloku montażowym, aby wyglądał jak instrukcje. Możesz wtedy mieć "if 0 "lub" goto just_past_string_assembly", aby przeskoczyć "kod", który naprawdę ukrywa twój ciąg znaków. Prawdopodobnie wymagałoby to nieco więcej pracy, aby odzyskać ciąg znaków w kodzie( koszt jednorazowego kodowania), ale może okazać się nieco bardziej niejasne.

 0
Author: Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 19:34:42

Zaszyfruj klucz szyfrowania innym kodem. Pokaż użytkownikowi obrazek innego kodu. Teraz użytkownik musi wprowadzić klucz, który widzi (jak captcha, ale zawsze ten sam kod). Uniemożliwia to również innym programom przewidywanie kodu. Opcjonalnie możesz zapisać (solony) hash kodu, aby zweryfikować dane wejściowe użytkownika.

 0
Author: Van Uitkon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 07:40:58

Proponuję m4 .

  1. Przechowuj ciąg z makrami jak const string sPassword = _ENCRYPT("real password");

  2. Przed zbudowaniem rozwiń makra do zaszyfrowanego ciągu znaków M4 , aby Twój kod wyglądał następująco const string sPassword = "encrypted string";

  3. Odszyfruj w środowisku runtime.

 0
Author: Yudu Ban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 04:36:56

Utwórz funkcję, która przypisze Twoje hasło do statycznej tablicy znaków i zwróci wskaźnik do tej funkcji. Następnie uruchom tę funkcję za pomocą programu zaciemniającego.

Jeśli program wykonuje dobrą robotę. nie powinno być możliwe odczytanie hasła tekstowego za pomocą edytora szesnastkowego do zbadania programu binarnego. (przynajmniej nie bez inżynierii odwrotnej języka asemblacji. To powinno powstrzymać wszystkie dzieci ze skryptów uzbrojone w" stringi " lub edytory heksów, z wyjątkiem kryminalnie szalonych haker, który nie ma nic lepszego do stracenia czasu.)

 0
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 00:30:43

Oto skrypt Perla do generowania zaciemnionego kodu c, aby ukryć hasło ze zwykłego tekstu przed programem "strings".

  obfuscate_password("myPassword123");

  sub obfuscate_password($) {

  my $string = shift;
  my @c = split(//, $string);
  push(@c, "skip"); # Skip Null Terminator
                    # using memset to clear this byte
  # Add Decoy Characters
  for($i=0; $i < 100; $i++) {
    $ch = rand(255);
    next if ($ch == 0);
    push(@c, chr($ch));
  }                     
  my $count1 = @c;
  print "  int x1, x2, x3, x4;\n";
  print "  char password[$count1];\n";
  print "  memset(password, 0, $count1);\n";
  my $count2 = 0;
  my %dict  = ();
  while(1) {
    my $x = int(rand($count1));
    $y = obfuscate_expr($count1, $x);
    next if (defined($dict{$x}));
    $dict{$x} = 1;
    last if ($count2+1 == $count1);
    if ($c[$x] ne "skip") {
      #print "  $y\n";
      print "  $y password[x4] = (char)" . ord($c[$x]) . ";\n";
    }
    $count2++;
  }
  }

  sub obfuscate_expr($$) {
    my $count  = shift;
    my $target = shift;
    #return $target;

    while(1) {

       my $a = int(rand($count*2));
       my $b = int(rand($count*2));
       my $c = int(rand($count*2));
       next if (($a == 0) || ($b == 0) || ($c == 0));
       my $y = $a - $b;
       #print "$target: $y : $a - $b\n";
       if ($y == $target) {
          #return "$a - $b + $c";
          return "x1=$a; x2=$b; x3=$c; x4=x1-x2+x3; x5= +=x4;";
       }
    } 
  }
 0
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 01:26:05