ekran belleğinin alınmasının önlenmesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
danaci
Üye
Mesajlar: 178
Kayıt: 24 May 2005 01:45

ekran belleğinin alınmasının önlenmesi

Mesaj gönderen danaci »

arkadaşlar mrb,
yerel ağda bulunan makinaların neler yaptığını izleyen programları yanıltmak amacıyla, ekranın görüntüsünün yerine sabit bir resim ya da görüntüyü yollamak mümkün olabilecek bir prg yazılabilirimi?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Diğer bir başlıkta PrtScrn tuşunu (clipboard'a ekranın bir resmini çekip kopyalar) takip ederek iptal edip - edememek üzerine konuşmuştuk. Arkadaşımız programındaki formların resminin çekilmesini engellemek istiyordu. Ref: viewtopic.php?t=19230#110339

- Seninki de benzer bir konu.

- Orada bunun mümkün olmadığını söylemiştim ama şimdi aklıma bir fikir geldi. Her iki başlığa da aynı fikri yazmaktansa buraya cevabı yazıp oraya bu linki refere etmek en doğrusu sanırım...

- Yapacağımız şey Clipboard'a yakalanan bir Bitmap var mıyı takibe almak... Bunun için WM_ mesajlarını kullanıcaz... Bu metodu daha önce DivXTurk projemde web sayfasındaki film afişinin resmini sağ mouse ile kopyala deyince yakalamak için kullanmıştım..

Unutmadan Uses ClipBrd;

Kod: Tümünü seç

  private
    { Private declarations }
    procedure WMDrawClipboard(var Msg: TMessage);
        message WM_DRAWCLIPBOARD;
    procedure WMChangeCBChain(var Msg: TMessage);
        message WM_CHANGECBCHAIN;
Projemizin her tarafından erişebileceğimiz Global nitelikte iki tane değişkenimiz var.

Kod: Tümünü seç

Var
  xBizimKontrolumuz : Boolean = False;
  xClipBoard        : THandle;
- Screen Capture yapıldığında ekran yerine gönderilecek fake ekran :lol:

Kod: Tümünü seç

Procedure SuprizYap();
Var
  Resim : TBitmap;
  Clip  : TClipBoard;
  Mesaj : String;
begin
  Mesaj := 'Ekran Görüntüsü Almak Yasaktır...!';
  Resim := TBitmap.Create;
  Resim.Width  := 1024;
  Resim.Height := 768;
  Resim.Canvas.Brush.Color := clBlue;
  Resim.Canvas.Font.Color  := clYellow;
  Resim.Canvas.Font.Name   := 'Times New Roman';
  Resim.Canvas.Font.Size   := 48;
  Resim.Canvas.TextOut( (Resim.Width-Resim.Canvas.TextWidth(Mesaj)) div 2 , (Resim.Height- Resim.Canvas.TextHeight(Mesaj)) div 2, Mesaj);
  Clip := TClipBoard.Create;
  Clip.Assign( Resim );
  Clip.Free;
  Resim.Free;
end;

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
  KeyPreview := True;
  FormStyle  := fsStayOnTop;
  xClipBoard := SetClipboardViewer(Handle);
end;

Kod: Tümünü seç

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ChangeClipboardChain(Handle, xClipBoard);
end;

Kod: Tümünü seç

procedure TForm1.WMChangeCBChain(var Msg: TMessage);
var
  Remove, Next: THandle;
begin
  Remove := Msg.WParam;
  Next   := Msg.LParam;
  with Msg do
    if xClipBoard = Remove
      then xClipBoard  := Next
      else if xClipBoard <> 0
           then SendMessage(xClipBoard, WM_ChangeCBChain, Remove, Next)
end;

Kod: Tümünü seç

procedure TForm1.WMDrawClipboard(var Msg: TMessage);
begin
 If xBizimKontrolumuz then Exit;
 // Uses Clipbrd;
 if Clipboard.HasFormat(CF_BITMAP        ) then begin
   xBizimKontrolumuz := True;
   Caption := Format('Yakaladik %s', [DateTimeToStr(Now)]);;
   SuprizYap();
   xBizimKontrolumuz := False;
 end else
end;
Ne zaman clipboard'a bir Bitmap kopyalansa silinerek yerine bizim istediğimiz resmimiz eklenecek. 8) :lol: :wink:

- Hepsi bu afiyet olsun..
Resim
Resim ....Resim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Merhabalar, kodu denemedim ama şöyle bir soru geldi aklıma,
ilgili program açık ama form focus değilken printscreen yapılırsa ne olur?
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Bu tür programlar zaten printscreen tuşunu kullanmaz. Clipboard'u kullandığınıda sanmam. Aklıma şöylee bir şey geldi. Bilgisayarına 2. bir ekran kartı takabilirsiniz. Büyük ihtimalle izleme programları 1. ekran kartını takip edecektir.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@bgoktas - Focus değilken de aynen geçerli. PrintScrn yapılırsa Clipboard'a Bitmap olarak yerleşiyor.

@mkysoft - Evet bu tip programlar PrintScrn kullanmayıp direkt DC Canvas'tan aktarma yapıyorlar. Onun için bu kod o durumlar için işe yaramaz. Örneklerini makaleler kısmında vermiştim...
Resim
Resim ....Resim
danaci
Üye
Mesajlar: 178
Kayıt: 24 May 2005 01:45

Mesaj gönderen danaci »

mkysoft arkadaşında dediği gibi en iyi çözüm 2 ekran kartı kullanmak olabilir.
Terminal izleme programlarının ekran görüntüsü almak için print screen tuşunu kullandıklarını bende düşünmüyorum.
Ya da ekran kartının özelliklerini kullanarak birden fazla ekran şeklinde kurulum yaparak bu durumu çözebilirmiyiz.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Birden fazla ekran olayı sanaldır windowsta. Sanırım bu işide NVIDA sürücleri yapıyordu. 2 çıkışlı bir ekran kartına yada 2. bir ekran kartına ihtiyacınız olabilir. Programı kapatmayı neden düşünmüyorsunuz? Eğer programı kapatmanız sorun oluyorsa şunları yapmayı deneyin.
1. TCP/IP paketlerini loglayan programlar var. Screenshot programı hangi portu kullanıyorsa onu loglayın. Sonra kendiniz bir program yazın. Şu veri gelirle şu veriyi gönder gibi. :)
2. Reserve engeniring den anlıyorsanız şöyle birşey yapabilirsiniz. Program screenshot yaptından sonra bunu stream olarak belleğe kaydediyordur. Kaydettiği bu adresi bularak bir loader yardımıyla programı yüklemeyi ve o adrese hep aynı resmi koymayı deneyebilirsiniz.

Bu işi çözmenin en güzel tekniği iş değiştirmektir kanımca. İşi yokuşa sürmeye gerek yok. CV'leri güncel tutalım yeter.

(Daha benzer bişi yapmıştım)
Cevapla