Laden...

Assembly Code schützen

Erstellt von plongo vor 17 Jahren Letzter Beitrag vor 17 Jahren 19.085 Views
Information von herbivore vor 17 Jahren

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren
Assembly Code schützen

Hallo,

ich selbst habe mir eine eigene C# Klasse geschrieben und in eine Assembly kompiliert, die ich immer wieder in meinen Projekten verwenden. Mit dem Net. Reflector Tool kann ich ja meine eigene und auch andere Assembly betrachten, was ja sehr nützlich und hilfreich sein kann.

Dennoch stelle sich bei mir dir Frage ob ich diese nicht verhindern kann? Bei meinen eigenen Assembly mag dies egal sein, aber bei sicherheitskritischen Assemblys nicht mehr.

Dazu habe ich mich auf die Suche gemacht und konnte folgendes Seite dazu finden:
<die Seite existiert leider nicht mehr>

Dies habe ich mal angewendet, konnte aber beim dem .NET Reflector kein Unterschied feststellen. Dazu folgendes aus dem Artikel (siehe Link unten):

Das Werkzeug setzt anstatt des .NET Reflection API ein eigenes Modell zum Auslesen der Metadaten, IL-Instruktionen, Resourcen und XML-Dokumentationen einer Assembly ein.

Dennoch als ich versuchte per Reflechtion auf auf meine privaten Methoden zuzugreifen, konnte ich ein Erfolg erreichen.


<%@Import Namespace="System" %>
<%@Import Namespace="System.Drawing" %>
<%@Import Namespace="System.Collections" %>
<%@Import Namespace="System.ComponentModel" %>
<%@Import Namespace="System.Windows.Forms" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Reflection" %>
<script language="c#" runat="server">
	public void Page_Load(object sender, EventArgs e) {
		try {		
			//Assembly laden
			Assembly oAssembly = Assembly.LoadFrom(@"C:\Inetpub\wwwroot\Test\bin\System.Access.Database.dll");

			//Die Klasse, auf die zugegriffen werden soll, ermitteln
			Type oType = oAssembly.GetType("System.Access.Database");

			//Instanz der Klasse erstellen
			object oInstance = Activator.CreateInstance(oType);

			//MethodInfo-Objekt für die gewünschte Funktion erstellen 
			//und Funktion in der KlassenInstanz über Invoke aufrufen
			MethodInfo oMethodInfo = oType.GetMethod("test", BindingFlags.Instance | BindingFlags.NonPublic);
			oMethodInfo.Invoke(oInstance, new object[]{"Mal schauen ob es geht!!!!!"});
			
		} catch (System.Exception err) {
			Response.Write(err.ToString());
		}
	}
</script>

Bei bestimmten Übergab der SecurityAction-Enumeration, bekam ich eine InnerException geworfen. SecurityAction gibt die Sicherheitsaktionen an, die über die Deklarationssicherheit ausgeführt werden können.

Es gibt folgende Member:
Assert
Demand
Deny
InheritanceDemand
LinkDemand
PermitOnly
RequestMinimum
RequestOptinal
RequestRefuse

Leider ist mir jetzt noch nicht ganz klar, wo ich welchen Member einsetze. Z.b. habe ich beim Deny-Member erwartet das ich eine Exception geworfen bekommen. Dies war aber nicht der Fall und das hat mich verwundert! Aber es ist ja nur eine Frage der Zeit bis mir dies einleuchtend ist!

Bzw. noch eine weiteren informative Seite:
Decompiler und Obfuscator: Wie sicher ist Ihr Code?

Eine Möglichkeit seine Assembly zu sichern, aus dem Artikel

Können Obfuskatoren Software schützen?
String Encryption wird allgemein überschätzt. Es wird nur ein geringer Schutz erreicht und dies zu Lasten einer schlechteren Performance. Daher sollten Obfuskatoren höchstens nach dem Motto "besser ein geringer Schutz als gar keiner" eingesetzt werden.

Eine weitere Möglichkeit:

Ein kurzer Ausflug in die PKI
Die beschriebene Verschüsselungsproblematik wird mit der Public/Private-Key-Infrastruktur (PKI) gelöst. Der Absender einer Nachricht verschlüsselt den Inhalt der Nachricht mit dem öffentlichen Schlüssel des Empfängers. Dieser Public Key ist, wie der Name beschreibt, der Öffentlichkeit frei zugänglich. Der Empfänger wiederum besitzt einen geheimen Schlüssel, den Private Key, den nur er kennt. Beide Schlüssel, Public Key und Private Key, bilden ein Schlüsselpaar und sind so konstruiert, dass mit dem öffentlichen Schlüssel verschlüsselte Nachrichten ausschließlich von dem zugehörigen geheimen Schlüssel entschlüsselt werden können.

Zum Verständnis. Theoretisch kann ich mir jede Assembly (C, C++, Java, etc.) mit dem passenden Disassembler betrachten und den Code analysieren. Früher dachte ich diese wäre ohne weiteres nicht möglich. Da liege ich wohl falsch?

Meine Frage ist, wie behandelt hier das Thema?
Sichert hier eure Assembly, wenn ja wie?

Man muss bedenken das aus dieser Möglichkeit dies Assembly zu betrachten, Mono entstanden ist (so steht es zumindest im Artikel).

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo plongo,

muss zugeben, dass ich nicht alles gelesen habe. Deshalb FAQ: .net Assembly vor Disassembling schützen .

herbivore

2.082 Beiträge seit 2005
vor 17 Jahren

Hallo plongo,

suche mal bei google nach dotfuscator. Dieser versteckt deine funktionen etc. zwar nicht, verschlüsselt diese aber so, dass nicht mehr erkennbar ist, was diese machen könnten.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

Danke dir herbivore,

darf ich Fragen welche Methoden du nützt um Assembly zu schützen, wenn du dies überhaupt nutzt?

Habe mir jetzt mal den Beitrag durchgelesen. Sehr informativ!

Folgende Aussage stellt in mir die Frage warum dies so ist?

Wenn du sensiblen Code, sprich Daten die nicht jeder lesen darf im Assembly hast dann solltest du mit unmanaged Code arbeiten, sprich COM. Eine andere Möglichkeit gibt es bis dato noch nicht.

Die anderen mögllichkeiten über Dotfuscator, WebService oder externe Tools sind klar.

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

Danke fritsch,

in dem Artikel wurde dies schon beschrieben, werde mich dort aber noch näher informieren!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo plongo,

ich programmiere nur Software für den Firmeneinsatz oder zur eigenen Verwendung. Deshalb stellt sich das Problem für mich nicht. Aber selbst wenn es anders wäre, würde ich das Programm vermutlich nicht schützen.

herbivore

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

Generell denke ist mir es auch egal das meine Assembly betrachtet werden können und ungeschützt sind.

Aber ich denke bei sicherheitsrelevanten Code, wäre mir dies schon lieber!
Dazu mal den Artikel: http://www.entwickler.de/zonen/portale/p...ne,828,p,0.html. Dort denke ich wäre sowas schon sehr sinnvoll bzw. notwendig. Auch wenn es keine 100% Sicherheit gibt! Besser eine Sicherheit als keine!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

347 Beiträge seit 2006
vor 17 Jahren

Generell denke ist mir es auch egal das meine Assembly betrachtet werden können und ungeschützt sind. Wie sicher ist eine Verschlüsselung/Authentifizierung deren Sicherheit davon abhängt ob jemand den Algorythmus kennt?
Richtig, meist unsicherer als plain text zu übertragen.
Warum? Egal ob nativer Code oder IL Code, man kann den Algo eigentlich immer rekonstruktieren und schon sitzt du mit deinem proprietären Verfahren da und hast jemanden, der nach Gutdünken schalten und walten kann.
Es kommt nicht von ungefähr, dass sämtliche anerkannten Verschüsselungsverfahren Open source sind.

Warum ist sie unsicherer als gar keine Verschlüsselung? Weil sich Leute, naiv wie die meisten Menschen nunmal sind, darauf verlassen dass es sicher ist.
Sie würden die Daten besser schützen, wenn es eine reine Textdatei wäre.

Die Sicherheit eines Verfahrens darf nur von der Stärke des Passworts abhängen.

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

Gut den Algorythmus muss er ja erstmal kennen. Gut, wenn er bekannt ist oder leicht zu knacken, tja dann hatte ich Pech!

Noch habe ich keine im Einsatz, aber vielleicht ist es notwendig. Denn wenn es um wichtige, sensible Daten (Code) geht, will ich dem Hacker es ja nicht so einfach machen. Und ihm die Code ohne weiteres repräsentieren. Welches Verfahren ich dann anwende, ist eine andere Frage.

Es dient ja nur Aufklärung der Möglichkeit!!!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo plongo,

Robert G wie schon gesagt, sollte man Algorithmen verwenden, sie auch bei Kenntnis noch sicher sind. Das gilt für die meisten gebräuchlichen Verschlüsselungsalgorithmen. Deshalb stellt sich die Frage, den Code zu schützen, m.E. auch oder vielleicht gerade im Sicherheitsbereich nicht.

herbivore

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

@herbivore:
Klar das ist verständlich was du bzw. Robert G sagst!

Deshalb stellt sich die Frage, den Code zu schützen, m.E. auch oder vielleicht gerade im Sicherheitsbereich nicht.

Leider verwirrt mich der Satz ein wenig, was genau meinst du damit. Danke!

Gruss plongo

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo plongo,

wenn du einen sicheren Algorithmus verwendest, der öffentlich bekannt ist, ist doch egal, ob ihn der Angreifer ihn kennt. Und zusätzlich muss man keinen Codeklau befürchten, weil der Algorithmus eh öffentlich ist.

herbivore

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

Also ergo brauche ich keine Verschlüsselung, falls diese öffentlich bekannt ist!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo plongo,

nein, so ist das natürlich nicht gemeint. Es geht ja nur um den Verschlüsselungsalgorithmus, der bekannt sein kann. Weder um den Schlüssel (am besten durch den Benutzer einzugeben) oder den verschlüsseten Text, der natürlich geheim bleiben soll.

herbivore

347 Beiträge seit 2006
vor 17 Jahren

Kleiner Zusatz:
Ein Open source Cipher wird nicht nur den Autor geprüft und verbessert sondern durch einen Großteil derer, die in in ihren Produkten benutzen. Allein die Tatsache, dass (hauptsächlich!) OSS Cipher weiterhin benutzt werden sagt schon einiges über ihre Sicherheit aus. 😉
Die momentan verwendeten Cipher wie Rijndael, Blowfish, Twofish,... können als sicher angesehen werden: Nur Bruteforce hilft um ohne Passwort die Daten zu entschlüsseln.
Ist dein Algo wirklich besser als einer der anerkannten? Ohne dir nahe treten zu wollen bezweifel ich das ernsthaft. Vor allem, da dein Algo darauf angewiesen ist, dass keiner den Source Code kennt.
(IMHO ist er wahrscheinlich sogar unsicherer als plain text, warum steht weiter oben)

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 17 Jahren

Einen eigenen werde ich nicht verwenden, dafür sind meine Kenntnisse nicht so stark in Algo. Wenn nutze ich von OpenSource Algo's um meine Assembly zu schützen, wenn dies notwendig wird!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de