Hallo, ich habe mich folgendes gefragt: Unzwar ist es möglich einen Screenshot von Programmen zu blockieren? Ich meine jetzt nicht die DRUCK taste, sondern Anwendungen(z.b. Trojaner) können ja auch Screenshots machen. Kann man dies Irgendwie verhinder? Im netz habe ich einiges gelesen das es nicht möglich wäre, dem kann ich aber nicht ganz zustimmen, denn die User Administration Control von Windows Blockiert während des Popups die Screenshot funktion, auch für jegliche anwendungen. Ich frage mich nun, gibt es da eine API die man darüber ansprechen kann?
Screenshot Blockieren?
- VB.NET
- .NET (FX) 4.0
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Mokki.
-
-
There is no CLOUD - just other people's computers
Q: Why do JAVA developers wear glasses?
A: Because they can't C#
Daily prayer:
"Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP." -
Nur das Program oder ganz Windows?
Lg Mokki -
Am besten wäre der gesamte Desktop, aber wenn es die eigene Anwendung betrifft wäre es auch gut. Das man z.b. wenn ein Screenshot getätigt wird, die eigene Anwendung schwarz zu sehen ist z.b.
-
-
Also damit kann ich nur die Drucktaste verhindern, aber nicht wenn eine Anwendung ein Screenshot Tätigt.
Schamash schrieb:
Hmm irgendwie hilft das auch nicht wirklich weiter, also wenn ich z.b. ein Screenshot tätigen möchte während die UAC aufplopt kommt die Fehlermeldung.
Mokki schrieb:
-
Also ich habe da jetzt was, hab es auch getestet. Nur kann ich kein C#, muss es also versuchen in VB umzuschreiben. ggf. kann ja jemand helfen der beide Sprachen kann
Es wird mit dieser Funktion ein neuer Desktop erstellt. Dabei wird folgendes Blockiert:
- Screenshots jeglicher art(Ob vom Programm oder mit der Drucktaste)
- Keylogger Block
C#-Quellcode
- using System;
- using System.Drawing;
- using System.Runtime.InteropServices;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace SecureDesktop
- {
- class Program
- {
- [DllImport("user32.dll")]
- public static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode, int dwFlags, uint dwDesiredAccess, IntPtr lpsa);
- [DllImport("user32.dll")]
- private static extern bool SwitchDesktop(IntPtr hDesktop);
- [DllImport("user32.dll")]
- public static extern bool CloseDesktop(IntPtr handle);
- [DllImport("user32.dll")]
- public static extern bool SetThreadDesktop(IntPtr hDesktop);
- [DllImport("user32.dll")]
- public static extern IntPtr GetThreadDesktop(int dwThreadId);
- [DllImport("kernel32.dll")]
- public static extern int GetCurrentThreadId();
- enum DESKTOP_ACCESS : uint
- {
- DESKTOP_NONE = 0,
- DESKTOP_READOBJECTS = 0x0001,
- DESKTOP_CREATEWINDOW = 0x0002,
- DESKTOP_CREATEMENU = 0x0004,
- DESKTOP_HOOKCONTROL = 0x0008,
- DESKTOP_JOURNALRECORD = 0x0010,
- DESKTOP_JOURNALPLAYBACK = 0x0020,
- DESKTOP_ENUMERATE = 0x0040,
- DESKTOP_WRITEOBJECTS = 0x0080,
- DESKTOP_SWITCHDESKTOP = 0x0100,
- GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU |
- DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK |
- DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP),
- }
- static void Main(string[] args)
- {
- // old desktop's handle, obtained by getting the current desktop assigned for this thread
- IntPtr hOldDesktop = GetThreadDesktop(GetCurrentThreadId());
- // new desktop's handle, assigned automatically by CreateDesktop
- IntPtr hNewDesktop = CreateDesktop("RandomDesktopName", IntPtr.Zero, IntPtr.Zero, 0, (uint)DESKTOP_ACCESS.GENERIC_ALL, IntPtr.Zero);
- // switching to the new desktop
- SwitchDesktop(hNewDesktop);
- // Random login form: used for testing / not required
- string passwd = "";
- // running on a different thread, this way SetThreadDesktop won't fail
- Task.Factory.StartNew(() =>
- {
- // assigning the new desktop to this thread - so the Form will be shown in the new desktop)
- SetThreadDesktop(hNewDesktop);
- Form loginWnd = new Form();
- TextBox passwordTextBox = new TextBox();
- passwordTextBox.Location = new Point(10, 30);
- passwordTextBox.Width = 250;
- passwordTextBox.Font = new Font("Arial", 20, FontStyle.Regular);
- loginWnd.Controls.Add(passwordTextBox);
- loginWnd.FormClosing += (sender, e) => { passwd = passwordTextBox.Text; };
- Application.Run(loginWnd);
- }).Wait(); // waits for the task to finish
- // end of login form
- // if got here, the form is closed => switch back to the old desktop
- SwitchDesktop(hOldDesktop);
- // disposing the secure desktop since it's no longer needed
- CloseDesktop(hNewDesktop);
- Console.ReadLine();
- }
- }
- }
//EDIT
Konnte es mit einem Konverter und bisschen handarbeit es doch noch einigermaßen hinbekommen, diese erstelle form wird allerdings nicht angezeigt, weiß jemand wieso nicht?
Spoiler anzeigen VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports System.Threading.Tasks
- Imports System.Drawing
- Imports System.Windows.Forms
- Module Module1
- <DllImport("user32.dll")> _
- Public Function CreateDesktop(ByVal lpszDesktop As String, ByVal lpszDevice As IntPtr, ByVal pDevmode As IntPtr, ByVal dwFlags As Integer, ByVal dwDesiredAccess As UInteger, ByVal lpsa As IntPtr) As IntPtr
- End Function
- <DllImport("user32.dll")> _
- Private Function SwitchDesktop(ByVal hDesktop As IntPtr) As Boolean
- End Function
- <DllImport("user32.dll")> _
- Public Function CloseDesktop(ByVal handle As IntPtr) As Boolean
- End Function
- <DllImport("user32.dll")> _
- Public Function SetThreadDesktop(ByVal hDesktop As IntPtr) As Boolean
- End Function
- <DllImport("user32.dll")> _
- Public Function GetThreadDesktop(ByVal dwThreadId As Integer) As IntPtr
- End Function
- <DllImport("kernel32.dll")> _
- Public Function GetCurrentThreadId() As Integer
- End Function
- Private Enum DESKTOP_ACCESS As UInteger
- DESKTOP_NONE = 0
- DESKTOP_READOBJECTS = &H1
- DESKTOP_CREATEWINDOW = &H2
- DESKTOP_CREATEMENU = &H4
- DESKTOP_HOOKCONTROL = &H8
- DESKTOP_JOURNALRECORD = &H10
- DESKTOP_JOURNALPLAYBACK = &H20
- DESKTOP_ENUMERATE = &H40
- DESKTOP_WRITEOBJECTS = &H80
- DESKTOP_SWITCHDESKTOP = &H100
- GENERIC_ALL = (DESKTOP_READOBJECTS Or DESKTOP_CREATEWINDOW Or DESKTOP_CREATEMENU Or DESKTOP_HOOKCONTROL Or DESKTOP_JOURNALRECORD Or DESKTOP_JOURNALPLAYBACK Or DESKTOP_ENUMERATE Or DESKTOP_WRITEOBJECTS Or DESKTOP_SWITCHDESKTOP)
- End Enum
- Sub Main()
- ' old desktop's handle, obtained by getting the current desktop assigned for this thread
- Dim hOldDesktop As IntPtr = GetThreadDesktop(GetCurrentThreadId())
- ' new desktop's handle, assigned automatically by CreateDesktop
- Dim hNewDesktop As IntPtr = CreateDesktop("RandomDesktopName", IntPtr.Zero, IntPtr.Zero, 0, CUInt(DESKTOP_ACCESS.GENERIC_ALL), IntPtr.Zero)
- ' switching to the new desktop
- SwitchDesktop(hNewDesktop)
- ' Random login form: used for testing / not required
- Dim passwd As String = ""
- ' running on a different thread, this way SetThreadDesktop won't fail
- ' assigning the new desktop to this thread - so the Form will be shown in the new desktop)
- Task.Factory.StartNew(Function() SetThreadDesktop(hNewDesktop)).Wait()
- Dim loginWnd As New Form()
- Dim passwordTextBox As New TextBox()
- passwordTextBox.Location = New Point(10, 30)
- passwordTextBox.Width = 250
- passwordTextBox.Font = New Font("Arial", 20, FontStyle.Regular)
- loginWnd.Controls.Add(passwordTextBox)
- Application.Run(loginWnd)
- AddHandler loginWnd.FormClosing, Function(sender, e)
- passwd = passwordTextBox.Text
- End Function
- ' waits for the task to finish
- ' end of login form
- ' if got here, the form is closed => switch back to the old desktop
- SwitchDesktop(hOldDesktop)
- ' disposing the secure desktop since it's no longer needed
- CloseDesktop(hNewDesktop)
- Console.ReadLine()
- End Sub
- End Module
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mr. Johny“ ()
-
Des ist für Konsolenanwendungen geschrieben. Ev. deshalb...
Zu meinem Link: Hast du alles gelesen(damit mein ich auch die Kommentare)? Ich denk nicht wirklich...
Aber die Lösung oben ist ja aich super.
Lg Mokki -
Mr. Johny schrieb:
weiß jemand wieso nicht?
Dein VB-StartNew
ist ein hohler Vogel, der C#-StartNew
ist eine lange anonyme Funktion.
Vielleicht machst Du aus der anonymen Funktion eine richtige, da verstehst Du auch die Abläufe besser.Gemeint ist der Inhalt der geschweiften Klammern:
Das wird bei Dir erst aufgerufen, wenn der Desktop bereits läuft.
====
Das ist auch eine Zeile zu weit hoch geraten.
====
@Mokki Diese App kann man auch einfach abbechen, indem der Dialog geschlossen wird. Da müsste schon noch getestet werden, ob das Passwort korrekt ist.
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
@Mokki Sorry, ich hab Deinen Link nicht verfolgt, ich nahm an, @Mr. Johny 's Code käme von da.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@rod es sei dir verziehen
So nub aber wieder </offtopic>
Lg Mokki -
Hier für diejenigen die es für VB haben möchten.
Spoiler anzeigen VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports System.Threading.Tasks
- Imports Microsoft.Win32
- Module SecureDesktop
- <DllImport("user32.dll")> _
- Public Function CreateDesktop(ByVal lpszDesktop As String, ByVal lpszDevice As IntPtr, ByVal pDevmode As IntPtr, ByVal dwFlags As Integer, ByVal dwDesiredAccess As UInteger, ByVal lpsa As IntPtr) As IntPtr
- End Function
- <DllImport("user32.dll")> _
- Private Function SwitchDesktop(ByVal hDesktop As IntPtr) As Boolean
- End Function
- <DllImport("user32.dll")> _
- Public Function CloseDesktop(ByVal handle As IntPtr) As Boolean
- End Function
- <DllImport("user32.dll")> _
- Public Function SetThreadDesktop(ByVal hDesktop As IntPtr) As Boolean
- End Function
- <DllImport("user32.dll")> _
- Public Function GetThreadDesktop(ByVal dwThreadId As Integer) As IntPtr
- End Function
- <DllImport("kernel32.dll")> _
- Public Function GetCurrentThreadId() As Integer
- End Function
- Private Enum DESKTOP_ACCESS As UInteger
- DESKTOP_NONE = 0
- DESKTOP_READOBJECTS = &H1
- DESKTOP_CREATEWINDOW = &H2
- DESKTOP_CREATEMENU = &H4
- DESKTOP_HOOKCONTROL = &H8
- DESKTOP_JOURNALRECORD = &H10
- DESKTOP_JOURNALPLAYBACK = &H20
- DESKTOP_ENUMERATE = &H40
- DESKTOP_WRITEOBJECTS = &H80
- DESKTOP_SWITCHDESKTOP = &H100
- GENERIC_ALL = (DESKTOP_READOBJECTS Or DESKTOP_CREATEWINDOW Or DESKTOP_CREATEMENU Or DESKTOP_HOOKCONTROL Or DESKTOP_JOURNALRECORD Or DESKTOP_JOURNALPLAYBACK Or DESKTOP_ENUMERATE Or DESKTOP_WRITEOBJECTS Or DESKTOP_SWITCHDESKTOP)
- End Enum
- Friend Function StartSecureWindow(ByVal frm As Form)
- ' old desktop's handle, obtained by getting the current desktop assigned for this thread
- Dim hOldDesktop As IntPtr = GetThreadDesktop(GetCurrentThreadId())
- ' new desktop's handle, assigned automatically by CreateDesktop
- Dim hNewDesktop As IntPtr = CreateDesktop("RandomDesktopName", IntPtr.Zero, IntPtr.Zero, 0, CUInt(DESKTOP_ACCESS.GENERIC_ALL), IntPtr.Zero)
- ' switching to the new desktop
- SwitchDesktop(hNewDesktop)
- ' Random login form: used for testing / not required
- Dim passwd As String = ""
- ' running on a different thread, this way SetThreadDesktop won't fail
- ' assigning the new desktop to this thread - so the Form will be shown in the new desktop)
- Task.Factory.StartNew(Function()
- SetThreadDesktop(hNewDesktop)
- AddHandler frm.FormClosing, Function(sender, e)
- Application.Exit()
- End Function
- Application.Run(frm)
- End Function).Wait()
- ' waits for the task to finish
- ' end of login form
- ' if got here, the form is closed => switch back to the old desktop
- SwitchDesktop(hOldDesktop)
- ' disposing the secure desktop since it's no longer needed
- CloseDesktop(hNewDesktop)
- Process.GetCurrentProcess().Kill()
- 'Console.ReadLine()
- End Function
- End Module
-
Mr. Johny schrieb:
für VB
Wie muss das aufgerufen werden?
Waas passiert mit dem Passwort?Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Das Passwort, ist ja auch so in den Kommentaren beschrieben, wird nicht verwendet sondern ist nur für Testzwecke(eine Form wird auf dem Desktop erstellt).
Lg Mokki -
@Mokki Im vorigen Code wurde das noch verwendet, @Mr. Johny hat inzwischen viel editiert und m.E. zuviel weggenommen oder ausgelagerten Code nicht gepostet.
Die Variablepasswd
wird nicht verwendet.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Die Variable wurde davor nur verwendet um aus einer Passwortform die Eingabe in eine Variable zu speichern u. danach die Variable zu vergessen. Und die Passwortform wurde nur deshalb erstellt damit eine Form auf dem neune Desktop liegt.
Lg Mokki -
Mokki schrieb:
verwendet
@Mr. Johny war so frei, seinen unvollständigen und somit verstümmelten Off-Code in Post #13 als fertige Lösung anzubieten. Das habe ich hinterfragt.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Ah dann hab ich dich falsch verstanden, sry.
Lg Mokki -
Also, ich habe das mit der passwordform entfernt, da es aus einem Beispiel Projekt stammt wo demonstriert werden soll das der Secure Desktop vor Keylogger sicher ist. Ich habe den Code so angepasst das man ihn als Module in seine Anwendung einbauen kann und eine belibige Form seiner Wahl in den Secure Desktop starten kann.
-
Ähnliche Themen
-
Internetseite blockieren (egal welcher Browser)
julivb5432112345 - - Sonstige Problemstellungen -
Techno7 - - Sonstige Problemstellungen
-
Webbrowseraktualisierung blockieren
Streamfighter - - Sonstige Problemstellungen
-
4 Benutzer haben hier geschrieben
- Mokki (11)
- Mr. Johny (8)
- RodFromGermany (5)
- Schamash (1)