Ich habe ein Windows Forms-Projekt (.net 3.0), das aufgrund eines DEP-Fehlers nicht auf dem Vista-Computer meines Kunden ausgeführt wird. Es läuft auf meiner Vista-Maschine und in einer sauberen Version von Vista SP1 in einer virtuellen Maschine. Ich habe Probleme, Wege zu finden, um mein Programm DEP, Data Execution Prevention kompatibel zu machen. Ich kann wirklich nichts tun, um Benutzer-Maschinen zu beenden, es muss nur laufen. Gibt es einen Ausweg aus diesem neuesten Vista-Albtraum? Mein Programm verwendet devexpress Steuerelemente, SQL Express und die. NET dh Webbrowser-Steuerelement. Ich habe bereits die Kontrolle übersprungen, aber ohne Erfolg. Ich habe andere Programme, die devexpress und sql Express auf der gleichen Maschine verwenden und sie laufen in Ordnung. Ich bin in der Lage, dies auf dem Computer des Benutzers zu debuggen.
DEP wird in einem von zwei Modi ausgeführt:
1) Hardware DEP ist für CPUs, die Speicherseiten als nicht ausführbar markieren können. Dies hilft, bestimmte Exploits wie Pufferüberläufe zu verhindern.
2) Software DEP ist für CPUs ohne Hardware-DEP-Unterstützung. Es verhindert nicht die Ausführung von Code in Datenseiten, sondern stoppt stattdessen das SEH-Überschreiben (eine andere Art von Angriff).
Unter Windows XP mit CPUs, die dies unterstützen, ist die Hardware-DEP standardmäßig nur für bestimmte Windows-Systembinärdateien und auch für Programme aktiviert, die "Opt-In" wählen.
Unter Vista mit CPUs, die dies unterstützen, ist die Hardware-DEP standardmäßig für fast alle Prozesse aktiviert. Dies kann gelegentlich problematisch sein, normalerweise für ältere Programme und Treiber und für ISVs, die noch keine Vista-Tests durchgeführt haben.
Ich vermute, dass der erste Schritt darin besteht, herauszufinden, ob es sich um Software- oder Hardware-DEP handelt. Verwenden Sie auch C # / VB oder Managed C ++? Und verwenden Sie nativen Code oder Komponenten? Wenn Ihre Anwendung eine native Komponente oder ein ActiveX-Steuerelement verwendet, das mit dem alten ATL-Framework erstellt wurde, ist es sehr wahrscheinlich, dass Ihre Anwendung mit der Hardware-DEP fehlschlägt.
Seit .NET Framework 2.0 SP1 glaube ich, dass der C # -Compiler verwalteten Code ausgibt, der DEP-kompatibel ist. Wenn Ihre Anwendung jedoch DEP-Ausnahmen generiert, können Sie versuchen, das Flag IMAGE_DLLCHARACTERISTICS_NX_COMPAT für Ihre ausführbare Datei zu löschen. Dazu verwenden Sie EDITBIN.EXE aus dem VC-Toolset wie folgt:
%Vor%Wenn Sie Visual Studio verwenden, können Sie dem Projekt der ausführbaren Datei einen Post-Build-Schritt hinzufügen. Sie müssen die Umgebung so einrichten, dass die Abhängigkeiten von EDITBIN aufgelöst werden können. Wenn ich nativen Code als Teil meiner App verwende, sieht der Post-Build-Schritt wie folgt aus:
%Vor%Ältere Versionen von ATL sind DEP nicht bekannt. Wenn Sie also ActiveX-Steuerelemente verwenden, die mit ATL erstellt wurden und auf dieser Version von ATL (Version 7.1 und darunter, glaube ich) basieren, erhalten Sie DEP-Fehler.
Als letzten Ausweg können Sie DEP für den Prozess deaktivieren, indem Sie eine API-Funktion aufrufen: SetProcessDEPPolicy
.
Weitere Informationen zu SetProcessDEPPolicy
Die Compiler, die mit .NET 2.0 SP1 geliefert wurden, aktivieren das NXCOMPAT-Flag in dem Header der ausführbaren Datei. Sie können diese Markierung in einem Post-Build-Schritt deaktivieren, indem Sie EditBin.exe mit der Option / NXCOMPAT: NO ausführen.
FWIW, es ist erwähnenswert, dass Anwendungen in vielen Fällen nicht "inkompatibel mit DEP" sind, sondern eher zum Absturz gebracht werden und DEP "zur Rettung des Tages" einspringen. Sehr oft, sobald Sie DEP deaktivieren, werden Sie feststellen, dass Sie ein "gewöhnliches" AV schlagen.
Wenn Ihr Projekt ausschließlich in .NET 3.0 geschrieben wird, ist dies fast sicher der Fall, da .NET keine der "verrückten" Dinge ausführt, die DEP auslösen (z. B. Funktionsthunking usw.).
Um zu debuggen, installieren Sie einen Debugger oder aktivieren Sie Watson, um eine .DMP-Datei zu generieren, dann nehmen Sie diese .DMP-Datei auf den Computer des Entwicklers und finden Sie heraus, was schief gelaufen ist.
Beginnen Sie damit, herauszufinden, wo und wie Ihr Programm versagt. Können Sie das Problem auf Ihrem System replizieren? Mit der Aktivierung der DEP für die Anwendung auf Ihrem System? Wenn Sie das Problem replizieren können und den Fehler (Zugriffsverletzung) erhalten, können Sie versuchen, Ihr Programm zu reparieren.
Weitere Informationen zum DEP finden Sie im MSDN-Artikel .