Ich habe einen Prozess, der einige wichtige Werte im Speicher haben wird. Ich möchte nicht, dass jemand in der Lage ist, den Speicher meines Prozesses zu lesen und diese Werte zu erhalten. Also habe ich versucht, ein Programm zu erstellen, das die Liste der laufenden Programme anschaut und feststellt, ob eines davon ein "Debugger" ist usw. Aber mir wurde klar, dass jemand einfach ein schnelles Programm schreiben könnte, um den Speicher meines Prozesses auszulesen. Ich weiß, dass der Speicher mehrerer Prozesse auf meinem System geschützt ist. Wie könnte ich auch diesen erhalten? (ps: Ich benutze C#)
Antworten
Zu viele Anzeigen?Jede Anwendung, die unter einem Benutzer mit ausreichenden Rechten (z.B. lokaler Administrator) läuft, kann ReadProcessMemory und Ihren Prozess jederzeit nach Belieben auslesen, ohne dass er mit dem Debugging-Port Ihres Prozesses verbunden ist und ohne dass Ihr Prozess in der Lage ist, dies zu verhindern oder gar zu erkennen. Und ich gehe noch nicht einmal darauf ein, was ein Systemkernel-Treiber tun kann...
Letztlich sind alle Lösungen, die es dafür gibt, entweder Schlangenöl oder nur ein Weg, das Problem zu verschleiern, indem man die Messlatte höher legt, um es schwieriger zu machen. Einige machen es wirklich schwer, aber keine ist kugelsicher. Letztendlich kann man aber nichts vor einem Benutzer verbergen, der physischen Zugang zum Rechner hat und über ausreichend hohe Berechtigungen verfügt.
Wenn Sie nicht wollen, dass die Benutzer etwas lesen, lassen Sie es einfach auf dem Rechner des Benutzers. Verwenden Sie ein Dienstmodell, bei dem sich Ihre IP auf einem Server befindet und die Benutzer über das Internet darauf zugreifen (z. B. Webdienste).
Zunächst einmal wird es immer eine Möglichkeit geben, das Speicherabbild Ihres Programms zu dumpen. Ihr Programm kann dies nur erschweren, aber nicht unmöglich machen. Abgesehen davon kann es Möglichkeiten geben, die Werte zu "verstecken". Es wird allgemein als schwierig und nicht der Mühe wert angesehen, aber es gibt Programme, die diese Werte im Speicher verschlüsseln. Um sie verwenden zu können, müssen sie jedoch vorübergehend entschlüsselt und anschließend wieder verschlüsselt (oder verworfen) werden.
Während die Verschlüsselung mit dem .Net-Framework einfach ist, ist das Verwerfen des entschlüsselten Wertes in C# nicht so einfach möglich. In C würde man einen Speicherbereich zuweisen, um die entschlüsselten Werte zu speichern, und diesen löschen (indem man Nullen oder Zufallsdaten hineinschreibt), bevor man ihn freigibt. In C# gibt es keine Garantie dafür, dass Ihre Daten nicht irgendwo gespeichert werden (Caching, Garbage Collection) und Sie nicht in der Lage sein werden, sie zu löschen. Allerdings, wie eulerfx in einem Kommentar bemerkt, in .Net 4.0 SecureString verwendet werden können. Wie sicher das ist, weiß ich nicht.
Wie Sie sehen, wird es immer eine kurze Zeit geben, in der der Wert unverschlüsselt im Speicher liegt, und das ist hier die Schwachstelle.
Ich denke, der beste Weg ist eine kommerzielle Lösung wie die folgende PDF-Broschüre ist dies ihre Website . Wenn Ihnen der Schutz der Anwendung vor Sniffing, IP-Diebstahl usw. wirklich am Herzen liegt, sollten Sie lieber diesen Weg einschlagen, anstatt eine eigene Lösung zu entwickeln...
Bearbeiten: Ich würde mir nicht vormachen, dass die Lösung, die ich mir ausdenken werde, manipulationssicher, rissfest und idiotensicher sein wird. . Überlassen Sie das einem Unternehmen wie dem von mir erwähnten Arxan (ich bin kein Handelsvertreter - ich gebe nur ein Beispiel). Es könnte zwar kostspielig sein, aber Sie können nachts besser schlafen, wenn Sie wissen, dass es so ist. viel schwieriger für einen Knallkörper, als wenn ein keine Lösung Überhaupt...