Ich verwende ConfuserEx, um mein Programm vor der Veröffentlichung zu verschleiern, ich möchte das Programm eine Warnung anzeigen, wenn es ohne Verschleierung ausgeführt wird. Um die Wahrscheinlichkeit zu reduzieren, dass eine nicht verschleierte ausführbare Datei versendet wird. Also zur Laufzeit möchte ich eine Funktion, die wahr/falsch zurückgibt, wenn die Verschleierung angewendet wurde.Wie programmgesteuert VB.NET-Verschleierung erkennen?
Antwort
Ich kann zwei Möglichkeiten sehen, es zu tun.
Wenn der Verschleierungsprozess Teil des Releasebuilds ist und Ihr Releasebuild eingebettete Anweisungen für den Verschleierungsteil enthält, könnten Sie so etwas tun.
AppValidator.Validate()
Die Validierung prüft er eine Release-Version ist oder wenn nicht, dass die Anwendung für die zugelassenen Benutzer ausgeführt wird (dev. Team zum Beispiel).
Ich habe auch einen Weg von Kommandozeilen zu validieren Myapp.exe jedoch
validieren aufrufen. Dies bestätigt nicht die Verschleierung per se, es bestätigt, dass sich die Anwendung im Freigabemodus befindet.
Ihr Obfuscator sollte, wenn er mit dem Release-Build eingebettet ist, fehlschlagen, wenn er die Release-Version nicht verschleiern kann oder die Prämisse für diese Validierung nicht gut ist.
Public Class AppValidator
#If DEBUG Then
Private Shared ReadOnly IsDebugVersion As Boolean = True
#Else
private Shared ReadOnly IsDebugVersion As Boolean = False
#End If
Private Shared ReadOnly ISValidUser As Boolean = ValidateDevUser()
''' <summary>
''' Validate the user is authorized to run the program as
''' </summary>
''' <returns></returns>
Private Shared Function ValidateDevUser() As Boolean
Try
' Custom validation to determine if used in dev. environment such
'as validating username and domain name or checking agains Dev. Registry key
Catch ex As Exception
Return False
End Try
Return True
End Function
Public Shared Function Validate() As Boolean
Dim Args = Environment.GetCommandLineArgs
Dim ConsoleValidate As Boolean = Args.Count = 2 AndAlso String.Compare(Args(1), "validate") = 0
If IsDebugVersion Then
If ConsoleValidate Then
Console.WriteLine(Not IsDebugVersion)
Application.Current.Shutdown()
Return False
End If
If Not ValidateDevUser() Then
MessageBox.Show("Access Denied")
Application.Current.Shutdown()
Return False
End If
End If
Return True
End Function
End Class
Die erste Lösung ist am besten, wenn Sie sicher sein können, dass zu bauen schlägt fehl, wenn Release-Version erzeugt und obfuscator Schritte fehlschlägt.
Wenn Sie nicht sicher sein können, können Sie vielleicht einen Blick auf Obfuscation checker, von Red-Gate, das ist frei und hat eine Befehlszeile und tun genau das, was Sie in einem direkten Ansatz suchen.
Danke, ich mag Ihr Validierungslogik-Beispiel. Aber ich wollte die tatsächliche Verschleierung überprüfen und nicht die Annahme machen, dass sie während des Erstellungsprozesses korrekt angewendet wurde. –
Überprüfen Sie den Link am Ende meines Beitrags: Obfucation Checker ist ein kostenloses Tool von red-gate, mit dem Sie tun können, was Sie direkt suchen. –
Danke, ich habe das manuell überprüft, indem ich versucht habe, die exe zu zerlegen. Das Rot-Tor-Werkzeug sieht nützlich aus, obwohl ich mir Sorgen mache, dass es nur ein Marketing-Tool für sein Verschleierungsprodukt ist und somit die Ergebnisse anderer Verschleierungstools unterschätzt. Ich habe ursprünglich nach einer Möglichkeit gefragt, um zur Laufzeit zu überprüfen, damit ich einen Fehler anzeigen kann, wenn eine nicht verschleierte Version ausgeführt wird. Außerdem kann das Programm protokollieren, das keine Verschleierung hat. Ich habe immer noch keine Lösung dafür. –
Man könnte so etwas wie ILSpy
verwenden und haben es automatisch nach bauen mit WM_COPYDATA
API Argumente laufen, etwa so:
https://github.com/icsharpcode/ILSpy/blob/master/doc/Command%20Line.txt
haben es zu einem Typnamen navigieren, die verschleiert werden sollte; Wenn das fehlschlägt, wissen Sie, dass die Verschleierung erfolgreich war.
Kann jemand kommentieren, warum Sie es abstimmen? Es scheint eine vollkommen vernünftige Frage zu sein. –
Ein Obfuscator soll [Assembly: ObfuscateAssemblyAttribute] ausgeben. Wenn Sie nicht wissen, ob es bei Ihnen der Fall ist oder Sie es nicht finden, wenden Sie sich an den Händler, um den richtigen Weg zu finden. –
Ich bin neu in der Reflexion, wie würde ich für die Montage testen: ObfuscateAssemblyAttribute? –