CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Folder Lock

Folder Lock

dział ogólny

Re: Folder Lock

Nowy postprzez Cyfrowy Baron » czwartek, 7 czerwca 2012, 20:18

Przykład wczytywania pliku JPG do Image bez wypakowywania:

KOD cpp:     UKRYJ  
 #include <memory>
 //----------------------
 TMemoryStream *mStream = new TMemoryStream();

 Archiver->FileName = "nazwa pliku archimum";
 Archiver->OpenArchive(fmOpenRead);
 Archiver->Password = "hasło";

 mStream->Position = 0;

 String aFileName = "nazwa pliku.jpg";

  Archiver->ExtractToStream(aFileName, mStream);

  mStream->Position = 0;

  std::auto_ptr<TJPEGImage> JImage(new TJPEGImage());
  JImage->LoadFromStream(mStream);
  Image1->Picture->Assign(JImage.get());

   mStream->Position = 0;

 Archiver->CloseArchive();

 delete mStream;


przykład wczytania pliku tekstowego do Memo bez wypakowywania do pliku:

KOD cpp:     UKRYJ  
 #include <memory>
 //----------------------
 TMemoryStream *mStream = new TMemoryStream();

 Archiver->FileName = "Nazwa pliku archiwum";
 Archiver->OpenArchive(fmOpenRead);
 Archiver->Password = "hasło";

 Archiver->ExtractToStream("nbazwa pliku.txt", mStream);
 mStream->Position = 0;
 Memo1->Lines->LoadFromStream(mStream);
 mStream->Position = 0;

 Archiver->CloseArchive();

 delete mStream;


Jak widzisz schemat jest jeden.

antonio559 napisał(a):Wszystko dziala poprawnie lecz po otwarciu archiwum wszystkie nazy plikow sa dostepne.


Nadaj plikowi jakieś zarejestrowane w systemie rozszerzenie wtedy Total Commander będzie próbował otworzyć plik w programie i nie będzie sprawdzał typu pliku. Ewentualnie zarejestruj rozszerzenie nadane plikowi przypisując je do swojego programu.

antonio559 napisał(a):Image zostaje wywolane w nowym oknie i po zamknieciu okna plik zostanie skasowany.


Podałem rozwiązanie, wiec to już chyba nie będzie problemem.

antonio559 napisał(a):Inna sprawa jest dodanie pliku do archiwum np z Total Commandera plik zostanie dodany lecz juz nie bedzie zabezpieczony.


No niestety, cudów nie ma.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez polymorphism » piątek, 8 czerwca 2012, 09:59

Nie lepiej napisać własne archiwum, które będzie spełniało oczekiwane wymagania? Jakoś strasznie trudne to to nie jest.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez Cyfrowy Baron » piątek, 8 czerwca 2012, 12:58

polymorphism napisał(a):które będzie spełniało oczekiwane wymagania?


Żadne archiwum nawet własne nie będzie szyfrowało plików podczas dodawania ich poprzez Explorera lub np. Total Commandera. Będzie to tylko inny typ archiwum o właściwościach zbliżonych do archiwum ZIP, a tylko ten problem już pozostał.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez polymorphism » piątek, 8 czerwca 2012, 13:25

Żadne archiwum nawet własne nie będzie szyfrowało plików podczas dodawania ich poprzez Explorera lub np. Total Commandera.

Problem (a może zaleta?) w tym, że z poziomu exploratora nie będziesz w stanie nic dodać, ponieważ to Twój format, nieznany systemowi. Jeśli zawartość archiwum ma być tylko na użytek aplikacji, którą pisze antonio559, to można pokusić się o skonstruowanie własnego formatu archiwum (szczególnie, że to dość ciekawe i rozwijające zagadnienie).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez Cyfrowy Baron » piątek, 8 czerwca 2012, 14:25

polymorphism napisał(a):Problem (a może zaleta?) w tym, że z poziomu exploratora nie będziesz w stanie nic dodać


antonio559 napisał(a):Inna sprawa jest dodanie pliku do archiwum np z Total Commandera plik zostanie dodany lecz juz nie bedzie zabezpieczony.


Najwyraźniej kolega chce mieć możliwość dodawania plików do archiwum z poziomu programu Total Commander. Jeżeli jednak nie chce to wystarczy nadać plikowi archiwum rozszerzenie inne niż ZIP, jakieś własne i zarejestrować je w systemie powiązując z własną aplikacją. Program Total Commander sprawdza typ pliku, jak sądzę zaglądając do jego nagłówka tylko jeżeli rozszerzenie pliku jest nieznane, w przeciwnym razie próbuje otworzyć plik w programie przypisanym do pliku. Takie rozwiązanie również uniemożliwia dodanie czegokolwiek do archiwum ZIP z poziomu innych programów.

Biblioteka ZIPForge obsłuży każdy plik będący archiwum ZIP niezależnie od tego jakie rozszerzenie ma ten plik, czyli nie musi to być rozszerzenie ZIP, taki plik nie musi nawet zawierać rozszerzenia.

Inne rozwiązanie może polegać na tym, że nasza aplikacja może zmieniać nagłówek pliku archiwum, wtedy nie będzie ono rozpoznawane. Aplikacja przed odczytaniem zawartości archiwum może przywracać plikowi archiwum prawidłowy nagłówek, a po odczytaniu archiwum zmieniać ma nagłówek na inny. To proste rozwiązanie sprawi, że plik będzie rozpoznawany jako archiwum ZIP tylko przez naszą aplikację i nic nie da się do tego pliku dodać.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez Cyfrowy Baron » niedziela, 10 czerwca 2012, 09:05

Z tym nagłówkiem pliku ZIP czegoś nie rozumiem. Zmieniłem dwa pierwsze bajty, ale plik wciąż jest rozpoznawany jako archiwum ZIP. Jedyne co udało mi się w ten sposób osiągnąć to, że archiwum jest rozpoznawane jako uszkodzone. Po przywróceniu nagłówka archiwum jest wypakowywane bez problemu.

Testowany kod:

KOD cpp:     UKRYJ  
 FILE *fileStream;
 char Head[3];
 char Buf[] = {'B', 'M'};
 fpos_t p = 0;

 fileStream = fopen("c:\\test.zip", "r+");

 fgets(Head, sizeof(Head), fileStream);

 Edit1->Text = Head; // sprawdzam dwa pierwsze bajty

 fsetpos(fileStream, &p);
 fwrite(Buf, 1, sizeof(Buf), fileStream);
 fclose(fileStream);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez polymorphism » niedziela, 10 czerwca 2012, 09:41

Zmień większą ilość danych, bo te dwa bajty na początku nie są jakoś strasznie istotne dla zachowania spójności archiwum.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez Cyfrowy Baron » niedziela, 10 czerwca 2012, 14:52

Trzeba zmienić wartość 21 i 22 bajtu licząc od końca pliku:

Funkcja zmieniająca wartość w pliku ZIP:

KOD cpp:     UKRYJ  
void ChangeHeadZIP(char * fileName, char *Buf)
{
 FILE *fileStream;
 char Head[3];
 fileStream = fopen(fileName, "r+");

 fseek(fileStream, -22, SEEK_END);

 fputs(Buf, fileStream);
 fclose(fileStream);
}


Wywołanie funkcja powodującej uszkodzenie nagłówka i w efekcie pliku nie da się wypakować, nie da się również nic do niego dodać, jak też w Eksploratorze Windows jak i w Total Commanderze nie da się podejrzeć zawartości archiwum. Niestety program WinRAR jest w stanie pokazać zawartość archiwum, jednak nic z niego nie wypakuje, gdyż rozpoznaje je jako uszkodzone:

KOD cpp:     UKRYJ  
 AnsiString FileName = "c:\\test.zip";
 ChangeHeadZIP(FileName.c_str(), "00" );


Przywrócenie prawidłowych wpisów w archiwum:

KOD cpp:     UKRYJ  
 AnsiString FileName = "c:\\test.zip";
 ChangeHeadZIP(FileName.c_str(), "PK" );
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Folder Lock

Nowy postprzez Cyfrowy Baron » niedziela, 10 czerwca 2012, 15:48

Że też od razu na to nie wpadłem... :? Po zmianie dwóch pierwszych bajtów, 21 i 22 od końca o czym wspomniałem wcześniej, archiwum staje się zupełnie nieczytelne nawet dla programu WinRAR:

KOD cpp:     UKRYJ  
void ChangeHeadZIP(char * fileName, char *Buf)
{
 FILE *fileStream;
 char Head[3];
 fileStream = fopen(fileName, "r+");

 fseek(fileStream, 0, SEEK_SET);
 fputs(Buf, fileStream);

 fseek(fileStream, -22, SEEK_END);
 fputs(Buf, fileStream);

 fclose(fileStream);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 /* zmienia nagłówek pliku ZIP czyniąc go nieczytelnym */
 AnsiString FileName = "c:\\test.zip";
 ChangeHeadZIP(FileName.c_str(), "00" );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 /* przywraca nagłówek pliku ZIP naprawiając go */
 AnsiString FileName = "c:\\test.zip";
 ChangeHeadZIP(FileName.c_str(), "PK" );
}


To rozwiązuje problem z podglądem zawartości archiwum przez programy trzecie. Wystarczy wywołać funkcję ChangeHeadZIP z wartością PK zawsze przed pobraniem zawartości archiwum i ponownie wywołać funkcję z wartością 00 po pobraniu zawartości archiwum, czyli coś w tym stylu:

KOD cpp:     UKRYJ  
 AnsiString FileName = "c:\\Temp\\Paczka.zip";
 if( FileExists( FileName ) ) ChangeHeadZIP( FileName.c_str(), "PK" );

 ZipForge1->FileName = FileName; // lokalizacja i nazwa dla spakowanego archiwum

 ZipForge1->OpenArchive(fmCreate);
 ZipForge1->CompressionMode = 9; // 0-9 9 - maksymalny stopień kompresji
 ZipForge1->EncryptionMethod = caAES_256; // metoda szyfrowania - tutaj najwyższa
 ZipForge1->BaseDir = "c:\\";  // katalog z plikami do spakowania
 ZipForge1->AddFiles("pliki\\*.*", faAnyFile, "");

 ZipForge1->CloseArchive();

 if( FileExists( FileName ) ) ChangeHeadZIP( FileName.c_str(), "00" );
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 48 gości