C# do asm, asm do delphi

0

Z góry przepraszam bo nie wiem czy temat rozpoczynam w odpowiednim dziale forum, i bardzo proszę o wyrozumiałość.
O co chodzi: Nie pisałem nigdy w C# i .NET tylko w delphi pisze ort! i nie jestem z zawodu programistą bo tak być może bym sobie z tym poradził, mam pewien problem dotyczący uruchamiania aplikacji ze streamu bez zapisywania na dysk, jak zdazylem sie juz dowiedziec jest to praktycznie awykonalne w delphi- mozna to zrobic ale posiadajac ogromna wiedze i doswiaczenie. Nie bede wyjasniał w tym momencie dlaczego ma to byc ze streamu , ale to jest główny cel. Oto jest mój pomysl:
W C# jest to jak najbardziej mozliwe, moim pomysłem jest aby przekonwertowac funkcje uruchamiajaca do postaci asemblera a nastepnie wykorzystac to w delphi. Funkcja wygląda tak:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;

namespace ConsoleLauncher
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                string filePath = args[0];
                if (File.Exists(filePath))
                {
                    // read the bytes from the application exe file
                    FileStream fs = new FileStream(filePath, FileMode.Open);
                    BinaryReader br = new BinaryReader(fs);
                    byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
                    fs.Close();
                    br.Close();

                    // load the bytes into Assembly
                    Assembly a = Assembly.Load(bin);
                    // search for the Entry Point
                    MethodInfo method = a.EntryPoint;
                    if (method != null)
                    {
                        // create an istance of the Startup form Main method
                        object o = a.CreateInstance(method.Name);
                        // invoke the application starting point
                        method.Invoke(o, null);
                    }
                }
            }
            else
            {
                Console.Write("File not found!");
            }
        }
    }
}

źródło: http://www.codeproject.com/KB/cs/LoadExeIntoAssembly.aspx

Oczywiscie chodzi mi tylko o czesc po wczytaniu z pliku, nie potrafie tego sam przerobic i skompilowa i przekształcic do postaci asemblera.

chcialbym zeby funkcja dzialala tak ze jako parametr dajemy wskaznik do pamieci i gdzie jest zapisany exe jako bin lub paramatr jako TMemoryStream .
Tak się aplikuje asemblera do delphi:
http://4programmers.net/Forum/173689?h=assembler#id173689 w sumie to nic trudnego jak ma sie juz kod. W razie gdyby temat ni był zwiazany z działem C# i .NET prosze o przeniesienie do innego działu. :-|

Pozdrawiam,

0

W .NET możesz załadować tylko i wyłącznie inne .NET assembly. W skrócie: nie da się.

0

A moze dało by się skompilować exe w C# czy VB który wywołany z paramatrem(wskaznik do pamieci) uruchamiał by stream jako exe ktory w tej pamieci siedzi? Wtedy miałbym w zasobach dwa pliki jeden to mój exe a drugi to tez exe tylko ten w VB nastepnie mój exe wrzucał bym do pamieci pod wskazany adres. A exe VB wypakowywałbym do user temp, potem uruchamiałbym exe VB z paramatrem który byłby wskaznikiem pamieci, a VB juz by robił reszte :) i stream by się uruchomił.

0

Zastanów się człowieku co gadasz - skoro w kodzie natywnym jest to normalnie bardzo trudne do osiągnięcia /sam loader takiej binarki to banał, problemem jest hookowanie sporej liczby funkcji API systemu aby to działać chciało/ to co Ci da .NET? .NET pozwala ładować dynamicznie ze streamów tak binarkę jak i kod źródłowy, jasne, ale wyłącznie na maszynę wirtualną .NET. Zresztą, może nie wiesz ale programy pisane w C# w ogóle w postaci pierwotnej nie są kompilowane do kodu maszynowego, dopiero potem VM przy uruchomieniu robi co trzeba...

0

Czyli nie istnieje program który potrafi uruchomić, zwykłego exe ale nie zapisując go na dysku, tak jak to robi np ta funkcja z pure basic? http://www.purebasic.fr/english/viewtopic.php?t=22382&postdays=0&postorder=asc&start=0&sid=1cc51f197fdf7efacb1cb67ff16545b8

If ReadFile(0,"C:\Windows\Pbrush.exe")
  Debug "Found"
  length = Lof(0)
  *Buffer = AllocateMemory(length)
  Debug ReadData(0,*Buffer,length)
  CloseFile(0)
  ExecuteEXE(*Buffer)
EndIf

http://www.penguinbyte.com/apps/pbwebstor/files/67/ExecuteEXE.zip

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