GUI-kodning, liten exe-fil + kombinera exefiler?

Permalänk
Medlem

GUI-kodning, liten exe-fil + kombinera exefiler?

Jag håller på att göra ett program för att skicka krypterade email, där ett väldigt lättviktigt dekrypteringsprogram ska distribueras med. Två frågor:

1. Dekrypteringsprogrammet ska ha ett väldigt enkelt GUI (input för lösenord, meddelanderuta och en knapp). Den kompilerade filen måste dock vara väldigt liten, och Qt som jag använder för själva huvudapplikationen blir alldeles för stort för detta, även med statisk kompilering + strip + UPX komprimering. Vad ska jag koda i för att få så liten storlek som möjligt och att användaren inte ska behöva några bibliotek på datorn? Åtminstone under 1 MB.

2. Dekrypteringsprogrammet SKA vara en enda .exe. GUIt kommer bli en exe, men utöver det kommer GUIt att exekvera en annan fil (krypteringsalgoritmen) när man trycker på knappen. Denna måste då följa med, men programmet får bara vara en enda fil som körs direkt när man klickar på den (dvs inget zip-arkiv, självextraherande eller ej). Har kollat upp lite exe binders, men de verkar antivirusprogram gå i taket på. Hur göra?

Visa signatur

[Stationär] Intel Core 2 Duo E6600 | 2x1024Mb RAM | 8800GTS 640MB | 1230GB HDD | Samsung 206BW @ 1650x1080 | Windows XP x64 - Ubuntu 7.10
[Bärbar 1] Intel Core Duo T2300 | 2GB RAM | ATI X1400 | 80GB HDD | 15.4"-widescreenskärm @ 1280x800
[Bärbar 2] AMD Sempron 3300+ | 1024MB RAM | ATI X200 | 60GB HDD | 15.4"-widescreenskärm @ 1280x800

Permalänk
Medlem

Lösningen på 1) är ju att koda direkt mot Windows API (för jag antar att det ska vara ett windowsprogram). Då behöver du inte länka statiskt mot några andra widgetbibliotek, och din binär blir ungefär så liten som den kan bli.

Permalänk
Medlem

Kan inte hjälpa med #1, men angående #2 så kommer jag att tänka på DLL (delade bibliotek man laddar i runtime). Kan vara värt att kolla på, men jag vet egentligen inte vad du vill göra, så det är möjligt att jag är helt fel ute.

Permalänk
Medlem

Tack, badboll! Precis vad jag behövde.

Angående fråga 2: För att köra programmet behövs två .exe-filer, men jag vill kunna distribuera den som endast en, utan någon form av uppackning. De två filerna kan vi kalla start.exe (applikationen, med interface) och decrypt.exe (en fil jag ej har källkoden för).

I start.exe har jag kod som kör decrypt.exe. Pseudokod:

if button.clicked() system("decrypt.exe -pass password -n");

Antagligen kör jag CreateProcess istället för system, men you get the point. Dessa två filer (start.exe och decrypt.exe) måste kunna distribueras som en enda fil (låt oss kalla "packed.exe). När denna fil startas så körs start.exe, som fortfarande kan köra decrypt.exe när det behövs.

Hoppas det var klart nog.

Visa signatur

[Stationär] Intel Core 2 Duo E6600 | 2x1024Mb RAM | 8800GTS 640MB | 1230GB HDD | Samsung 206BW @ 1650x1080 | Windows XP x64 - Ubuntu 7.10
[Bärbar 1] Intel Core Duo T2300 | 2GB RAM | ATI X1400 | 80GB HDD | 15.4"-widescreenskärm @ 1280x800
[Bärbar 2] AMD Sempron 3300+ | 1024MB RAM | ATI X200 | 60GB HDD | 15.4"-widescreenskärm @ 1280x800

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av n0thing
Tack, badboll! Precis vad jag behövde.

Angående fråga 2: För att köra programmet behövs två .exe-filer, men jag vill kunna distribuera den som endast en, utan någon form av uppackning. De två filerna kan vi kalla start.exe (applikationen, med interface) och decrypt.exe (en fil jag ej har källkoden för).

I start.exe har jag kod som kör decrypt.exe. Pseudokod:

if button.clicked() system("decrypt.exe -pass password -n");

Antagligen kör jag CreateProcess istället för system, men you get the point. Dessa två filer (start.exe och decrypt.exe) måste kunna distribueras som en enda fil (låt oss kalla "packed.exe). När denna fil startas så körs start.exe, som fortfarande kan köra decrypt.exe när det behövs.

Hoppas det var klart nog.

Dålig metod egentligen... implementera koden direkt i programmet eller som en statiskt länkat bibliotek istället.

Permalänk
Medlem

Ah, det var en annan femma. Jag vet faktiskt inte, har aldrigt stött på det problemet tidigare. Det enda sättet jag kan komma på som eventuellt skulle fungera så här på rak arm skulle vara att dekonstruera exe filen ner till maskinkod och sedan försöka kombinera din kod och programmets med hjälp av assembler. Jag har aldrig försökt så jag vet inte om det skulle fungera alls, och skulle det göra det så är det nog inte helt trivialt i alla fall. Det skulle dessutom inte riktigt göra vad du säger att du vill (skulle i praktiken bli en exe fil som innehåller all kod snarare än två separata filer som är sammanslagna, om det spelar någon roll annat än att det blir ett helvete om du vill ändra på ditt program). De enda andra lösningarna jag kan tänka mig skulle kräva minst två filer i alla fall.

Permalänk
Medlem

En annan sak som jag använt själv är att göra en enkel påbyggnad. Du kan enkelt göra så att programmet läser från sig själv sina sista byte o på så vis lägga till din decrypt.exe efter din start.exe

Du måste dock göra ett program som då fixar till det hela men det är enkelt o scripta eller dylikt.

Exempel:
Du har på din första del i resultatet "start.exe". Låt oss kalla resultatet "result.exe".

I slutet av result.exe lägger vi en pekare till var decrypt.exe startar i result.exe. Således körs result.exe när du startar programmet där du programmerat in att läsa binärt från sig själv o läsa ut binär data för decrypt.exe från slutet av result.exe.

Jag hoppas du förstår.

// notera pseudo-lik C-kod // gjort bara så att du kan förstå ideen void main(int argc, char **argv) { char *programfile = argv[0]; file = fopen(programfile); fseek(file, -4, SEEK_END); unsigned long len; fread(file, 4, (char*)&len); fseek(file, -4-len, SEEK_END); fread(file, len, decrypt_bin); outfile=fopen("decrypt.exe"); fwrite(outfile, len, decrypt_bin); system("decrypt.exe"); }

Sedan kompilerar du detta till din "start.exe" så att säga. Kör sedan något script som lägger in decrypt.exe efter start.exe (append) samt längden på decrypt.exe.

Annars kan du lägga in en binär resurs i Win32 API också.