Jak ukryć ciągi w exe lub dll?

Odkryłem, że możliwe jest wyodrębnienie ciężko zakodowanych łańcuchów z pliku binarnego.
Na przykład widok właściwości Process Explorer wyświetla cały łańcuch zawierający więcej niż 3 znaki.

Oto kod prostego pliku wykonywalnego, który napisałem, aby go po prostu przetestować:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
    for (int i= 0; i<argc; i++) {
        if (0 == _tcscmp(argv[i],hiddenString1)) {
            _tprintf (_T("The guid argument is correct.\n")); }
        else if (0 == _tcscmp(argv[i],hiddenString2)) {
            _tprintf (_T("Do something here.\n")); }
    }

    _tprintf (_T("This is a visible string.\n"));
    //Keep Running
    Sleep(60000);
    return 0;
}

Ciągi mogą być wyraźnie wyodrębnione z odpowiedniego pliku wykonywalnego:
alt text

Myślę, że trochę zbyt łatwo jest znaleźć struny. Moje pytania są:
  1. Jak po prostu ukryć hiddenString1 lub hiddenString2 w wykonywalny?
  2. czy istnieje bardziej bezpieczny sposób użycia "cheat code" niż z jakieś niejasne ukryte wejście?
Author: Spooky, 2009-05-29

9 answers

Witamy w szerszym świecie programowania defensywnego.

Jest kilka opcji, ale wierzę, że wszystkie z nich zależą od jakiejś formy zaciemnienia; które, choć nie Doskonałe, jest przynajmniej czymś.

  1. Zamiast prostej wartości łańcuchowej można zapisać tekst w innej postaci binarnej (hex?).

  2. Możesz zaszyfrować łańcuchy, które są przechowywane w aplikacji, a następnie odszyfrować je w czasie działania.

  3. Można je podzielić na różne punkty w Twoim kodzie, a następnie odtworzyć.

Lub ich kombinacji.

Pamiętaj, że niektóre ataki idą dalej niż patrzenie na rzeczywiste dane binarne. Czasami badają przestrzeń adresową pamięci programu podczas jego działania. MS wymyślił coś o nazwie SecureString w. Net 2.0. Celem jest utrzymanie ciągów szyfrowanych podczas pracy aplikacji.

Czwartym pomysłem jest nie zapisywanie ciągu w samej aplikacji, ale raczej polegaj na kodzie weryfikacyjnym, który zostanie przesłany na kontrolowany przez Ciebie serwer. Na serwerze możesz sprawdzić, czy jest to legit "cheat code", czy nie.

 28
Author: NotMe,
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
2013-03-25 14:16:43

Istnieje wiele sposobów, aby przesłać DANE w pliku wykonywalnym. Inni opublikowali dobre rozwiązania. niektórzy silniejsi od innych. Nie będę dodawać do tej listy.

Po prostu pamiętaj: to wszystko gra w Kota i myszkę: jest niemożliwe Aby zagwarantować, że nikt nie odkryje twojego "sekretu".

Bez względu na to, ile szyfrowania lub innych sztuczek używasz; bez względu na to, ile wysiłku lub pieniędzy włożysz w to. Bez względu na to, ile typów "NASA / MIT/CIA/NSA" jest zaangażowanych w ukrywanie to.

Wszystko sprowadza się do prostej fizyki:
Gdyby jakikolwiek użytkownik nie mógł wyciągnąć twojego sekretu z pliku wykonywalnego i "odkryć" go, wówczas komputer również nie byłby w stanie go odkryć, a twój program nie byłby w stanie go użyć. Każdy umiarkowanie wykwalifikowany programista z wystarczającą motywacją znajdzie sposób, aby odkryć sekret.

W momencie, gdy przekazałeś plik wykonywalny Użytkownikowi, mają wszystko, czego potrzebują, aby dowiedzieć się sekret.

Najlepsze, na co możesz liczyć, to sprawić, że tak trudno będzie odkryć sekret, że wszelkie korzyści, jakie możesz uzyskać ze znajomości tajemnicy, nie będą warte zachodu.

Można więc próbować zaciemniać dane, jeśli jest to po prostu "nieładne", aby były publiczne, lub jeśli konsekwencje ich upublicznienia byłyby po prostu "niewygodne". Ale nawet nie myśl o ukrywaniu w swoim programie "hasła do bazy danych Klienta głównego", klucza prywatnego lub innej krytycznej tajemnicy. Ty po prostu nie mogę.

Jeśli masz naprawdę krytyczne tajne informacje, których Twój program w jakiś sposób będzie potrzebował, ale nigdy nie powinien stać się informacją publiczną( jak klucz prywatny), wtedy będziesz musiał mieć swój program rozmawiać ze zdalnym serwerem pod twoją kontrolą, zastosować odpowiednie kontrole uwierzytelniania i autoryzacji ( to znaczy upewnić się, że tylko zatwierdzone osoby lub komputery są w stanie złożyć żądanie do serwera), i mieć ten serwer zachować tajemnicę i używać go.

 16
Author: Euro Micelli,
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-05-29 21:04:22

Najprostszym sposobem jest zaszyfrowanie ich czymś banalnym, takim jak xor lub rot-13, a następnie odszyfrowanie ich w locie, gdy są używane. Wyeliminuje to przypadkowe ich oglądanie, ale nie powstrzyma nikogo z dużym doświadczeniem w cofaniu.

 9
Author: Rob K,
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-05-29 14:19:47

Oprócz tych metod, o których wspomina Chris, możesz również użyć algorytmu haszującego. Jeśli wszystko, co chcesz zrobić, to sprawdzić, czy poprawny identyfikator został określony, nie musisz przechowywać całego identyfikatora w swoim programie.

  • Utwórz hash (MD5, SHA, etc) łańcucha / password / id, z którym chcesz porównać, może Dodaj do niego wartość 'salt'. Przechowuj to w swoim programie
  • Gdy program jest uruchomiony, wykonaj ten sam algorytm NA ciągu wejściowym / password / id i porównaj dwa skróty do sprawdź, czy pasują.

W ten sposób rzeczywisty tekst nigdy nie jest przechowywany w twoim programie i nie mogą one inżynierii wstecznej Twojego programu, aby dowiedzieć się, jaki był oryginalny tekst, ponieważ algorytmy haszujące są tylko jednokierunkowe.

 6
Author: Andre Miller,
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-05-29 14:18:30

Istnieją adresy URL dla żądań http, które również chciałbym ukryć.

Jeśli Twoja aplikacja wysyła żądanie, nie ma sensu tego ukrywać. Uruchomienie aplikacji, takiej jak fiddler, http analyzer lub jednej z dziesiątek innych darmowych i łatwo dostępnych metod, pokaże cały ruch, który tworzy Twoja aplikacja.

 5
Author: CaffGeek,
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
2010-01-19 15:32:58

Czy wszystkie twoje tajne kody będą Guidami, czy to był tylko przykład?

Być może zachowaj swój sekret jako binarny guid:

const GUID SecretGuid =
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

Następnie przekonwertuj dostarczony identyfikator guid z ciągu znaków do formatu binarnego i porównaj dwa binarne identyfikatory GUID.

 2
Author: Kevin Newman,
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-05-29 15:24:14

Jeśli istnieje określony ciąg znaków, którego nie chcesz, aby ludzie mogli zobaczyć, zaszyfruj go i odszyfruj w czasie wykonywania.

Jeśli nie chcesz, aby ludzie widzieli Twój GUID, skonstruuj go z bajtów, a nie z ciągu znaków:

const GUID SecretGuid = 
      { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };
 2
Author: Ian Boyd,
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-05-29 17:37:27

Najlepsze, co możesz zrobić, to zakodować hasło lub inny ciąg znaków, który chcesz ukryć jako tablica znaków. Na przykład:

std::string s1 = "Hello";   // This will show up in exe in hex editor
char* s2 = "World";   // this will show up in exe in hex editor
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor.
 2
Author: suprit chaudhary,
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-03-28 08:42:25

Oto metoda, której używam w tym celu. Po pierwsze, używam narzędzia Strings by Sysinternals do wyświetlania łańcuchów w EXE lub DLL. Następnie używam następującego małego narzędzia (zobacz artykuł ), aby zastąpić te ciągi znaków zaszyfrowaną tablicą znaków przechowywaną jako wyrażenie arytmetyczne: na przykład: zamiast ciągu: "to jest test" Umieszczę następujący kod: (który jest automatycznie generowany przez to narzędzie )

WCHAR T1[28];
 T1[22] = 69;
 T1[15] = 121 - 17;
 T1[9] = L':' + -26;
 T1[12] = L't' - 1;
 T1[6] = 116 - 1;
 T1[17] = 117 - 12;
 T1[3] = 116 - 1;
 T1[14] = L'' - 3;
 T1[13] = L'w' - 3;
 T1[23] = 69;
 T1[26] = L'Y' + 3;
 T1[19] = 111 + 0;
 T1[21] = L'k' - 34;
 T1[27] = L'\\' - 8;
 T1[20] = L'B' + 32;
 T1[4] = 42 + -10;
 T1[25] = L'm' - 17;
 T1[16] = L'H' + 18;
 T1[18] = L'A' + 56;
 T1[24] = 68;
 T1[1] = 105 - 1;
 T1[11] = L'k' - 6;
 T1[10] = 66 + 50;
 T1[2] = 105;
 T1[0] = 117 - 1;
 T1[5] = L'k' - 2;
 T1[8] = 89 + 8;
 T1[7] = 32;

Jest wiele rozwiązań tego problemu i żaden z nich (w tym mój) nie jest doskonały, jednak istnieją sposoby na szyfr, zamaskowanie i ukrycie wrażliwych strun. Oczywiście można je zaszyfrować i odszyfrować podczas wykonywania (patrz ten artykuł), ale uważam, że ważniejsze jest, aby te ciągi znikały między bitami i bajtami pliku wykonywalnego i to działa. Po uruchomieniu Mojego narzędzia, nie znajdziesz "to jest test" w pliku wykonywalnym.

 0
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
2018-08-07 12:42:12