Tworzenie nowego formatu pliku 655 13

O temacie

Autor Siemekk

Zaczęty 18.01.2018 roku

Wyświetleń 655

Odpowiedzi 13

Siemekk

Siemekk

Złote Wrota
Szlachcic
posty1952
Propsy789
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
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.
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;
}
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

inż. Avallach

Administrator
Czego pragniesz?
posty7599
Propsy5083
Nagrody
ProfesjaProgramista
  • Administrator
  • Czego pragniesz?
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

Wonski

Gry (themodders@telegram)
C++
posty242
Propsy82
Profesjabrak
  • Gry (themodders@telegram)
  • C++

Wonski
Gry (themodders@telegram)

Tworzenie nowego formatu pliku
#2 2018-01-19, 21:23(Ostatnia zmiana: 2018-01-19, 21:47)
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.

Spoiler
Dobra 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

inż. Avallach

Administrator
Czego pragniesz?
posty7599
Propsy5083
Nagrody
ProfesjaProgramista
  • Administrator
  • Czego pragniesz?
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.
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

Wonski

Gry (themodders@telegram)
C++
posty242
Propsy82
Profesjabrak
  • Gry (themodders@telegram)
  • C++

Wonski
Gry (themodders@telegram)

Tworzenie nowego formatu pliku
#4 2018-01-21, 19:26(Ostatnia zmiana: 2018-01-21, 19:37)
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
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..

inż. Avallach

inż. Avallach

Administrator
Czego pragniesz?
posty7599
Propsy5083
Nagrody
ProfesjaProgramista
  • Administrator
  • Czego pragniesz?

inż. Avallach
Administrator

Tworzenie nowego formatu pliku
#5 2018-01-22, 11:47(Ostatnia zmiana: 2018-01-22, 12:01)
W skrócie chodzi mi o to że wystarczy podejście czysto black-boxowe bez analizowania szyfratora ani klienta. Wystarczy podsłuchanie i odtworzenie komunikacji między nimi.

Zakładam że będziesz miał interfejs pozwalający na wyłuskanie konkretnych plików, a nie po prostu surowego strumienia danych. W takim razie będzie wystarczyło podsłuchać o co prosi aplikacja kliencka, odtworzyć te zapytania i korzystając z informacji zawartych w parametrach (jak nazwa i rozszerzenie) zapisać dane na dysk.

Przyjrzyj się kontekstowi użycia - chodzi najprawdopodobniej o to żeby skrypty moda do Gothica (napisane w Daedalusie budowanym do formy kodu bajtowego) używały pośredniczącej biblioteki w C++ (ładowanej przez AST) w celu ładowania assetów. Skrypty te będą musiały zawierać nazwy plików z rozszerzeniami czy coś innego wskazującego na typ, nawet jeśli nie będą ich bezpośrednio przekazywały do tej biblioteki (tylko zastąpią je na tej warstwie np id albo hashami). A dekompilacji skryptów (są do tego gotowe toole) za prawdziwy RE nie uważam. Później wystarczy odtworzyć to samo użycie.

Wonski

Wonski

Gry (themodders@telegram)
C++
posty242
Propsy82
Profesjabrak
  • Gry (themodders@telegram)
  • C++

Wonski
Gry (themodders@telegram)

Tworzenie nowego formatu pliku
#6 2018-01-22, 18:07(Ostatnia zmiana: 2018-01-22, 18:15)
Zgadza się pod warunkiem, że user ma dostęp do etapów pośrednich przetwarzania plików. Oraz jak sam zauważyłeś jest udostępniony interfejs, z tą różnicą że pliki muszą być dostępne w ogólnie znanym formacie, który nie jest specyficzny dla apki.
Bo w tym momencie zakładasz, że apka formatuje dane wyjściowe w ogólnie znany sposób co nie musi być prawdą. Nawet jeśli dane te zostały wytworzone z formatu ogólnie znanego. Cholera wie, co OP chce wyświetlić/wypluć i w jakiej postaci.

Chociaż uważam, że Twoje podejście jest mega skomplikowane i o wiele prostsze byłoby RE z dllinjection.
Oczywiście biorę pod uwagę to, że program do gothica nie stosuje jakichś zajebiście zaawansowanych technik zaciemniania kodu binarnego.

tak btw..
OP dostarczył zbyt mało informacji na temat tej apki i coś czuję, że dyskutuję o zupełnie innym scenariuszu niż Ty masz na myśli :)

inż. Avallach

inż. Avallach

Administrator
Czego pragniesz?
posty7599
Propsy5083
Nagrody
ProfesjaProgramista
  • Administrator
  • Czego pragniesz?
Apka to silnik gry Gothic, a formaty plików to najprawdopodobniej modele/tekstury/animacje obsługiwane przez ten silnik.

Dostarczył wszystkich potrzebnych informacji przykładowym kodem - używa tam klas z biblioteki do wstrzykiwania kodu C++ do Gothica ;p

Ogólnie nie jest pierwszym który wpadł na coś takiego. SoulFire od kilku lat miało taką libkę do ochrony assetów moda przed wypakowaniem.

Sawik

Sawik

Quest Pack Team
Rebel
posty4770
Propsy3157
ProfesjaNierób
  • Quest Pack Team
  • Rebel
Apka to silnik gry Gothic, a formaty plików to najprawdopodobniej modele/tekstury/animacje obsługiwane przez ten silnik.

Dostarczył wszystkich potrzebnych informacji przykładowym kodem - używa tam klas z biblioteki do wstrzykiwania kodu C++ do Gothica ;p

Ogólnie nie jest pierwszym który wpadł na coś takiego. SoulFire od kilku lat miało taką libkę do ochrony assetów moda przed wypakowaniem.
W takim wypadku o wiele za bardzo komplikujesz. Jest naprawdę niewiele osób w moddingu gothiczka które są "złamać" chociażby zabezpieczenie ikarusem, co dopiero RE czy "podsłuchiwanie" aplikacji w runtime, podejrzewam że na polskiej scenie jesteście do tego zdolni Ty i Monk o ile dalej się tym zajmuje.
Jeżeli Siemkowi faktycznie chodzi wyłącznie o zabezpieczenie assetów modyfikacji wystarczy że użyje jakiegoś otwarto źródłowego formatu plików (nawet ASCII) ze zmienionym rozszerzeniem, powstrzyma to 99% polskich "modderów", a pozostały procent będzie miał w to wyjebane.
Odkąd Monk obwieścił forum istnienie libki w soulfire jestem pewien jednego - modderzy tego nie złamią, ale programiści z innych for uznają to za fajny challange, szczególnie biorąc pod uwagę pewność siebie z jaką Monk pisał.
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

Wonski

Wonski

Gry (themodders@telegram)
C++
posty242
Propsy82
Profesjabrak
  • Gry (themodders@telegram)
  • C++
Możemy zrobić turniej, kto obejdzie to zabezpieczenie o którym pisze Sawik, to będzie miał pucharek na profilowym :D
Cytuj
używa tam klas z biblioteki do wstrzykiwania kodu C++ do Gothica ;p
Nie byłem świadom, że to kod pochodzący z gothica ;d

Siemekk

Siemekk

Złote Wrota
Szlachcic
posty1952
Propsy789
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
Plik vdf będzie prawdopodobnie zabezpieczony z poziomu AST. Bardziej chodzi mi o to, że będę chciał zrobić hitboxy pod system free-aim, dlatego też chciałbym aby każdy model miał swój odpowiednik, tylko z rozszerzeniem .hbx (ten nowy format pliku). Reszta byłaby czytana z poziomu AST. Jednak chciałbym ukryć dane z pliku w takim celu, aby zaraz te pliki i metoda jak to zrobiłem nie latała gdzieś po internecie. Przykładowa linijka z nowego pliku:
HEAD{2.034, 3.320, 5.20, 0.60, 5.22, 4.30}
Nie wymagałoby to aż takiego zabezpieczenia, jednak zawsze można zmienić znaki i np. z kodu wyszłoby takie coś
$()#/2.034| 3.320| 5.20| 0.60| 5.22| 4.30\
W końcu teraz ciężko odgadnąć nazwę kości...
Wracając do tworzenia nowego pliku. Wystarczyłoby użyć funkcji fopen("MOEL.hbx", "W"); abym miał swój format?
 

Wonski

Wonski

Gry (themodders@telegram)
C++
posty242
Propsy82
Profesjabrak
  • Gry (themodders@telegram)
  • C++
Udostępnij jako open source na githubie. Większy fejm :D
I tak nic na tym nie zarobisz.
Ja jak puszczam coś w obieg za free to dodaję zakładkę donate, coś w stylu: "nakarm programistę"  :D
Zawsze jakieś grosze wpadają..

Siemekk

Siemekk

Złote Wrota
Szlachcic
posty1952
Propsy789
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
Url z donate przy naciśnięciu pola Nowa Gra :F
 

Wonski

Wonski

Gry (themodders@telegram)
C++
posty242
Propsy82
Profesjabrak
  • Gry (themodders@telegram)
  • C++
Już lepiej. Podoba mi się Twoje przedsiębiorcze myślenie. Łap propsa xd


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry