Executablen viipalointi

Eli siis tarkoitus olisi oppia kuinka exe tiedoston perään lisätään esim jokin bmp-kuva ja se kuinka tämä kuva sitten voidaan ajaa samalla ohjelmalla esim taustakuvana. Olen nähnyt tämän lisäyksen tehtävän joskus Perlillä mutta olen täysin ummikko. Kun executablen perässä ollutta tiedostoa haluttiin käyttää, tavujen määrä laskettiin(ns. kelattiin oikeaan kohtaan) ja tämä stream sitten ajettiin haluttuun osoittimeen c:llä toteutetussa ohjelmassa. Osaako joku neuvoa, miten tällainen voitaisiin toteuttaa?
5341
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

Yksinkertainen vaihtoehto on vain kopioida haluttu tiedosto EXE:n perään, ympäröiden se samalla joillakin alku ja loppu tageilla, joista tiedostoa käyttävä ohjelma voi tunnistaa tiedoston alun, lopun, sekä nimen. Alla yksinkertainen esimerkki ohjelma, joka lukee ajettavasta EXE:stä moi.txt nimisen tiedoston muistiin, (ohjelma olettaa että alku tagi on muota: "--- ALKU: [tiedoston nimi] ---" ja loppu tagi muotoa: "--- LOPPU: [tiedoston nimi] ---.

--- ALKAA: esimerkki.c ---

#include
#include
#include

// Lataa ajattevasta EXE:stä tiedoston muistiin
void *lataa(char *nimi, long *koko)
{   
   FILE *htiedosto;
   void *data = NULL;

   char exetiedosto[200];
   char puskuri[600];
   char alkutagi[100];
   char lopputagi[100];

   long maara = 0;
   long luettu = 0;
   long paikka = 0;
   long alkukohta = -1;
   long loppukohta = -1;

   int i = 0;

   // Muodostetaan alku ja loppu tagit halutulle tiedostolle
   sprintf(alkutagi, "--- ALKU: %s ---", nimi);
   sprintf(lopputagi, "--- LOPPU: %s ---", nimi);

   int alkutaginpituus = strlen(alkutagi);
   int lopputaginpituus = strlen(lopputagi);
   int taginpituus = alkutaginpituus;

   if (lopputaginpituus > taginpituus)
      taginpituus = lopputaginpituus;

   // Avataan ajettava EXE tiedosto lukemista varten
   if (!GetModuleFileName(NULL, exetiedosto, sizeof(exetiedosto)) ||
      ((htiedosto = fopen(exetiedosto, "rb")) == NULL))
      return NULL;

   // Luetaan EXE tiedosto läpi, etsien samalla halutun tiedoston alku ja
   // loppu tagien paikkoja
   do
   {
      // Luetaan puskuriin tavaraa EXE tiedostosta
      paikka = ftell(htiedosto);
      luettu = fread(&puskuri[maara], 1, sizeof(puskuri) - maara, htiedosto);
      paikka = paikka - maara;
      maara = maara + luettu;

      // Tarkisettaan löytyykö puskurista alku tagia
      for (i = 0; i < (maara - alkutaginpituus + 1); i++)
         if (!memcmp(alkutagi, &puskuri[i], alkutaginpituus))
            alkukohta = paikka + i + alkutaginpituus;

      // Tarkistetaan löytyykö puskurista loppu tagia
      for (i = 0; i < (maara - lopputaginpituus + 1); i++)
         if (!memcmp(lopputagi, &puskuri[i], lopputaginpituus))
            loppukohta = paikka + i;

      // Tyhjennetaan puskuria
      if (maara > taginpituus)
      {
         memcpy(puskuri, &puskuri[maara - taginpituus], taginpituus);
         maara = lopputaginpituus;
      }
   } while(luettu);

   // Jos tiedosto (eli alku ja loppu tagi) löytyi EXE:stä, niin varataan
   // muistia ja luetaan tiedosto (eli tagien välinen alue) varatulle
   // muisti alueelle
   if (alkukohta >= 0 && (loppukohta >= alkukohta))
      if ((data = calloc(1, *koko = (loppukohta - alkukohta))) != NULL)
         if (fseek(htiedosto, alkukohta, SEEK_SET) ||
            (fread(data, 1, *koko, htiedosto) != *koko))
         {
            free(data);
            data = NULL;
         }


   fclose(htiedosto);
   return data;
}


int main(int argc, char *argv[])
{
   long koko;
   void *data;

   if ((data = lataa("moi.txt", &koko)) == NULL)
      printf("Tiedoston 'moi.txt' lataus ei onnistunut");
   else
   {
      printf("Tiedoston 'moi.txt' sisältö:\n");
      fwrite(data, 1, koko, stdout);
   }
}


--- LOPPUU: esimerkki.c ---

Tosin ongelmaa löytyy varmaan valmiitakin kirjastoja, ja käyttöjärjestelmät itsestään varmaan tarjoavat jotain omia valmiita ratkaisuja ja funktioita. Tuon yllä olevan ohjelman toimivuuden voi todeta vaikka, tekemällä alla olevan teksti tiedoston ja kopioimalla se sitten vain exen perään ("copy /B esimerkki.exe + /B kokeilu.txt esimerkki.exe /B"). En jaksanut väsätä erillistä lisäys ohjelmaa.

--- ALKAA ---

--- ALKU: moi.txt ---

Tämä teksti on
teksti tiedostossa

--- LOPPU: moi.txt ---

--- LOPPUU ---

Äänestä
  • Jostain syystä ei löydä lopputagia, mutta kiitos joka tapauksessa. Tästä pääsee jo alkuun.

    Äänestä

  • -juuba- kirjoitti:

    Jostain syystä ei löydä lopputagia, mutta kiitos joka tapauksessa. Tästä pääsee jo alkuun.

    Auttaako seuraavat korjaukset puskurin tilan vapauttamiseen:


    Muutettava koodi:

    ----

    if (maara > taginpituus)
    {
       memcpy(puskuri, &puskuri[maara - taginpituus], taginpituus);
       maara = lopputaginpituus;
    }

    ----

    Uusi koodi:

    ----

    if (maara > taginpituus)
    {
       memmove(puskuri, &puskuri[maara - taginpituus], taginpituus); //

    Äänestä

Kommentoi aloitusta


-juuba- kirjoitti:

Eli siis tarkoitus olisi oppia kuinka exe tiedoston perään lisätään esim jokin bmp-kuva ja se kuinka tämä kuva sitten voidaan ajaa samalla ohjelmalla esim taustakuvana. Olen nähnyt tämän lisäyksen tehtävän joskus Perlillä mutta olen täysin ummikko. Kun executablen perässä ollutta tiedostoa haluttiin käyttää, tavujen määrä laskettiin(ns. kelattiin oikeaan kohtaan) ja tämä stream sitten ajettiin haluttuun osoittimeen c:llä toteutetussa ohjelmassa. Osaako joku neuvoa, miten tällainen voitaisiin toteuttaa?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu