[C++/Win32] Executable starten vanuit geheugen

Pagina: 1
Acties:

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Is het mogelijk om vanuit je eigen programma een ander programma te starten dat alleen in het geheugen bestaat?

Ik heb om een of andere reden een executable volledig in het geheugen geladen omdat ik deze niet op de schijf opgeslagen wil hebben (ook niet tijdelijk) vandaar dat ik me afvroeg of het mogelijk was om deze file te starten zonder hem op te slaan.

Ik heb al een beetje rondgekeken op het internet, maar ik kan nog geen goede 'hits' vinden met b.v. google. En uiteraard heb ik ook op got gekeken, en daar vond ik ook niets, behalve een link over UPX dat ongeveer hetzelfde doet als wat ik wil (alleen dan veranderd hij echt wat aan je exe denk ik).

Alvast bedankt!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
Kun je niet iets met functiepointers doen ofzo?

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Geen idee 8)

modbreak: anders zeg je gewoon niets? :?

[ Voor 75% gewijzigd door curry684 op 09-10-2003 20:04 ]


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 17:10

Klippy

Still Game

En hoe zou je die executable dan op die PC willen krijgen ooit :?

Je zal toch eerst iets op je schijf moeten hebben wil je het in het geheugen kunnen laden, of je moet natuurlijk de source van in je eigen code zetten of een DLL oid hebben, maar dat heb je niet natuurlijk...

Snap het nut ook niet echt ervan...

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Hoe je het eenvoudig doet weet ik niet.... Maar een truukje om het te kunnen doen is om een 'ramdrive' te maken... Hier de executable op te zetten en dan uit te voeren... Heb je achteraf ook niets op schijf...

Maar ik ben bang dat je dat niet zult bedoelen...

Verwijderd

Brand: Je kunt iets in je eigen proggie compileren+linken, en de executable op die manier in het geheugen krijgen...

Het echte nut snap ik eerlijk gezegd ook niet echt....

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 17:10

Klippy

Still Game

Verwijderd schreef op 09 October 2003 @ 19:42:
Brand: Je kunt iets in je eigen proggie compileren+linken, en de executable op die manier in het geheugen krijgen...

Het echte nut snap ik eerlijk gezegd ook niet echt....
Ik heet niet Brand :+

Maar je kan wel misschien de executable in je programma compileren, hoewel ik dat niet eens zeker weet, maar dat lijkt me nou niet echt geslaagd eigenlijk :?

Nouja misschien heeft iemand anders nog een idee :)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ja, mijn uitleg was inderdaad niet echt duidelijk (wel voor mijzelf trouwens ;) )

Maar ik heb de executable uiteraard wel op mijn schijf staan, maar niet in de originele form. Ik ben van plan om de executable te encrypten of in te pakken, al lijkt dat laatste mij te moeilijk.

Zodra ik deze file dus weer naar zijn originele staat terug breng, dan wil ik dus niet dat ik hem weer op de hardeschijf terug zet, want dan is het nut ervan verdwenen... Dus pak ik hem alleen uit in het geheugen.

(Nu weet ik eigenlijk wel dat je ook een geheugen dump kunt maken, maar dat zowiezo moeilijker en dat is voor later een zorg...)


Edit:
[offtopic]
Tsja, wat is makkerlijker.... L i q u i d S i l v e r of simpelweg Brand... Ik snap hem wel ;)
Afbeeldingslocatie: http://gathering.tweakers.net/usericons/13671/BrandDop.jpg

[ Voor 14% gewijzigd door PKP B-Man op 09-10-2003 19:51 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Wat je kunt doen is je eigen PE loader schrijven, je hebt wel flink wat kennis over het PE file format nodig en er zitten ook nog wel problemen aan vast.
Als het programma in het geheugen staat kun je de sections de goede memory protection geven (read-only, read & execute etc.), vervolgens de geimporteerde DLLs laden en de import section goed zetten (alle functie pointers erin). Dan nog waarschijnlijk het hele programma relocaten (met de relocation section, maar vaak is die niet aanwezig in executables en dan heb je een probleem). Als laatste een nieuwe thread starten en naar het beginadres van het programma springen.

Het vervelende is dat nu het programma in hetzelfde proces draait als die van jou. Als er dus ExitProcess ofzo wordt aangeroepen sluiten beide programma's (die dus samen maar 1 proces zijn). Deze methode wordt wel eens gebruikt voor het laden van DLLs, omdat die dan niet los meegegeven hoeven te worden. Daar heb je geen last van dit probleem.

Het is voor zover ik weet niet mogelijk een nieuw proces aan te maken zonder direct een filename op te geven..

[Zie net je nieuwe post]

Gaat het nou om twee executable of om één? Als het alleen maar om encrypten gaat heb je toch niet twee executables nodig? Wel twee delen natuurlijk, een loader (die decrypt) en de data. Dat is wat UPX ongeveer doet.
Ik weet niet waarvoor je encryptie is en hoe veilig het allemaal moet zijn maar een 'goede' packer/encrypter is niet makkelijk te maken. Het zwakke punt blijft de laatste sprong van de loader naar het uitgepakte programma.

www.madwizard.org


Verwijderd

Echt veilig (en alleen in memory) is het nooit te krijgen aangezien Windows het een en ander ook naar het swapgeheugen schrijft!

Wat je kunt doe is met VirtualAlloc??? een stuk geheugen te reserveren met het vlagje PAGE_EXECUTE_READ
En dan een call naar dit adres doen...

Maar is wel eng en vereist wat assembly

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

PKP B-Man schreef op 09 October 2003 @ 19:27:
En uiteraard heb ik ook op got gekeken, en daar vond ik ook niets, behalve een link over UPX dat ongeveer hetzelfde doet als wat ik wil (alleen dan veranderd hij echt wat aan je exe denk ik).
upx start niet een executable die in het geheugen staat, hij pakt alleen z'n data uit in het geheugen. Maar die data is niet gewoon hetzelfde als een executable

Een functiepointer heb je ook weinig aan, omdat de executable nog niet gerelocated is, en de nodige resources zijn ook nog niet geladen

.edit: ik moet niet een post typen en dan iets anders gaan doen voordat ik de post verstuur :P

[ Voor 8% gewijzigd door .oisyn op 09-10-2003 20:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik wil dus inderdaad een soort "loader" maken die een originele exe opnieuw aanmaakt en deze vervolgens uitvoert. Dat het niet 'echt veilig' is is een misschien een zorg voor later... Het is in ieder geval beter dan niets ;)

Is het dan inderdaad nodig om alle PE headers opnieuw aan te maken en de boel te reallocaten? Want zoals zoals madwizard al zei bevat niet elk programma elk programma deze gegevens meer, dus zal het ook niet met elk programma lukken. Ook lijkt me dat zeer veel werk en erg moeilijk, dus een grote kans dat het me misschien niet eens gaat lukken. Daarnaast bevat de executable al alle informatie die nodig is om het programma te starten en wil ik exact hetzelfde doen als normaal alleen dan in het geheugen...

Hoe werkt dat nu ongeveer met dat relocaten? Is dat wel nodig voor de manier waarop ik dat wil? Gebeurd dat allocaten niet vanzelf zodra ik het programma uitvoer, is dit te optimistisch gedacht?

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Je idee is dus een generieke loadere te maken voor elke willekeurige exe? of Alleen voor je eigen programma?

Relocation is iets wat de loader doet, niet het programma. Maar als je een bestaande exe packt hoef je waarschijnlijk niet te relocaten omdat het orginele programma zowieso geen relocation info bevat. Je kan er ook voor kiezen de import section niet te encrypten en alleen de code sectie te doen, dan hoef je dat in ieder geval niet te doen.

www.madwizard.org


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Het mooiste lijkt mij om een generieke loader te maken, op deze manier kan ik programma's gaan beschermen die ik in het verleden gemaakt heb en heb ik de mogelijkheid om programma's te beschermen die niet van mij zijn maar bijvoorbeeld van een kameraad ofzo...

Ik bedoelde eigenlijk ook dat de loader de boel reallocate, sorry... Maar vanaf nu gaan we er vanuit dat ik een bestaande exe pack. Ik un-pack vervolgens het hele proramma inclusief de import sectie en al het andere, in dat geval zou ik me dus geen zorgen hoeven te maken om de reallocation als ik het goed begrijp?

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Alleen als er geen relocation info in de orginele exe stond, want dan zou je zelfs als je zou willen niet kunnen relocaten. Ook als een programma wel relocation info heeft kan je het nog achterwege laten, maar je loopt het risico dat het programma niet kan laden als het base adres al in gebruik is (0x400000 wordt altijd wel vrijgehouden maar als er een alternatief adres gebruikt is kan dat wel een probleem zijn).
De loader relocate wel, maar kan dat natuurlijk niet doen als de code geencrypt is.. Idem voor de import sectie, hij kan geen imports laden als de import section geencrypt is. Je kan niet de functionaliteit van de loader 'gebruiken' nadat je gedecrypt hebt, zodra je programma start is de loader klaar.
Zoals ik al zei is het allemaal niet makkelijk, je hebt een hoop PE kennis nodig en wat assembly kan ook geen kwaad.

www.madwizard.org


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Kun je de file niet aanmaken met exclusive read rechten, en 'm open houden?. Dan kan geen enkel ander programma 'm openen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even een vraag tussendoor: een executable bevat toch altijd relocation info? Ze moeten immers op elk mogelijk base adres geladen kunnen worden

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
.oisyn: Meestal zijn .exe's gestript en hebben ze het image base adres 0x400000. Dit is in Windows altijd vrij om een .exe in te laden (je hebt altijd maar één .exe per proces). DLL's (of exe's met exports die als DLL's kunnen worden gebruikt) zijn natuurlijk een ander verhaal, deze hebben meestal wel een relocation section.

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Gister was mijn internet verbinding ineens verdwenen.... ;( Maar (alvast) bedankt voor jullie replies, ze hebben me nu al erg geholpen!
MSalters schreef op 10 oktober 2003 @ 12:33:
Kun je de file niet aanmaken met exclusive read rechten, en 'm open houden?. Dan kan geen enkel ander programma 'm openen.
Misschien dat ik maar over een iets dergelijke manier ga nadenken, dan hoef ik me niet zo druk te maken over die PE headers... Maar wat gebeurd er nu als het programma dan "per ongeluk" gestopt wordt door taakbeheer ofzo? Dan blijft die file toch op de schijf staan?

Maar hoe werkt dat truukje waar gamecreature het in zijn eerste post over had precies? Is dat ook een goede oplossing, die ramdrive? En is daar een beetje informatie over te vinden? Ik heb nog niet echt iets er over kunnen vinden...

:edit:
Volgens mij zat ik verkeerd te denken 8)7 ... Kun je een ramdrive gewoon aanmaken in de cmd-prompt met een aantal commando's?

[ Voor 9% gewijzigd door PKP B-Man op 10-10-2003 19:29 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Volgens mij kun je in windows niet zomaar meer een ramdrive maken zoals dat in dos vroeger ging.. Er is wel een driver ergens op msdn (eigenlijk een voorbeeld driver) die een ramdrive aanmaakt maar om nou een driver te gaan installeren om een simpel programma te starten.. Bovendien, een speciale disk voor jouw programma maakt het wel heel makkelijk het uitgepakte programma te vinden.. Open gewoon de goede schijf en de gebruiker ziet hem al :). Je zal de ramdrive toch een drive letter moeten geven om het programma te kunnen starten (je hebt immers een pad nodig), dus je krijgt zowieso altijd een schijf in 'my computer'. Lijkt mij geen oplossing voor je probleem, ik zou er iig niet blij mee zijn als een normaal programma opeens schijven gaat aanmaken om zichzelf simpelweg op te starten..

Resources zul je trouwens waarschijnlijk nooit kunnen packen, omdat je die met geen mogelijkheid handmatig kunt laden (dat is iets wat alleen de echte PE loader kan). Daarnaast ben je ook je exe icoontje kwijt als je de resource section inpakt. De rest is goed te packen, met relocations en imports fixen kom je een heel eind. De simpele packers maken een nieuwe PE section aan met de loader code, die alle andere sections in het geheugen uitpakt en vervolgens naar het orginele adres springt.

www.madwizard.org


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
PKP B-Man schreef op 10 October 2003 @ 19:13:
Misschien dat ik maar over een iets dergelijke manier ga nadenken, dan hoef ik me niet zo druk te maken over die PE headers... Maar wat gebeurd er nu als het programma dan "per ongeluk" gestopt wordt door taakbeheer ofzo? Dan blijft die file toch op de schijf staan?
Ja, en als ik een debugger gebruik kan ik 'm ook dumpen. Wou je meer zekerheid? Creeer een nieuwe user, geef alleen die user rechten op de file, impersonate die user en start de file. User security blokkeert debuggers. Dit is in theorie nog steeds te kraken; het password van de user zit tijdelijk in het geheugen van het aanroepende programma, wat dus wel te debuggen is. In de praktijk hoef je dat password alleen te onthouden tussen het creeeren van de user en de daaropvolgende impersonate, dat is niet erg lang.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1