C# Assembly test = Assembly.load(xyz); - False Positive

Ghost_Rider_R

Lieutenant
Registriert
Nov. 2009
Beiträge
752
Hallo zusammen,

Assembly test = Assembly.load(xyz);

verursacht bei vielen Virenscannern (Avira, F-Secure) einen False-Positive, wenn das Byte-Array größer als 2MB ist.

Weiß jemand Abhilfe?

Vielen Dank für eure Tipps :-)
 
Hi,
lade die Assembly mal per Reflection. Das sollte die Heuristik des Scanners nicht mehr anschlagen lassen.

typeof(Assembly).GetMethod("Load").Invoke(null,new object[]{Bytes});

Greetz
hroessler
 
Zuletzt bearbeitet von einem Moderator:
Hallo, vielen Dank für den ersten Tipp. Das hatte ich im Netz auch schon irgendwo gesehen,
jedoch habe ich mich noch nicht mit Reflections beschäftigt. Könnte mir jemand die Zeile
oben mal komplett darstellen, dass ich nachher ein Objekt der Klasse Assembly habe?
Dieses wird in meinem weiteren Code verwendet :-)

Vielen Dank im Voraus :)

Also Assembly test = typeof(Assembly).GetMethod("Load").Invoke(null,xyz);

funktioniert auf jeden Fall nicht :-/ was mach ich falsch?
 
Zuletzt bearbeitet:
Hallo,
leider kann ich nicht hellsehen!

Welche Exception bekommst du denn? Wie lautet die Fehlermeldung? Achte dabei bitte auf die inneren Exceptions! "Funktioniert nicht" ist eine ganz schwache Beschreibung!

Greetz
hroessler
 
Zuletzt bearbeitet von einem Moderator:
...tut mir leid natürlich, das ist das Problem:

s5hqqbx9.png

Sicherlich ein Syntaxfehler, jedoch weiß ich nicht so recht, wie
die Syntax an dieser Stelle aussehen müsste.

Vielen Dank für eure Hilfe :)
 
hroessler schrieb:
Hallo,
leider kann ich nicht hellsehen!
naja... wenn man sich einmal anschaut was du gepostet hast
Code:
typeof(Assembly).GetMethod("Load").Invoke(null,new object[]{Bytes});
und wie er es verwendet hat
Code:
Assembly test = typeof(Assembly).GetMethod("Load").Invoke(null,xyz);
hätte man es schon ahnen können :)

versuch es mal mit

Code:
Assembly test = typeof(Assembly).GetMethod("Load").Invoke(null,new object[]{resourcce});

dies sieht man auch in deinem bild, in der Fehlermeldung :) nur ein wenig lesen
 
...hab ich gemacht, jetzt bin ich bei folgendem Fehler.
Jemand ne Idee? ein einfacher Cast reicht an dieser Stelle allerdings nicht aus.

oe9wifrc.png
 
Ruff_Ryders_R schrieb:
...hab ich gemacht, jetzt bin ich bei folgendem Fehler.
Jemand ne Idee? ein einfacher Cast reicht an dieser Stelle allerdings nicht aus.

Anhang anzeigen 490418

Vielleicht so?

Code:
var MyAssembly = typeof(Assembly).GetMethod("Load").Invoke(null, new object[] { });

Schau mal: Dein Invoke gibt ein Objekt zurück und kein Assembly.
 
...das Problem ist jetzt mal unabhängig davon, was links vom = Zeichen steht:

Mehrdeutige Übereinstimmung gefunden.

Hatte ich noch nie den Fehler. Weiß jemand Rat?

Das ist der problematische Teil, welcher die Exception wirft:

typeof(Assembly).GetMethod("Load");
 
Zuletzt bearbeitet:
Ruff_Ryders_R schrieb:
...das Problem ist jetzt mal unabhängig davon, was links vom = Zeichen steht:

Mehrdeutige Übereinstimmung gefunden.

Hatte ich noch nie den Fehler. Weiß jemand Rat?

Das ist der problematische Teil, welcher die Exception wirft:

typeof(Assembly).GetMethod("Load");
Wie wäre es mit deklarieren der BindingFlags? Du wolltest eine Lösung, für dein Screenshot, die habe ich dir gegeben. Und dein Problem im Screenshot, bezog sich darauf.
 
eklinu schrieb:
Wie wäre es mit deklarieren der BindingFlags? Du wolltest eine Lösung, für dein Screenshot, die habe ich dir gegeben. Und dein Problem im Screenshot, bezog sich darauf.

Ich danke dir auch dafür. Aber das ist noch nicht das was ich brauch. Ich brauch ein Assembly aus einem Byte[], aber ohne die Funktion Assembly.load zu verwenden. Leider besteht das Problem immer noch :-/ gibt es weitere Lösungsansätze?
 
Vielleicht ist ja das hier, sowas, was Du suchst. Sicher, dass es diese stelle ist, welche das Problem verursacht? Benutzt du einen Obfuscator, oder anderes?

Was ist denn das konkrete vorhaben, was du erreichen möchtest? Wenn du nur eine Instanz einer Klasse, innerhalb deines Programms erstellen möchtest, geht es auch anders. Siehe z.B. Activator.CreateInstance.
 
Zuletzt bearbeitet:
...hmmm irgendwie bin ich immer noch nicht zu einer funktionierenden Lösung gekommen. Hintergrund ist, dass ich meine Anwendungen in Zukunft nicht nur Obfuscieren möchte, sondern die komplette Anwendung verschlüsseln möchte und... ich möchte das natürlich gerne selber Coden und nicht einfach nur etwas fertiges nehmen. Hat jemand vielleicht eine andere Herangehensweise? ist natürlich blöd, wenn Avira dann alle Anwendungen als Bösartig einstuft -.-
 
Ruff_Ryders_R schrieb:
verschlüsseln möchte und... ich möchte das natürlich gerne selber Coden
Ganz schlecht! Mach das bloß auf keinen Fall. Jemals.
Schlechte Krypto ist schlimmer als gar keine Krypto.
Und selbstgemachte Krypto ist schlechte Krypto.

Als Beispiel aus der Realität:
Martin Hellman und Ralph Merkle sind (zusammen mit Whitfield Diffie) die Erfinder der modernen Kryptographie.
Sie haben ein jahrhundertealtes kryptographisches Problem, das unlösbar schien und durch das unzählige Kriege entschieden wurden, überwunden und völlig neue Perspektiven eröffnet.
Und zwei Jahre nach ihrem Durchbruch:
The Merkle–Hellman knapsack cryptosystem was one of the earliest public key cryptosystems invented by Ralph Merkle and Martin Hellman in 1978. The ideas behind it are simpler than those involving RSA, and it has been broken.

Bist du klüger als Merkle und Hellman?
 
Zuletzt bearbeitet:
eklinu schrieb:
Schau mal: Dein Invoke gibt ein Objekt zurück und kein Assembly.

Du musst doch nur einen Cast einbauen. Ein upcast macht der Compiler implizit, einen downcast aber nicht. Da musst du selbst Hand anlegen.

Code:
Assembly test = typeof(Assembly).GetMethod("Load").Invoke(null, new object[] { resourcce }) as Assembly; //Variante 1

Assembly test2 = (Assembly) typeof(Assembly).GetMethod("Load").Invoke(null, new object[] { resourcce }); //Variante 2

Greetz
hroessler
 
hroessler schrieb:
Du musst doch nur einen Cast einbauen. Ein upcast macht der Compiler implizit, einen downcast aber nicht. Da musst du selbst Hand anlegen.

Code:
Assembly test = typeof(Assembly).GetMethod("Load").Invoke(null, new object[] { resourcce }) as Assembly; //Variante 1

Assembly test2 = (Assembly) typeof(Assembly).GetMethod("Load").Invoke(null, new object[] { resourcce }); //Variante 2

Greetz
hroessler

Ich hab es eben mal in beiden Varianten versucht, allerdings spuckt er mich noch die angehängte Fehlermeldung aus.

Fehler.png

Es dürfte wohl daran liegen, dass die Methode bei Assembly.load überladen ist und er nicht weiß, welche er nehmen soll.
Leider hört mein Wissen an dieser Stelle auf. Könnt Ihr mir noch verraten, wie ich Ihm das mitteilen kann?
 
also so sieht die Lösung zum obigen Problem aus:

MethodInfo methodInfoLoad = typeof(Assembly).GetMethod("Load", new Type[] { typeof(Byte[]) });
Assembly assembly = (Assembly)methodInfoLoad.Invoke(null, new Object[] { resource });


Vielen Dank erstmal an alle Beteiligten für die obige Lösung :)

allerdings hat sich ein neues Problem aufgetan :rolleyes:

jetzt ist diese Zeile das Problem:

assembly.EntryPoint.Invoke(assembly, null);

Lässt sich die auch umstellen, dass nicht die Heuristik von allen Virenscannern Alarm schlägt?
 
Zuletzt bearbeitet:
Ich würde Dir wärmstens empfehlen, einen Obfuscator wie Smart Assembly o.Ä. zu Nutzen, um solche Probleme zu umgehen. Im Fall, dass Du einen eigenen Benutzt, wird ein Problem weitere mit sich ziehen - auf Dauer. Das ist gefundenes fressen für die Antiviren-Programme. ;-)

Es gibt natürlich noch weitere, Kostenlose, Obfuscator. Du musst jedoch bedenken, in C# sind die Programme bei weitem nicht vor allem geschützt. ;)


Selbst wenn Du die komplette Anwendung verschlüsselst, hast Du das Problem bestehend, dass diese auch entschlüsselt werden muss, um diese auszuführen. D.h. solltest du dir deinen Grundsatz deiner Anwendung überlegen.
 
eklinu schrieb:
Ich würde Dir wärmstens empfehlen, einen Obfuscator wie Smart Assembly o.Ä. zu Nutzen, um solche Probleme zu umgehen. Im Fall, dass Du einen eigenen Benutzt, wird ein Problem weitere mit sich ziehen - auf Dauer. Das ist gefundenes fressen für die Antiviren-Programme. ;-)

Es gibt natürlich noch weitere, Kostenlose, Obfuscator. Du musst jedoch bedenken, in C# sind die Programme bei weitem nicht vor allem geschützt. ;)


Selbst wenn Du die komplette Anwendung verschlüsselst, hast Du das Problem bestehend, dass diese auch entschlüsselt werden muss, um diese auszuführen. D.h. solltest du dir deinen Grundsatz deiner Anwendung überlegen.

ich benutze bereits einen Obfuscator, welcher auch super Arbeit leistet. Trotzdem lässt sich der Quelltext natürlich grundsätzlich anzeigen, auch wenn er schlecht lesbar ist.

Und genau da hätte ich gerne einen Crypter eingesetzt, welcher dann tatsächlich die Anwendung verschlüsselt. Dass das nicht jedem Virenscanner schmeckt habe ich bereits gemerkt, möchte aber trotzdem versuchen das zu realisieren. Da ich das ganze vor allem als Hobby betreibe ist eigentlich mehr der Weg das Ziel ;-)

Also als jemand noch Ideen oder Vorschläge hat, dann nur her damit :-)
 
Zurück
Oben