Autor Beitrag
olliterski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: Do 27.06.13 15:06 
Hallo,

vielleicht habt ihr eine Idee!

Ich muss es irgendwie auf die Reihe kriegen, in einem Programm dafür zu sorgen, dass weder Text kopiert und in einem anderen Programm eingefügt werden kann noch das an irgend ein Programm ein Screenshot gesendet werden kann!

1. Idee: Tastencodes abfangen
Vorteil:
  • läßt sich schnell umsetzen, da wenige Tasten zu berücksichtigen sind

Nachteil:
  • zwischenablage kann über anderes Programm gefüllt und ausgelesen werden
    (Bsp.: Word2013->Einfügen->Screenshot, FastStoneCapture, usw.)


2. Idee: Über TTimer das Clipboard löschen
Vorteil:
  • egal wer da was einfügt, er kriegt es eigentlich nicht so schnell da raus, weil es vorher gelöscht wird

Nachteil:
  • Ich müßte den TTimer auf ca. 100 ms einstellen um zu verhindern das jemand doch was auslesen kann
  • ich würde mein Programm permanent auf den Speicher pollen lassen, was sich negativ auf das System auswirken könnte


3. Idee: Auf Änderungen der Zwischenablage reagieren
Vorteil:
  • klingt nach der eleganteren Lösung - Löschen nur wenn was eingefügt wurde
  • ich muss beim Programmaufruf auf nichts achten und beim Beenden des Programms auch nicht, das permanente pollen auf den Speicher würde auch entfallen

Nachteil:
  • auf meinem privaten Rechner mag das ja gehen, da fragt mich kein Schwein ob ich Adminrechte habe oder nicht - könnte woanders aber anders sein!
  • ich konnte bis jetzt noch nicht klar ermitteln, ob die entsprechenden WIN-Messages Adminrechte erfordern oder nicht


4. Idee: Clipboard deaktivieren, solange mein Programm läuft
Vorteil:
  • egal welches Programm versucht etwas ins Clipboard zu schreiben - da kommt nichts an, weils deaktiviert ist!

Nachteil:
  • Läßt sich das Clipboard überhaupt so einfach abschalten? (ohne GPO, Reg und Co.)
  • wie kann man ohne Adminrechte auf einem Rechner das Clipboard abschalten?


Ich frage mich natürlich auch ob es nicht einfach ausreicht, die Form auf StayOnTop zu setzen und einmal am Programmende das Clipboard zu löschen!?!

Vielleicht habt ihr ja eine Idee!

Bin da sowohl für eine elegante Lösung, als auch für eine pragmatische Lösung zu haben!

_________________
Viele Grüße
Oliver
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 27.06.13 15:34 
Es ist absolut unmöglich zu erreichen, dass man auf keinen Fall ein Bild des Monitors hat. Egal wie du es anstellst:
  • Fernwartungstool: Ich kann den Screenshot bequem z.B. auf einem anderen PC über TeamViewer machen
  • Per Programm den Fensterinhalt direkt auslesen
  • Fotoapparat
  • Monitorausgang an anderes Gerät anschließen
  • ...

user profile iconolliterski hat folgendes geschrieben Zum zitierten Posting springen:
  • zwischenablage kann über anderes Programm gefüllt und ausgelesen werden
    (Bsp.: Word2013->Einfügen->Screenshot, FastStoneCapture, usw.)
Wie kommst du darauf, dass da die Zwischenablage benutzt wird? Da wird einfach der hDC des Fensters ausgelesen und fertig.

Auf dem PC selbst kannst du mit Hooks viel unterbinden, nur wird dann auch viel im System nicht mehr funktionieren...

Was willst du damit denn erreichen? Vielleicht gibt es ja andere Möglichkeiten...
olliterski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: Do 27.06.13 17:53 
Hallo Jaenicke,

also ich hatte eigentlich vor ein Testtool zu schreiben!

Da gibt es zwar schon viele, aber die haben alle irgendwas an sich, das sie total unbrauchbar für meine Zwecke macht.

Ausgangssituation ist folgende:
- das Programm ist eigentlich für den Hausgebrauch gedacht; u.U. werde ich das aber auch der Schule meiner Kids zur Verfügung stellen
- es wird maximal in einem Schulnetz laufen, in dem ein ganz normales Netz mit Windows-Clients ohne TerminalServer, TeamViewer und ähnliche Spezialitäten sein wird. (was die eine oder andere Capture-Software nicht ganz auschließt!)
- damit die Kids aber nicht anfangen sich die Fragen rauszukopieren (weder als Text, noch als Pic), wäre es praktisch, wenn man das unterbinden könnte!

Mein erster Gedanke - und da geh ich mal von Kids aus, die es erst mit ctrl+C/+V versuchen - wäre der, solche Aktionen übers Clipboard zu verhindern.

Daran, das man auch das Fenster direkt auslesen kann, hab ich - zugegeben - überhaupt nicht gedacht, wobei ich den Kids jetzt auch mal unterstelle, dass sie nicht auf biegen und brechen nach dieser Schwachstelle suchen würden!

Kurzum, ein Testtool, das auf einem oder mehreren Rechnern läuft, ohne jede Möglichkeit, die Prüfungsfragen rauszukopieren (weder Text nich Pic). Denn wenn Sie einen Test wiederholen, sollen sie sich vorher keinen Spikzettel ausdrucken können - die Fragen sollen im Testtool bleiben!

Fernwartungstools - muss ich dabei nicht berücksichtigen.
Copy&Paste, PrintScreen - die ersten Tasten die jeder drückt und die man - irgendwie - ausschließen sollte.
Fotoapparat, Cam in Handy - ...Handy sollte im Unterricht eh aus sein.

Bei den Office-Produkten bin ich mir grad nicht sicher, aber ich denke die werden eher das Fenster direkt ansprechen.

Vielleicht muss ich das Fenster in den Vordergrund setzen. In diesem Fall müßte ich aber auch verhindern das ein anderes Fenster den Focus bekommt.
Da könnte ich zwar modal arbeiten, aber meine grauen Zellen haben irgendwie noch in Erinnerung, dass ich dann verschiedene andere Funktionen nicht ohne weiteres ausführen kann (z.B. öffnen eines Zusätzlichen Fensters in dem eine Grafik zur Aufgabenstellung angezeigt wird)!
Selbst wenn ich das Fenster permanent in den Vordergrund setze, müßte ich irgendwie verhindern, das man während der Ausfühurng des Programms mit Alt+Tab o.ä. in einer anderen Anwendung nicht doch irgendwas einfügen kann!

B.t.w. - es gibt ein Programm, das in etwa genau das macht was ich mir so vorstelle -> Visual Cert Exam,
aber im Hinblick darauf, dass das Programm mal auf mehreren Rechnern laufen könnte, wären auch 149 Euronen fällig!
Ausserdem sind die Updates zwar lebenslang kostenlos, aber wenn sie groß sind, können sie auch wieder kostenpflichtig werden!

Da setz ich mich lieber hin und programmier es lieber selbst! Auch wenn sich das nicht ganz so einfach machen läßt, wie es sich momentan abzeichnet!

_________________
Viele Grüße
Oliver
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 27.06.13 21:24 
Also bei dem Anwendungszweck würde ich sagen, das Bild onTop zu setzen und den ganzen Bildschirm ausfüllen zu lassen, würde reichen.
Es gibt wenige Programme, die ihr Fenster ebenfalls nach vorne zwingen und sowas wie Office wird es bestimmt nicht sein.
Wenn du danach dann den Zwischenspeicher leerst, sind auch Screens weg.
Das wäre ja soweit schon eine deiner Ideen.

Wenn du weitere Fenster benötigst, weiß ich nicht, ob das Probleme gibt, aber was bestimmt funktioniert:
Du deaktivierst alle Elemente der Form und legst die zweite Form als ganzes Control in diese Form hinein, über den restlichen Dingen. Da können sie sich dann alles ansehen, zwischen den Bildern oder was auch immer, wechseln oder die Ansicht schließen und weiter raten.

Extra Software, die die Daten heraus findet, kannst du natürlich nicht ausschließen und du kannst auch kein gutes Gedächtnis ausschließen, dass sich die Fragen einfach merkt, aber du kannst andere Fragen bereit stellen.
Richte doch ein, dass diese Fragen jedes mal von dem Lehrer-PC geladen werden. Dort liegt dann eine extra Software, mit einem Passwort geschützt, die auf die Anfrage jedes Programms von jedem Schüler wartet und dann die Fragen sendet. Entweder einzeln, oder im Paket vor Testbeginn. Zusätzlich baust du dann eine Funktion ein, die diese Fragen definieren (und gegebenenfalls bei Ankreuz-Fragen die Antworten auch auswerten) kann und in eine verschlüsselte Datei legt. Dann kann der Lehrer Zuhause den Test vor bereiten, nimmt ihn dann via Stick mit in die Schule und die kleine Andock-Software sendet jedem Schüler einzeln die Fragen, empfängt die Antworten, wertet syntaktisch einfache Fragen aus und schreibt das Ganze in eine weitere Datei, die der Lehrer dann Zuhause komplett auswerten kann.


An sich kommst du nicht darum herum, immer andere Fragen bereit zu stellen, da es schlicht nicht möglich ist, zu verhindern, dass die Schüler die Fragen weiter geben, aber da in den meisten Schulen sowieso ein internes Netzwerk existiert, wo alle Rechner verbunden ist, finde ich, dass diese Herangehensweise mit neuen Fragen doch eine recht sichere Methode ist.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Do 27.06.13 22:04 
user profile iconolliterski hat folgendes geschrieben Zum zitierten Posting springen:
Ich muss es irgendwie auf die Reihe kriegen, in einem Programm dafür zu sorgen, dass weder Text kopiert und in einem anderen Programm eingefügt werden kann noch das an irgend ein Programm ein Screenshot gesendet werden kann!

1. Häng Dein Programm in die Clipboard-Kette rein.
2. Immer dann, wenn Dein Programm eine wm_DrawClipboard-Botschafft erhält (es wurde etwas ins Clipboard eingefügt), löscht das Programm den Clipboard-Inhalt.

Da die Druck-Taste ebenfalls mit dem Clipboard arbeitet, wird (siehe oben Punkt 2) der Screenshot ebenfalls gelöscht.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Clipbrd;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMChangeCbChain(var Msg: TMessage); message wm_ChangeCbChain;
    procedure WMDrawClipboard(var Msg: TMessage); message wm_DrawClipboard;
  end;

var
  Form1: TForm1;
  NextClipboardViewer : Integer;

implementation

{$R *.DFM}

procedure TForm1.WMChangeCbChain(var Msg: TMessage);
begin
  if Msg.wParam = NextClipboardViewer then
    NextClipboardViewer := Msg.lParam
  else
    SendMessage(NextClipboardViewer, wm_ChangeCbChain, Msg.wParam, Msg.lParam);
end;

// uses Clipbrd wegen Clipboard.Clear;
procedure TForm1.WMDrawClipboard(var Msg: TMessage);
begin
  SendMessage(NextClipboardViewer, wm_DrawClipboard, Msg.wParam, Msg.lParam);
  Clipboard.Clear;
  Label1.Caption := 'Clipboard geändert um: ' + TimeToStr(Now);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  ChangeClipboardChain(Form1.Handle, NextClipboardViewer);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  NextClipboardViewer := SetClipboardViewer(Form1.Handle);
end;

end.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 27.06.13 22:13 
Wenn es um den Zweck geht, erstell einfach einen Prüfungsuser, der schlicht keine Rechte hat irgendetwas zu starten oder zu speichern. Leeres Startmenü, deaktivierter Taskmanager usw.

Alternativ trag dein Programm als Shell ein und deaktiviere den Taskmanager usw., dann kann auch keiner was machen.
olliterski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: So 30.06.13 17:05 
Hallo,

erstmal vielen Dank für die Ideen und Anregungen!

Ich hab jetzt mal die letzten Tage verschiedene Vorgehensweisen durchdacht.
Es wird wahrscheinlich auf folgendes rauslaufen:
- 2 Programme; eins für den Lehrer/Testersteller, eins für die Schüler um die Testdatei die vom Lehrer erstellt wurde zu importieren
- Das Programmfenster werde ich auf StayOnTop setzen, halte mir aber die letzte Idee von jaenicke mit dem Prog als Shell offen (Prüfungsuser geht leider nicht!)
- vor dem Beenden des Programms werde ich auch nochmal das Clipboard leeren (Danke Gerd, hatte das zwar schon selber ins Auge gefasst aber den Code nicht mehr gefunden!)

Das ist natürlich nur der grobe Rahmen, denn inzwischen quält mich in diesem Zusammenhang ein ganz anderes Problem! Klick mich! -> vorerst gelöst!

...to be continued.... ;)

_________________
Viele Grüße
Oliver
Anwender
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 9



BeitragVerfasst: Mi 10.07.13 09:13 
Zitat:
(Prüfungsuser geht leider nicht!)


mhh,
also die Schule will damit reale Prüfungen abhalten? die benotet werden?

Dann müssen die einen Admin oder Lehrer abstellen, die so einen "Prüfg.User" an jedem Rechner einrichtet. (wo dann nur noch Teamviewer im Hintergrund läuft)

Außerdem: Was spricht dagegen, alle 500-1000 Tics (1 Sec) die Zwischenablage zu leeren? Kaum ein Kind wird so schnell den Wechsel zwischen 2 Programmen schaffen.
einfach Clipboard.clear;

Ich denke auch, eine Androhung "der Beobachtung mehrerer(= aller) Rechner gleichzeitig via Teamviewer" auf aufälliges Verhalten, würde ausreichen - um im Falle eines Täuschungversuchs (starten anderer Programme) das Bestehen in Frage zu stellen.

Außerdem:
Screenshots kann man auch mit anderen Programmen (per USBstick) wie faststone mit anderen Tasten auslösen.

Unbedingt solltest Du in jedem Falle die Dateien komplett verschlüsseln und erst im RAM entschlüsseln.
Was nützt der ganze Schutz vor Clipboard oder Screenshot, wenn die Kids die Dateien mit notepad auslesen/ausdrucken können?
Das Passwort dann besser auch nicht im Klartext einbauen.

Ob man die auf anderen Rechnern ablegen muß - es gibt doch auch geschützte Verzeichnisse. Per Dateirecht.

Das Testprogramm solltest Du auch mit einem Masterpasswort versehen.
Oder mit einem allgemeinen (oder UserID-persönlichem) Sitzungsspasswort (per LAN abgleichen?) versehn. Dann kann kein Kind das Programm während einer anderen Schulstunde (php, pascal, BWL) starten und bearbeiten.
[falls das mit LAN zu aufwendig ist - mögl. auch ein spezielles Codewort, das aus dem Datum und der Stunde (nicht volle Uhrzeit, weg. Abgleich) auf dem Lehrerrechner errechnet und auf den Clients abgeglichen wird]
da reicht ja ein if Crypt(5F11E720EFC6FA) = deCrypt(Tag+Stunde) then


ganz fies wäre - wenn man 2 Fragenpools erstellt:
einen richtigen und einen für den Fall, daß wer mit STRG + C arbeitet, wo dann unauffällig präpariert getürkte Antworten in die Zwischenablage kopiert/ersetzt werden.
Damit kann man dann Schwarze Schafe ausfiltern.
Die Antworten aus dem zweiten müssen ja nicht direkt falsch sein - aber einfach unpassend. - niemand wird aufgefordert zu Pfuschen !

ich setze mal voraus, daß Du die Reihenfolge der Fragen nicht immer gleich läßt, oder?
Du solltest schon für jeden Client-Rechner/Sitzung rotieren lassen.

handelt es sich um ausformulierte Antworten oder klickbare Multiple Choice?
sonst reicht unter den Kids ja: "Kevin, merkt Dir einfach 1, 5 , 5 , 4 ,2 ,1 ,3 ...."

ebenfalls könntest Du die PRNT-Taste per Hook abfangen und ein präpariertes (während der Laufzeit generiertes , den Text mit weißem Rechteck und neuem Text passend überlagertem ) Screenshot Bild in der Zwischenablage austauschen, was dem Original ziemlich ählich sieht, die Fragen aber aus dem zweiten Pool verwendet.
aufwändig, aber Gemein :D

Wieso muß Office eigentlich nebenher laufen?
Und wieso hast Du eigentlich Sorge um CTRG+C?
Du präsentierst die Fragen doch nicht etwa in einem Edit.Text oder Memo1.text? oder Ritchtext? womöglich noch RTF.enbabled := True???

Oder zeigst Du die Fragen per Word-Fenster an??

gib das höchstens als Label.caption aus oder mach Memo1.enabled := false;!


Mhh, aber ich glaub, das wird alles zu leicht buggy, wenn Du alles das berücksichtigst.

auf Clients für Sprach-Tests in Instituten wird per boot übrigens nur das eine Programm geladen - alle anderen blockiert, evlt. noch überwacht. Aber sicherer gehts dann nicht.