C# Programm Dropper

RELAX

Grünschnabel
Hallo Forum,
ich hatte Probleme mir einen passenden "Titel" für dieses
Thema auszudenken.

Hier nochmal genau mein Problem(in Kurzform):
Ich habe a.exe und brauche b.exe die
a.exe "dropt" und dabei ein String (fest) mitgibt.

Ich habe Probleme das zu erklären, falls jemand nicht genau weiß was ich meine
kann ichs ja nochmal genauer erklären.

Das einzige was ich bis Jetzt gefunden habe ist:
@EDIT: Mein neuer Versuch nachzulesen in 1.Antwort

C#:
String textBox2 = @"123.exe";
            //App Domain
            AppDomain ad = AppDomain.CurrentDomain;
            //Assembly of EXE
            AssemblyName am = new AssemblyName();
            am.Name = "TestNAME";
            //Assembly maker
            AssemblyBuilder ab = ad.DefineDynamicAssembly(am, AssemblyBuilderAccess.Save);
            //Module maker
            ModuleBuilder mb = ab.DefineDynamicModule("MODULE", textBox2);
            //Type maker
            TypeBuilder tb = mb.DefineType("Type", TypeAttributes.Public);
            //Method Maker
            MethodBuilder metb = tb.DefineMethod("Main", MethodAttributes.Public |
                MethodAttributes.Static, null, null);
            
            //Assembly maker entry Area
            ab.SetEntryPoint(metb);

            //MSIL Code Generator
            ILGenerator il = metb.GetILGenerator();
            //Create EXE
            il.EmitWriteLine("testbox1");
            il.Emit(OpCodes.Ret);
            tb.CreateType();

            //Save EXE
            ab.Save(textBox2);

Allerdings macht der Code
1. nicht das was ich will und
2. ich versteh ihn viel zu wenig um daraus (vielleicht) etwas zu machen was ich will.

Ich suche nach allen Möglichkeiten die es gibt einen String von b.exe dauerhaft an a.exe zu binden und in a.exe abfragen zu können. (da ich weiß das es mehrere Möglichkeiten gibt)

danke im Voraus,
RELAX
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich bin jetzt auf die Idee gekommen das Programm nicht zu "erstellen" sondern nur im Nachhinein zu verändern.
Dazu habe ich eine Ressource im Programm angelegt: "infer.txt".
Diese versuche ich jetzt zu bearbeiten, was bisher fehlschlug.
Ich habe heute diesen Code gefunden:
C#:
System.Reflection.Assembly Assembly = System.Reflection.Assembly.LoadFile("Run4J.exe");
            System.Type[] types = Assembly.GetTypes();
            foreach (System.Type type in types)
            {
                if (type.Name == "Resources") //prüfen, ob das die Resourcenklasse ist
                {
                    foreach (System.Reflection.PropertyInfo prop in type.GetProperties()) // Jedes property durchlaufen
                    {
                        if (prop.PropertyType.ToString() == "System.String") //Prüfen, ob die Resource eine Textresource ist
                        {
                                if(prop.Name == "TitelText"){ // Prüfen, ob das die zu verändernde Resource ist
                                System.Windows.Forms.MessageBox.Show(prop.Name + " " + prop.GetGetMethod().Invoke(new object(), new object[0])); // Den wert der Resource + Name ausgeben
                                prop.GetSetMethod().Invoke(new object(), new object[] {"Neuer Text"}); //Wert verändern
                                System.Windows.Forms.MessageBox.Show(prop.Name + prop.GetGetMethod().Invoke(new object(), new object[0])); // Prüfen, ob der Wert geändert wurde
                                }
                        }
                    }
                }

            }
            Assembly.EntryPoint.Invoke(new object(), new object[0]); // Das bearbeitete Programm ausführen

Allerdings bin ich mir bei diesen stellen unsicher
was ich einsetzen muss.
C#:
type.Name == "Resources"

C#:
if (prop.Name == "TitelText")

Die Ressource in der Run4J.exe heißt infer.dinf
und ist direkt neben der Run4J.cs(ohne Unterordner).

Intern lese ich sie aus mit diesem 'Pfad': "Run4J.infer.dinf"

Kann mir jemand helfen?

PS: Ich vermute der Code ist gar nicht dafür gedacht was ich machen will.
infer.dinf ist eine einfache Textdatei ich ich in C# als Item eingefügt habe.
Allerdings hab ich keinen anderen Ansätze und wen ich den Text einfach mit
"File Einlesen".replace "file schreiben" mache kommt der ERROR: "Keine win32 Anwendung..."
 
Zuletzt bearbeitet:
Ich glaube langsam zu verstehen, was du meinst. Lass mich das kurz zusammenfassen, um sicher zu sein:
Du hast ein Programm a.exe. Dieses soll auf der Festplatte das Programm b.exe erstellen. In b.exe wird eine String-Konstante benutzt, dessen Wert du verändern möchtest, bevor du b.exe auf die Festplatte schreibst. Und du hast den Quellcode beider Programme, richtig? Oder muss b.exe nicht unbedingt auf die Festplatte geschrieben werden, sondern reicht es wenn die Anwendung in a.exe vorhanden ist und daraus geladen werden kann?

Meine erste Idee wäre hier auch gewesen, b.exe binär zu lesen und den gesuchten Text zu ersetzen. Ich kenne mich nicht aus, wann sowas funtkioniert. Aber wenn der alte String und der neue String die selbe Byte-Anzahl haben, dann sollte es funktionieren (also z.B. 'abc' durch 'def' ersetzen geht, aber durch 'defg' ersetzen geht nicht, vermute ich).

Für den Fall, dass es genügt b.exe aus a.exe heraus zu laden und zu starten und b.exe nicht auf der Festeplatte vorhanden sein muss (sondern als Ressource in a.exe), dann könntest du b.exe einfach einen Befehlszeilenparameter mitgeben jedesmal, wenn b.exe gestartet wird.

Edit: Diese Links könnten dich eventuell interessieren:
 
Zuletzt bearbeitet:
Ja, du hast recht. Mein Problem ist das das was ersetzt wird länger ist.
Wahrscheinlich muss ich die "Compiling code during runtime" Methode benutzen.

Eine Frage dazu. Muss man dafür einen Compiler installiert haben?
..also wegen der Kompatibilität u.s.w.?
 
Der .Net Compiler ist beim Framework mit bei.
Hab sone ähnliche Anwendung für die Arbeit geschrieben, also DLL Erstellung zur Laufzeit, und da läuft kein VS.
 
Zurück