10
votes

Exécuter un fichier EXE de la ressource en mémoire

Je veux exécuter un fichier EXE compilé avec ma demande en tant que ressource. Je veux l'exécuter directement en mémoire.

J'ai vu ce sujet: P>

est-il possible d'intégrer et d'exécuter un fichier EXE dans une application exécutable Delphi? p>

et ce code : P>

http: //www.coderprofile.com/networks/source-Codes/138/execute-Resource-Direcly-In-Memory P>

J'ai utilisé ce code: P>

  GetMem(InjectMemory, InjectSize);


13 commentaires

Quelle est la valeur de l'injectisation? Peut-être que l'erreur de mémoire de mémoire est exactement ce qu'il semble


Pourquoi cette question a-t-elle été évitée?


C'est une question intéressante mais, wow, quelle grande travail. Pourquoi ne pas fonctionner avec avec le système d'exploitation, pas contre IT et déposez un fichier dans le répertoire TEMP.


Avez-vous essayé de compiler et d'exécuter l'exemple de votre coderprofile-Link? Si cela fonctionne, vous devriez commencer à partir de cela et le changer pour utiliser votre exécutable à la place. Mais comme Ian suggère, le laissant tomber dans la température et l'exécutant de là est beaucoup plus simple et l'utilisateur ne remarquera pas la différence. Sauf si vous faites cela pour essayer de contourner les scanners de virus.


@David Heffernan: injectsize: = ImageSize (FileMemorie); , Si cela fait une erreur, je pense que la fonction "Imageiser" peut avoir un problème


@Downvoter: Je sais qui a voté !! , aucun problème ...


@Lan Boyd: J'ai un fichier EXE que l'utilisateur ne doit pas être capable d'y accéder et de sauvegarder / copier-le si je dépose un fichier dans un répertoire temporaire, accéder à un fichier sera facile pour l'utilisateur! , mais si je l'exécute en mémoire, il n'est pas simple de le jeter


Quelle est la valeur de l'injectisation? Je peux voir comment il est assigné mais quelle est la valeur?


@Ville Krumlinde: Oui, je l'ai testé mais j'ai la même erreur!


@David Heffernan: la valeur est "1974665216" (montré dans la pile d'appels), je pense que l'injectisation d'une erreur causée, j'ai essayé ceci (pour tester): "Injectisize: = 2 * injectisser;", aucune erreur montrée, mais j'ai eu un av. en seconde boucle "pour" après 8 étapes (SectionLoop = 8) dans cette ligne: CopyMemory (FileData, Pointeur (DWORD (FIGHEMORIEURE) + PSCTIONS [SECTIONLOOOOOOOOOOOOOOOOOOOP] .PointerTorawData), Secongionize); , Je pense que la fonction ImageSize renvoie une taille incorrecte


@Mahmood_n je doute que votre exe soit vraiment de 2 Go de taille.


@David Heffernan: Non, j'ai lié "calc.exe" (calculatrice Windows) à mon application en tant que ressource (pour tester)


A-t-il eu pour vous qu'une solution aussi complexe qui s'appuie sur des détails sans papiers pourrait ne pas être la solution appropriée à votre problème, quoi que ce soit.


3 Réponses :


2
votes

Votre disposition de pointeur API attendu semble pas correcte et la taille renvoyée n'est pas.

Comment avez-vous défini tous les pimagentheers et tels TSections types? Quel est l'alignement des enregistrements? N'aurait-il pas besoin d'être emballé ou aligné avec une certaine granularité? Peut-être que vous avez oublié quelque chose {$ a ..} ou taille d'énumération lorsque vous copiez / coller le code d'origine dans votre unité ...

difficile à deviner sans tout le code source.


3 commentaires

Pimagentheaders est type standard


Merci, je pense que tout ce que vous dites a été montré en code! , il n'y a plus de code ...


Avez-vous essayé avec divers exe? CALC.EXE est peut-être un exe 64 bits, de sorte que les en-têtes NT 32 bits ne correspondent plus.



6
votes

Une unité Excelente pour ce dont vous avez besoin a déjà été effectuée avec la prise en charge de Windows 64 Bit.

Vous pouvez le trouver ici: uexecefrommem de Steve10120 corrigé par test

Voici une approche triviale écrite par moi si vous ne voulez pas utiliser cette unité xxx


9 commentaires

Merci, mais il n'y a pas de déclaration pour "Sinfo" et "Pinfo"


Je les ai ajoutés ... Bien que si vous essayiez un peu, vous devriez comprendre que BTW n'oubliez pas de définir imageBase à 1000000 $


@ OPC0DE Veuillez fournir une solution de travail pour les fichiers PE 64 bits.


@ user2665920 Vous faites quelque chose de mal, le code a été testé ou de l'exécutable a quelque chose de spécial. Avez-vous défini la base de l'image?


@ OPC0de Nope je n'ai pas défini: d. Donc, ce code peut être utilisé pour 32 bits et 64 bits PE?


Seulement 32 mais réglez la base de l'image comme ceci {$ imageBase $ 1000000} DOCWIKI.EMBARCADERO.com/ Radstudio / xe4 / fr / image_base_address


@ user2665920 Checkout La réponse ci-dessus pour 64 bits;)


@ OPC0DE NO 64 bits OS .. 64 bits PE! : D Pas la même chose .. Aussi ce que vous pensez de LINK , cela fonctionnerait-il?


Essayé UexeceFrommem et fonctionne bien après l'arrêt du virus AVERTISSEMENT "VERTOOL: WIN32 / DWLOFINJECT.GEN! BI" pour la version compilée de ce code. J'ai bien peur que cela ne puisse pas être utilisé dans de véritables programmes, tristes :-(



3
votes

Pour obtenir La réponse de OPC0DE Travailler sur les plates-formes 32 bits et 64 bits Modifiez le paramètre de contexte comme suit,

   GetThreadContext(PInfo.hThread,CONT);
   {$IFDEF WIN64}
      CONT.P6Home:=imgbase + INH^.OptionalHeader.AddressOfEntryPoint;
      WriteProcessMemory(PInfo.hProcess,Ptr(CONT.P3Home+8),@imgbase,4,btsIO);
   {$ELSE}
      CONT.Eax:=imgbase + INH^.OptionalHeader.AddressOfEntryPoint;
      WriteProcessMemory(PInfo.hProcess,Ptr(CONT.Ebx+8),@imgbase,4,btsIO);
   {$ENDIF}
   ShowMessage('Press ok on ENTER');
   SetThreadContext(PInfo.hThread,CONT);


0 commentaires