"wyciąganie" i "wsadzanie" pliku exe do innego pliku exe

0

Witam , czy jest jakaś możliwość "wsadzenia" pliku o rozszerzeniu .exe do innego pliku .exe, tak abym mógł go potem "wyciągnąć" i przenieść gdziekolwiek? Oczywiście wszystko w zasięgu kodu c++. Pozdrawiam ;)

2

Tak. Plik exe to po prostu plik binarny i nic nie stoi na przeszkodzie żeby go sobie zapisać w postaci surowych bajtów w innym programie a potem "wypakować" na dysk.

#include <iostream>
#include <fstream>
using namespace std;

int main(){
    const char* byteArray = "\x01\x02\x03\x04";
    ofstream outputFile("plik.bin",std::ofstream::out | std::ofstream::binary);
    outputFile.write(byteArray,sizeof(byteArray));
    outputFile.close();
    return 0;
}

I voila, zapisałem plik z arbitralnymi danymi binarnymi.

Jeśli chodzi o przygotowanie takiego magicznego stringa to:

data = open("input.bin","rb").read()
converted = "\\x"+"\\x".join([format(ord(c),"x") for c in x])
open("output.txt","w").write(converted)
0

Jakiego typu są u ciebie zmienne data i converted?

0

Ewentualnie można użyć do tego celu po prostu zasobów. Analogicznie jak np. ikony. https://msdn.microsoft.com/en-us/library/windows/desktop/ms648008%28v=vs.85%29.aspx Skoro to pliczek .exe to nie musi być przenośne pomiędzy platformami. Sam używam podobnego rozwiązania i działa bardzo ładnie.

Ewentualnie drugi link http://www.codeproject.com/Articles/4221/Adding-and-extracting-binary-resources

0

Czy mógłby ktoś podać rozwiązanie typu kawa na ławę, ponieważ jestem niesamowicie zflustrowany nieudanymi próbami zaimplementowania waszych pomysłów i przeszukiwaniu internetu w poszukiwaniu odpowiedzi co macie na myśli?

0

Przecież w drugim linku masz nawet gotową klasę do tego co chcesz uzyskać. Tylko dodać do projektu i użyć metody ExtractBinResource...

0

Mało informacji podajesz. Jakie błędy? My też nie wiemy co robić jak nie chcesz podać błędów. Takie rzeczy powie Ci tylko wróżka.

Od siebie mogę powiedzieć, że wywaliłem 2 pierwsze nagłówki czyli:

#include "stdafx.h"
#include "testHarness.h"

Natomias wtedy pluł się o deklarację:

HGLOBAL hResourceLoaded;

Wystarczyło dodać:

#include "windows.h"

i poszło bez problemów.

Trochę samodzielności, ewentualnie podawaj więcej informacji, bo kompilator naprawdę mówi co mu nie odpowiada.

0

Otóż to, dziękuję za domyślenie się :P jeśli można to tak ująć, jednak po wywołaniu funkcji BinRes::ExtractBinResource("BIN", 132, "file.exe"); nic się nie dzieje... dodam, że plik dodany do projektu jest, na załączonym obrazku widać jak prezentuje swoją egzystencje. Nie wiem również jak sobie poradzić z tym, że "dzisiejsze" visual studio nie ma takiej funkcji jak import (albo przynajmniej ja takowej nie widzę", więc użyłem po prostu add->new Existing item .

1

Bo nie dodałeś poprawnie zasobu ;)

Nie mam pod ręką Visuala, ale ja zasoby z reguły dodaję ręcznie za pomocą pliczków rc. Tak więc aby to zadziałało musisz dodać dwa pliki (dla wygody umieszczam je w podkatalogu res łącznie z dołączanym plikiem .exe):
resource.h

#ifndef RES_H
#define RES_H
#define IDR_MYBIN                       666
#endif

Natomiast pliczek resource.rc
IDR_MYBIN BIN "res\\moj.exe"

0

Tworzy plik, ale ma 0 kb

0

Skoro tam pisze 666 to może mam to napisać w taki sposób?
BinRes::ExtractBinResource("BIN", 666, "file2.exe");

1

Czekaj moja wina. Zapomniałem dodać w pliku resource.rc takiej oto formułki:

#include "resource.h"
IDR_MYBIN                BIN     "res\\moj.exe"

Dzięki czemu w Twoim programie zasób ma odpowiednią nazwę. Ogólnie to ta metoda jest trochę zamotana, sam preferuję posługiwanie się nie ID zasobu, ale nazwami.

Tak masz rację, tam tak naprawdę (dzięki pliczkowi resource.h) pojawi się 666, zarówno w wywołaniu

ExtractBinResource("BIN", 666, "file2.exe");

jak i w pliku rc:
666 BIN "res\\moj.exe

0
Ceki napisał(a):

Witam , czy jest jakaś możliwość "wsadzenia" pliku o rozszerzeniu .exe do innego pliku .exe, tak abym mógł go potem "wyciągnąć" i przenieść gdziekolwiek? Oczywiście wszystko w zasięgu kodu c++. Pozdrawiam ;)

Normalnie robisz jak z dowolnymi danymi.

Ja kiedyś wsadziłem ten exe do rc, jako RCDATA... no i tyle roboty.

Potem to ładowałem - też zwyczajnie: FindResource, LoadResource, itd.

0

Dziękuję wszystkim bardzo za odpowiedź :)

0

@Ceki nie ma za co :) Szkoda tylko, że przez moją nieuwagę nie udało Ci się tego uruchomić od razu.

0

Trzeba chyba zrobić "pole" z kwadratu tak myślę. :D

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