sollte mir der Installer.Context.Parameters Werte (wie z.b Install-DIR) ausgeben.
Nun habe ich mir eine eigene Installer Klasse erstellt und die Installt Methode überschrieben.
Und mit folgenden Code gefüllt:
System.Collections.IDictionary)
MyBase.Install(stateSaver)
'AddDBTable(Me.Context.Parameters.Item("sql"))
'', _ Me.Context.Parameters.Item("sql"))
Try
Log("Install")
LeseParameter(Me.Context.Parameters)
'LeseInstallers(Me.Installers)
Catch ex As Exception
End Try
End Sub
Private Sub Log(ByVal text As String)
Dim writer As StreamWriter = New StreamWriter("S:\Tests\log\log.txt", True)
writer.WriteLine(text)
writer.Flush()
writer.Close()
End Sub
Private Sub LeseParameter(ByVal parameters As System.Collections.Specialized.StringDictionary)
Log(parameters.Count.ToString)
For Each parameter As String In parameters.Keys
Log(parameter & " = " & parameters(parameter))
Next
End Sub
Dieses gibt mir folgende Werte in der log.txt aus:
für unseren Produkt möchten wir ein Setup\Websetup generieren um die Installation beim Kunden zu erleichertn.
Nun arbeite ich mich in dieses Thema ein.
Über Visual Studio 2005 werden mir Setups zur Verfügung gestellt.
Zu den Standardfunktionen die das Setup schon anbietet, ist es ja auch möglich eigene Aktionen zu definieren.
Dafür benötige ich aber Parameter\Properties z.b. Installtionspfad unseres Produktes.
Leider finde ich nirgends eine Information wie ich diese ermitteln kann.
heute habe ich mal über google ein wenig schlau über Ruby bzw. Rails gemacht. Wenn ich mir die Webseiten so durchlese, da hört sich ja Ruby sehr interessant an und man sollte sich damit wohl mal näher befassen.
Ich komme aus dem Bereich der Webentwicklung und programmiere überwiegend mit .NET, PHP oder ASP.
Da ich jeder Sprache offen gegenüber stehen, würde mich interessieren ob von euch jemand Erfahrung mit Ruby gemacht hat?
Für jede Antwort bin ich sehr dankbar.
Wenn die Zeit es zulässt werde ich mich mal wohl mehr damit beschäftigen.
tja wenn ich mehr Zeite hätte wäre ich in deinen Team. X(. hätte mich interessiert mal die die Technik nicht nur im Webbereich einzusetzen. Vielleicht zu einem späteren Zeitpunkt.
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!
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.
Bei der späteren Anwendung kann ich dir das using Statment empfehlen.
Damit brauchst du nicht selbst die Dispose/Close Methode aufzurufen um Speicher freizugeben, sondern dies erledigt das using Statment.
Kleines Beispiel (Vb.NET)
Using resource As New resourceType
' Insert code to work with resource.
End Using
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try
' Insert code to work with resource.
Catch ex As Exception
' Insert code to process exception.
Finally
' Insert code to do additional processing before disposing of resource.
resource.Dispose()
End Try
Vorteil davon ist, das du es nicht vergessen kannst das Objekt freizugeben und auch bei einer Exception (ausser StackOverflowException), wird das Objekt freigeben!
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!
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?
Zitat
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.
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):
Zitat
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!
Eine Möglichkeit seine Assembly zu sichern, aus dem Artikel
Zitat
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:
Zitat
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).
Große Unternehmen machen dies ja sowieso nur auf Rechnung. Du kannst damit nur kleine Fische an Land ziehen, falls du es ohne Rechnung machen willst, also schwarz.
Also ergo lohnt sich nicht auf Dauer und du machst dich noch strafbar.
Durch das Gewerbe kannst du ja auch Anschaffungen von der Steuer absetzen. Beispiel mein Notebook konnte ich abesetzen (Mwst 100 €). musst aber einmal monatlich deine Umsätze ans Finanzamt melden und du musst natürlich eine Steuererklärung machen. Falls du dies selbst kannst kein Problem, ansonsten wirds teuer, da normale Lohnsteuerberate dies nicht dürfen!
Ich habe vorkurzem selbst eine Gewerbe eröffnet im Bereich Webdesign/-programmierung.
Vielleicht hast du ja im Freundeskreis jemanden der im Design fit ist. Ich persönlich bin es nicht so startk, aber zusammen mit einen Freund, der Mediendesign gerlent hat, stellt das kein Problem dar.
Das gute bei mir ist das ich noch mit einer Firma arbeite, die eben die Projekte an landt bringt. Somit kann ich erstmal auf die Programmierung beruhen, Referenzen sammeln, um später selber sowas zu erreichen.
Da kann ich dir nur zustimmen Kai...
Bei mir ist dies keine Frage. Erst der Eigenhilfe (SDK, google, Forumsuche, etc.) und dann über Fremdhilfe (wenn unbedingt nötig)!
ja stimmt, aber nicht immer direkt so erständlich. Ist mein Empfinden!
Deshalb bin ich persönlich froh, falls mir das jemand erklären würde (wie ich dies gemacht habe). Nur zur Sicherheit, das es auch richtig verstanden worden ist!
Ausgabe/Rückgabe/Antwort des Request (Anfrage) erhalten. Das bedeutet auf gut Deutsch gesagt der HTML- Code (in unserem Beispiel für www.google.de)
//Per StreamReader Response einlesen
StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.ASCII);
StringBuilder contentBuilder = new StringBuilder();
while (-1 != sr.Peek())
{
contentBuilder.Append(sr.ReadLine());
contentBuilder.Append("\r\n");
}
content = contentBuilder.ToString();
Übergabe des Repsonse an einen StreamReader. Damit hast du dann die Möglichkeit diese dann zu durchlaufen (den HTMl-Code auszulesen) und an einen StringBuilder zu hängen. Der StringBuilder wird damm als Rüchgabe der Funktion verwendet.
Genau so habe ich es gemeint. Damit hättest du ja die Probleme in der Performance beim rückwärtes lesen nicht mehr.
Die Andere Frage ist natürlich wie du dies programmierst das der letzte Eintrag in deiner Datei an erste Stelle stehst und dann erst die älteren Beiträge.
und wenn du jetzt hingehst und jeweils den letzen Eintrag in deine Datei jeweils in die erste Zeit schreibst statt in die letzte (also kein normales Anhängen)?
So stehen jeweils die letzten Beiträge an erste Stelle und du kannst normal vorwärts lesen. Eine chronologische absteigende Sotierung.