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?
Executablen viipalointi
-juuba-
5341
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 5
Vanhimmat
tarkoitukseen käyttäisin jotan resource editoria, exen data kun löytyy sillä helpoiten, se kun riippuu ihan exestä missä se on mut etenkin ummikkona lähtisin jostain tuollaisesta kun vaikka http://www.heaventools.com/resource-tuner.htm?r1=goortad5
Kuvan liittäminen on helppoa Pascal:lla (siis Delphillä ja Lazaruksella)
http://wiki.mureakuha.com/wiki/Valmiin_kuvan_tuominen_omaan_ohjelmaan
Eikä (itse tehdyn) C-koodin siirtäminen Pascaliin ole välttämättä kovin vaikeaa. Vinkkejä löytyy mm.
http://wiki.lazarus.freepascal.org/Pascal_for_C_users
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 ---
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); //