Inna twórczość > C, C++

Tworzenie nowego formatu pliku

(1/3) > >>

Siemekk:
Siemanko. Otóż zastanawiam się nad stworzeniem zabezpieczonego i nowego formatu pliku. Taki format, aby jego właściwe dane otrzymać byłoby można tylko za pomocą właściwego kodu.
Np.

--- Kod: ---CFile* pFile = OpenFile('path', (Flagi - READ, WRITE, CLEAR));
if(!pFile)
pFile = new CFile("PLIK");

pFile->Write("Siemekk");
pFile->Write("2018");
[...]
pFile->Save();


//Otwarcie
CFile* pFile = OpenFile("PLIK");
if(!pFile) return;

int num = pFile->GetNumLines();
for(int i = 0; i < num; i++)
{
std::string l = pFile->ReadLine(i);
cout << l << endl;
}

--- Koniec kodu ---
Plik utworzony miałby jakiś tam format np. .sfi, jednak po otwarciu np. Notepadem++ plik nie byłby czytelny dla ludzi nieposiadających odpowiedniego programu. Więc jak takie coś osiągnąć (Jaka biblioteka byłaby do takiego efektu najlepsza)

inż. Avallach:
Nie potrzebujesz żadnej biblioteki - jeśli wystarczy ci żeby plik był nieczytelny, po prostu zrób jakieś proste operacje na bajtach przy odczycie i zapisie. Zasada dokładnie ta sama co przy szyfrze Cezara.
Oczywiście ktoś kto dojdzie do tego jak to robisz (analizując przykładowy plik albo twój program) będzie mógł robić to samo. Możesz mu to tylko utrudniać - np używając prawdziwego szyfrowania (np AES) i maksymalnie utrudniając inżynierię wsteczną twojego programu. Pamiętaj jednak że kiedy tylko dasz komuś ten program, będzie można wykorzystać go w dowolnym celu, w razie potrzeby "oszukując" go że robi to co powinien. Nie będzie w ogóle potrzeby rozumieć jak działa - wystarczy sztucznie odtworzyć twój zamierzony sposób użycia, jak ładowanie zasobów do silnika gry. Będzie to trudniejsze niż otwarcie w edytorze tekstowym, ale wystarczy że zrobi to jedna osoba jeden raz.

Wonski:
Ja bym jeszcze przy okazji kompresował a dopiero potem szyfrował :)
W sumie nie wiem czy jest sens o tym opowiadać, bo ja kompresowałem kod pythonowy.

SpoilerDobra trochę po offtopuję :D

W jednym z wątków na forum pisałem o zapisywaniu tekstu w formacie bitmapy, gdzie przy formacie RGB jeden piksel kodował 3 znaki, a przy formacie RGBA jeden znak więcej.
Ogólnie to napisałem program, który zastępuje słowa kluczowe języka pojedynczymi znakami ascii, do tego ograniczałem liczbę zmiennych w programie do niezbędnego minimum, również kodując nazwy zmiennych/funkcji pojedynczymi znakami lub dwoma znakami. Nawet pierdolone spacje i znaki nowej linii zoptymalizowałem. Zastosowałem również mnóstwo optymalizacji logicznej.
Chciałem się również pobawić kodowanie Huffmana, ale darowałem sobie bo uzyskałem zadowalający stopień kompresji moją metodą. Cały czas pracuję nad tym algorytmem.
w obrazie 1280x720 można zapisać całkiem spory program w pytonie xdd

Wracając do tematu.
Jakaś autorska kompresja i szyfrowanie (niekoniecznie autorskie) daje zajebisty poziom zabezpieczeń o ile nie dorwie się do tego ktoś znający RE.
Ale i na to znajdą się setki sposobów. Najprostszym jest chociażby ustawienie flag kompilatora by optymalizował kod. Taka binarka jest potem zdecydowanie trudniejsza do odczytania.

inż. Avallach:

--- Cytat: Wonski w 2018-01-19, 21:23 ---Jakaś autorska kompresja i szyfrowanie (niekoniecznie autorskie) daje zajebisty poziom zabezpieczeń o ile nie dorwie się do tego ktoś znający RE.
Ale i na to znajdą się setki sposobów. Najprostszym jest chociażby ustawienie flag kompilatora by optymalizował kod. Taka binarka jest potem zdecydowanie trudniejsza do odczytania.
--- Koniec cytatu ---
Po co odczytywać i reversować, jak można po prostu odpalić ją w sandboxie który udaje że jest tym właściwym momentem na odpalenie odszyfrowania, ale odebrane odszyfrowane dane zapisuje na dysk zamiast użyć ich jednorazowo tak jak chciałeś?

Wonski:
Masz na myśli przechwytywanie całego outputu z binarki, tak?
Nawet jeśli, to dostajesz "czyste dane", bo nie wiesz w jakim formacie je przechowywać. W tym momencie zakładam, że mówimy o czymś bardziej skomplikowanym niż ciąg tekstowy.
Chociażby przechwyt głupiej bitmapy powoduje cholerne problemy, bo nie masz wielu informacji o danym pliku, np jakie jest kodowanie na kanałach.

Coś jak masz dane na dysku, ale nie wiesz w jakim systemie plików są one przechowywane. Bezużyteczna pamięć.

Aby te dane które zapiszesz na dysku były do czegoś przydatne to musisz w drodze RE ustalić jak są odczytywane.

Plus trochę spłyciłeś temat:

--- Cytuj --- sandboxie który udaje że jest tym właściwym momentem na odpalenie odszyfrowania
--- Koniec cytatu ---
o ile przechwyt wszystkiego co wypluwa z siebie binarka można zrealizować bez RE, to nie bardzo rozumiem jak chciałbyś wyłuskać konkretne dane bez przeprowadzania RE?
Przecież żeby ustalić w którym momencie następuje deszyfracja, musisz debbugować, ustawiać hooki, etc..

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej