Program do dekrypcji plików graficznych w C.

0

Witam,
Próbowałem stworzyć modyfikacje zasobów graficznych pewnego programu. Niestety okazało się, że developer użył w ich przypadku enkrypcji (nie wiem po co i dlaczego bo modyfikowałem wiele zasobów graficznych w innych podobnych programach i nigdy na enkrypcje się nie natknąłem). W każdym razie trudna część jest już za mną. Zdobyłem kod w C dzięki, któremu mogę dokonać dekrypcji plików. Mam jednak trywialny problem... Nie znam totalnie składni C (do modyfikowania programów. o których wspomniałem wystarczyły moje umiejętności z zakresu grafiki + ewentualnie napisanie jakiegoś banalnego pliku .bat). Czy ktoś mógł by mi pomóc zrobić z tego kodu działający program? Jak mogę temu programowi wskazać plik, który chcę poddać dekrypcji? Czy trzeba jakoś zmodyfikować ten kod by program poprosił nas o input pliku? Z góry ogromnie dziękuję za pomoc.

Poniżej kod:

 
#include <stdio.h>

int main (int argc, char **argv)
{
    FILE *inp, *outp;
    int i;
    char sig[] = "CF10", *ptr;

    if (argc != 3)
    {
        printf ("usage: decode [input] [output]\n");
        return -1;
    }
    inp = fopen (argv[1], "rb");
    if (inp == NULL)
    {
        printf ("bad input file '%s'\n", argv[1]);
        return -2;
    }
    ptr = sig;
    while (*ptr)
    {
        i = fgetc (inp);
        if (*ptr != i)
        {
            printf ("input file sig is not 'CF10'\n");
            return -2;
        }
        ptr++;
    }
    outp = fopen (argv[2], "wb");
    if (outp == NULL)
    {
        printf ("bad output file '%s'\n", argv[1]);
        return -2;
    }
    do
    {
        i = fgetc(inp);
        if (i != EOF)
            fputc (i ^ 0x8d, outp);
    } while (i != EOF);
    fclose (inp);
    fclose (outp);
    printf ("all done. bye bye\n");
    return 0;
}
1

tworzysz prymitywny bat i odpalasz z parametrami:
program plik_wejsciowy plik_wyjsciowy
Z tym że ten kod nie jest poprawny i zawsze wyświetli komunikat: input file sig is not 'CF10'

0

Ok żeby nie prezentować postawy "nie znam się zróbcie za mnie" poświęciłem ostatnie 2-3 godziny na research. Wiem jak skompilować kod w C w Visual Studio (miałem po drodze problemy, ale udało mi się je rozwiązać przez dodanie _CRT_SECURE_NO_WARNINGS do Preprocessor Definitions cokolwiek to znaczy). W każdym razie udało mi się skompilować ten kod i zbudować program... ale w praktyce działa to tak, że otwiera mi się na moment okienko konsoli w którym nic nie jestem w stanie przeczytać i sobie znika. Nie rozumiem składni C więc zgaduję, że to dlatego, iż program nie wie skąd ma wziąć input (plik do dekrypcji). Jak zmodyfikować kod by program np. zapytał mnie skąd wziąć plik do dekrypcji? Albo jeszcze prościej zmodyfikować kod tak bym po prostu zdefiniował w kodzie ścieżkę do pliku, który chcę poddać dekrypcji?

1

Odpal sobie konsolę (windows+r, cmd.exe), nawiguj do katalogu z programem, odpal program z odpowiednimi parametrami

0

Odpalam cmd i robię następujące rzeczy:
1)Wpisuje d:
2)start Dekrypcja.exe

Odpala się przez moment i znika kolejne okienko konsoli

  1. W konsoli wpisuję ścieżkę do pliku, który chcę poddać dekrypcji pliki\plik1.png i po prostu otwiera się ten plik (dekrypcja nie zadziałała).

Podejrzewam, że w powyższym jest jakiś banalnie prosty błąd, którego nie widzę. Jeszcze raz dziękuję za pomoc i cierpliwość.

0

Hej. Mam jeszcze ostatnie pytanie do tego kodu (z pierwszego posta w temacie). Jak go zmodyfikować by zamiast dokonywać dekrypcji plików dokonywał ich enkrypcji (innymi słowy dodawał do plików sygnaturę CF10)?

1

Po otwarciu pliku wpisać "CF10", najprościej poprzez fwrite

1
#include <stdio.h>
#include <stdlib.h>
 
void check(int bad,const char *msg,const char *param)
  {
   if(!bad) return;
   printf(msg,param);
   exit(1);
  }

int main(int argc,char **argv)
  {
   FILE *inp,*outp;
   int ch,cnt;
   const char *ptr,sig[]="CF10";
 
   check(argc!=3,"usage: decode [input] [output]\n",NULL);
   inp=fopen(argv[1],"rb");
   check(!inp,"bad input file '%s'\n",argv[1]);
   for(ptr=sig,cnt=0;(*ptr)&&(*ptr==(ch=fgetc(inp)));++cnt) ++ptr;
   check((cnt)&&(*ptr),"input file sig is not 'CF10'\n",NULL);
   outp=fopen (argv[2],"wb");
   check(!outp,"bad output file '%s'\n",argv[2]);
   if(*ptr) fputs(sig,outp); else ch=fgetc(inp);
   for(;ch!=EOF;ch=fgetc(inp)) fputc(ch^0x8d,outp);
   fclose(inp);
   fclose(outp);
   puts(cnt?"Decode complete.":"Encode complete.");
   return 0;
  }

Pisano z palca trzeba przetestować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1