2009-04-21 17 views
5

Piszę aplikację Windows. Jak mogę sprawdzić, kiedy zostanie zrobiony zrzut ekranu? Czytałem o tym, jak wykryć naciśnięty klawisz skrótu, ale bardziej martwię się przypadkiem, w którym co 100 ms inny program robi zrzuty ekranu. Mianowicie, próbuję zauważyć, że ktoś tworzy inny program (np. Python używający ImageGrab, jak wspomniano w innym poście), który stale wykonuje zrzuty ekranu mojej aplikacji i używa ich do czytania informacji poza nią.Wykryj, kiedy użytkownicy robią zrzuty ekranu mojego programu

Nie dbam zbytnio o zapobieganie pobieraniu zrzutów ekranu - mogę po prostu zablokować użytkownika, gdy tylko zauważymy to zachowanie.

Czy to możliwe? Czy wiadomość o Windows jest wysyłana, gdy jakakolwiek aplikacja pobiera zrzut ekranu, np. Z WM_HOTKEY? Czy też okna używają najnowszych informacji z najnowszych wydarzeń związanych z farbą i zwracają je bezpośrednio do innego programu, a moja aplikacja nie może tego w ogóle zauważyć?

+0

Chcesz zakazać osobom, które robią zrzuty ekranu Twojej aplikacji? – jjnguy

+0

Bardzo blisko związane: http://stackoverflow.com/questions/767212/programattically-taking-screenshots-in-windows-without-application-noticing –

+0

@jinguy: byłoby to bardzo przydatna rzecz do zrobienia dla aplikacji który wyświetla dane wrażliwe ... –

Odpowiedz

27

Cokolwiek zrobisz, ludzie znajdą sposób obejścia tego. Załóżmy, że istniała taka metoda, w której można niezawodnie wykryć inny program wykonujący zrzut ekranu aplikacji. Aby to obejść, mógłbym zainstalować VirtualBox, uruchomić aplikację wewnątrz maszyny wirtualnej, a następnie mieć program zrzutu ekranu VirtualBox (który następnie zawiera twoją aplikację). Twoja aplikacja nie ma absolutnie żadnego sposobu, aby wiedzieć, że zrobiono jej zdjęcie.

+0

O ile VirtualBox nie symuluje wykonywania zrzutów ekranu w ten sam sposób, w jaki robi to Windows. Z twojej odpowiedzi mówisz, że tak nie jest? – Claudiu

+0

Nie mówię o robocie VirtualBox; Mówię o innym programie wykonującym zrzut ekranu * z * VirtualBox. W końcu VirtualBox jest po prostu oknem z kilkoma pikselami. –

+0

Oto co miałem na myśli. W mojej głowie wywoływana jest określona funkcja po wywołaniu "takeScreenshot()". Ta funkcja rekurencyjnie wywoływałaby "takeScreenshot()" wszystkich otwartych okien (tak by Desktop nazwał ją wszystkimi programami w/otwartymi oknami). VirtualBox może zdefiniować swój program obsługi dla "takeScreenshot()", aby symulować wywoływanie tego "takeScreenshot()" we wszystkich aplikacjach, które symuluje. Nie jestem pewien, czy tak to działa, dlatego proszę tutaj. – Claudiu

7

Co się stanie, jeśli używam kamery wideo? Co się stanie, jeśli przechwycę wideo przesyłane między komputerem a monitorem?

Będę zaskoczony, gdy dowiem się, że istnieje jakiś praktyczny sposób, aby to zrobić.

+11

nadal pracuje nad prototypem bionicznego ramienia, który zamaskuje się jako klucz licencyjny! Po prostu dusi użytkownika, jeśli spróbuje użyć kamery wideo lub kamery. –

+1

+1 dla Dr.Zło za to, że naprawdę mnie rozśmieszyłem. – Tokk

1

Sposób, w jaki zwykle robię zrzuty ekranu (z C#), to wywołanie funkcji BitBlt, która jest podstawą wielu obrazów ekranowych. Nie wiesz, jak możesz przechwycić wywołania do niego w jakikolwiek znaczący sposób, ponieważ prawdopodobnie każdy program w systemie używa go na niskim poziomie.

+0

Widziałem kod sprawdzający koncepcję w programie do oszukiwania strzelanek 1-osobowych, który zamroził wątek ekranu, aż do wyłączenia HUDa. Myślę, że zahaczył BitBlt lub coś podobnego. –

2

Ciężko jest całkowicie go powstrzymać ... Użytkownik, który jest wystarczająco zdeterminowany, może po prostu zrobić zdjęcie ekranu za pomocą cyfrowego aparatu fotograficznego.

1

Zakładam, że tak naprawdę nie można, ponieważ zawsze można uruchomić program w oknie z maszyną wirtualną, a następnie za pomocą programu do przechwytywania na platformie zewnętrznej, a wiedza, czy to się dzieje, jest bardzo trudna. Sugeruję, aby zastanowić się nad sposobami specjalnego renderowania tempa lub przeplotu, specjalnych kontrastów, itp ...

Można również wyświetlać wyjścia na ekranie, tak jakby był to film, kodować go za pomocą enkodera o niskiej szybkości i rozdzielczości, aby nadal przechwytywać każde 100ms będzie tak niskiej jakości, że byłoby bezwartościowe. (Czy zdarzyło Ci się zamrozić film o niskiej jakości?)

, ale naprawdę powinieneś rozważyć zastosowanie innych sposobów ochrony informacji.

7

To nigdy nie zadziała. Co więcej, próby zapewnienia takiego poziomu bezpieczeństwa będą niedogodne dla 99% uprawnionych użytkowników.

Być może najlepiej jest podejść do problemu od strony próby zidentyfikowania niechcianych zastosowań/kopii twoich informacji i podejść do osób/firm wykorzystujących te informacje.

Prawo autorskie jest właściwe dla tego podejścia, ale rozumiem, że istnieją pewne przesłanki, w których takie podejście nie jest dostępne.

3

Po pierwsze, komentarze na temat korzystania z maszyny wirtualnej są całkowicie bezcelowe - o wiele łatwiej jest wykryć okna działające pod wirtualizerem niż wykrywanie pobieranego zrzutu ekranu.

Dobrym sposobem na utrudnianie wykonywania zrzutów ekranu byłoby przepisanie programu, aby działał w trybie pełnoekranowym przy użyciu jakiegoś rozszerzenia rodowego.

Dobrym sposobem na zablokowanie 95% użytkowników, którzy kiedykolwiek próbowali wykonać zrzut ekranu, jest wyświetlenie na starcie ogromnego, migającego banera ("Zrzuty ekranu są zabronione!") I wykrycie użytkownika naciśnięciem klawisza PrtScrn w ciągu 15 sekundy.

+0

Hah at ostatni akapit =). – Claudiu

+0

Zastanawiam się tylko, dlaczego tak niewiele zyskało ... –

+0

"O wiele łatwiejsze do wykrycia okna działające pod wirtualizatorem" - tak, więc używam mojej legalnie licencjonowanej kopii WinXP w VM na Linuksie; a twoim celem jest ...? – Piskvor

2

Innym powodem, dlaczego myślę, że będzie to niemożliwe do osiągnięcia tego celu:

Dawno, dawno temu, nie udało mi się zrobić zrzut ekranu zawartości programu Windows Media Player, ponieważ (Przypuszczałem) WMP strumieniowo że treści do karty wideo od razu. (Szczegóły zabawy: po wklejeniu przechwytywania ekranu wideo będzie nadal odtwarzane w programie MS Paint, ale zapisanie obrazu spowoduje czarny kwadrat). W każdym razie użycie VNC bardzo ułatwiło przechwycenie ekranu.

+0

To samo przydarzyło się też mnie. Zawsze zastanawiałem się, dlaczego. – Claudiu

+3

Nie sądzę, że Media Player robi to, aby zapobiec zrzutom ekranu - to jest efekt uboczny. Takiej nakładki nie można normalnie przechwycić. Jeśli jednak wyłączysz przyspieszenie sprzętowe, nie użyje on nakładki i możesz zrobić zrzut ekranu. –

+0

W rzeczywistości uważam, że jest to efekt uboczny. (Chociaż Microsoft może chcieć zatrzymać nagrywanie ekranu dla zawartości zabezpieczonej DRM.) – Arjan

4

Możesz (nierozwiązywalnie) zrobić to za pomocą SetWindowsHookEx.

Here is a complete VB.NET example.

Jednakże, istnieje wiele sposobów obejścia tego. Haczyk zainstalowany po twoim "obejmie" twój haczyk. Użytkownicy mogą robić zdjęcia swojego ekranu na wiele sposobów, zgodnie z opisem w tym wątku. Spróbowałbym rozważyć inne opcje ochrony niż to.

-1

jest jeden sposób, który moim zdaniem może go zatrzymać. dowiedzieć się o technologii, która zaciera wyświetlacz graficzny, gdy jest na przykład powielana.

zrzut ekranu, sfotografowany aparatem cyfrowym zrzut ekranu z wirtualnego os.

Zagraj z nim, kto wie, że możesz wymyślić coś, co spowoduje miliony.

+0

"zaciera graficzny wyświetlacz, gdy jest powielony" - to jest science-fiction, a nie aktualna technologia. Bity, które stają się obrazem wyświetlanym, są wielokrotnie duplikowane i modyfikowane przed przejściem z programu przez system operacyjny na sprzęt. Prawdziwym problemem jest odszyfrowanie intencji, która jest wystarczająco trudna dla ludzi, nie wspominając o instrukcjach komputerowych. – Piskvor

Powiązane problemy