elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  [SRC][C++] ClsScreenCapture
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [SRC][C++] ClsScreenCapture  (Leído 13,446 veces)
[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
[SRC][C++] ClsScreenCapture
« en: 29 Diciembre 2009, 11:43 am »

Bueno, había hecho ésta clase para el Stealth RAT, pero como al final no la usaré, puesto que no es todo lo rápido que quisiera y ya tengo un método alternativo, la posteo para quien le pueda servir  :P. Hace una captura de pantalla y la comprime a JPEG (o PNG, con cambiar una línea se pueden elegir otros formatos) en memoria, por lo que es más rápido que otros códigos que guardan la captura en disco. Espero que a alguien le sirva  :P.

ClsScreenShot.h:
Código
  1. //---------------------------------------------------------------------------------------------------------
  2. //Autor: Hacker_Zero
  3. //Fecha: 29-12-09
  4. //Descripción: Clase ClsScreenShot, captura de pantalla comprimida en diferentes formatos
  5. //GDI+: Incuído en Windows XP o superior
  6. //Código liberado bajo la GNU Public License (GPL) <http://www.gnu.org/licenses/gpl-3.0.html>
  7. //---------------------------------------------------------------------------------------------------------
  8.  
  9. #ifndef SCREENSHOT_H
  10. #define SCREENSHOT_H
  11.  
  12. #include <windows.h>
  13. #include <gdiplus.h>
  14.  
  15. using namespace Gdiplus;
  16.  
  17. class cScreenShot
  18. {
  19. public:
  20. cScreenShot();
  21. ~cScreenShot();
  22. HBITMAP CrearCapturaPantalla(DWORD dwLeft,DWORD dwTop,DWORD dwRight,DWORD dwBottom);
  23. CLSID GetEncoder(WCHAR* lpEnconder);
  24. LPSTR ComprimirImagen(HBITMAP hBitmap);
  25. VOID GuardarImagen(LPSTR lpFileName,LPSTR lpImage,DWORD ImageSize);
  26. DWORD ImageSize;
  27. RECT RC;
  28.  
  29. private:
  30. GdiplusStartupInput GDIStartup;
  31. unsigned long GDIToken;
  32. EncoderParameters EP;
  33. ImageCodecInfo* ICI;
  34. CLSID Codec;
  35. IStream* lpIStream;
  36. unsigned int Codecs;
  37. unsigned int CodecSize;
  38. HDC hDC;
  39. HDC hCCDC;
  40. HBITMAP hBitmap;
  41. HBITMAP hOldBitmap;
  42. ULARGE_INTEGER StreamSize;
  43. LARGE_INTEGER StreamSeek;
  44. ULONG Read;
  45. DWORD dwRead;
  46. LPSTR lpBuffer;
  47. HANDLE hFile;
  48. };
  49.  
  50. #endif
  51.  

ClsScreenShot.cpp
Código
  1. #include "ClsScreenShot.h"
  2.  
  3. cScreenShot::cScreenShot()
  4. {
  5. GdiplusStartup(&GDIToken,&GDIStartup,0);
  6. GetWindowRect(GetDesktopWindow(),&RC);
  7. }
  8.  
  9. cScreenShot::~cScreenShot()
  10. {
  11. GdiplusShutdown(GDIToken);
  12. }
  13.  
  14. HBITMAP cScreenShot::CrearCapturaPantalla(DWORD dwLeft,DWORD dwTop,DWORD dwRight,DWORD dwBottom)
  15. {
  16. hDC=CreateDCA("DISPLAY",0,0,0);
  17. hCCDC=CreateCompatibleDC(hDC);
  18. hBitmap=CreateCompatibleBitmap(hDC,dwRight,dwBottom);
  19. hOldBitmap=(HBITMAP)SelectObject(hCCDC,hBitmap);
  20. BitBlt(hCCDC,0,0,dwRight,dwBottom,hDC,dwLeft,dwTop,SRCCOPY);
  21.  
  22. DeleteDC(hDC);
  23. DeleteDC(hCCDC);
  24.  
  25. return hBitmap;
  26. }
  27.  
  28. CLSID cScreenShot::GetEncoder(WCHAR* lpEnconder)
  29. {
  30. GetImageEncodersSize(&Codecs,&CodecSize);
  31. ICI=(ImageCodecInfo*)GlobalAlloc(GPTR,CodecSize);
  32. GetImageEncoders(Codecs,CodecSize,ICI);
  33.  
  34. for(DWORD i=1;wcscmp(ICI[i-1].MimeType,lpEnconder);i++)
  35. {
  36. Codec=ICI[i].Clsid;
  37. }
  38.  
  39. GlobalFree(ICI);
  40.  
  41. return Codec;
  42. }
  43.  
  44. LPSTR cScreenShot::ComprimirImagen(HBITMAP hBitmap)
  45. {
  46. Bitmap bmp(hBitmap,NULL);
  47.  
  48. CreateStreamOnHGlobal(NULL,TRUE,(LPSTREAM*)&lpIStream);
  49.  
  50. Codec=GetEncoder(L"image/jpeg");
  51. //~Codec=GetEncoder(L"image/png"); ~//
  52.  
  53. EncoderParameters EP;
  54. DWORD Quality=40;
  55. EP.Count=1;
  56. EP.Parameter[0].NumberOfValues=1;
  57. EP.Parameter[0].Guid=EncoderQuality;
  58. EP.Parameter[0].Type=EncoderParameterValueTypeLong;
  59. EP.Parameter[0].Value=&Quality;
  60.  
  61. //bmp.SetResolution(550,600);
  62. bmp.Save(lpIStream,&Codec,&EP);
  63.  
  64. StreamSeek.QuadPart=0;
  65. lpIStream->Seek(StreamSeek,STREAM_SEEK_END,&StreamSize);
  66. lpIStream->Seek(StreamSeek,STREAM_SEEK_SET,NULL);
  67.  
  68. lpBuffer=(LPSTR)GlobalAlloc(GPTR,(SIZE_T)StreamSize.QuadPart);
  69. lpIStream->Read(lpBuffer,(ULONG)StreamSize.QuadPart,&Read);
  70. ImageSize=(DWORD)Read;
  71. return lpBuffer;
  72. }
  73.  
  74. VOID cScreenShot::GuardarImagen(LPSTR lpFileName,LPSTR lpImage,DWORD ImageSize)
  75. {
  76. hFile=CreateFileA(lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,0,CREATE_ALWAYS,0,0);
  77. WriteFile(hFile,lpImage,ImageSize,&dwRead,0);
  78. CloseHandle(hFile);
  79. }
  80.  

Ejemplo de uso:
Código
  1. ClsScreenShot miScreenShot;
  2.  
  3. //Creamos una captura
  4. HBITMAP hBitmap=miScreenShot.CrearCapturaPantalla(miScreenShot.RC.left,miScreenShot.RC.top,miScreenShot.RC.right,miScreenShot.RC.bottom);
  5.  
  6. //Convertimos el Bitmap a Jpeg
  7. LPSTR JpegImage=miScreenShot.ComprimirImagen(hBitmap);
  8.  
  9. //La guardamos en disco
  10. miScreenShot.GuardarImagen("C:\\captura.jpeg",JpegImage,miScreenShot.ImageSize);
  11.  

Saludos  ;)
« Última modificación: 29 Diciembre 2009, 12:54 pm por Hacker_Zero » En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SRC][C++] ClsScreenCapture
« Respuesta #1 en: 29 Diciembre 2009, 14:52 pm »

Muy bueno el codigo, aunque ya lo habia visto :P :P
A ver si me da el venazo e intento hacerlo en VB :laugh:
Lo añado a la recopilacion...

Por cierto, al final nos quedamos con DirectX para el Stealth? :rolleyes: :xD
« Última modificación: 29 Diciembre 2009, 15:01 pm por Karcrack » En línea

[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: [SRC][C++] ClsScreenCapture
« Respuesta #2 en: 29 Diciembre 2009, 14:53 pm »

No, DirectX es lento tambien, toy viendo de comprimirlo con LZ77, seguramente vaya con eso  ;-).

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SRC][C++] ClsScreenCapture
« Respuesta #3 en: 29 Diciembre 2009, 15:01 pm »

No, DirectX es lento tambien, toy viendo de comprimirlo con LZ77, seguramente vaya con eso  ;-).

Saludos
Pudiste al final cargar la DLL?
Bueno, mejor ya hablaremos por MSN, que nos lee la competencia :rolleyes: :rolleyes: :laugh: :laugh: :laugh:
En línea

[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: [SRC][C++] ClsScreenCapture
« Respuesta #4 en: 29 Diciembre 2009, 15:25 pm »

Pudiste al final cargar la DLL?

Cargada y funcionando  ::). A ver si alguien puede mejorar la clase haciendo que sea más rápida, GDI+ deja mucho que desear en cuanto a velocidad  :-\.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: [SRC][C++] ClsScreenCapture
« Respuesta #5 en: 29 Diciembre 2009, 16:12 pm »

No, DirectX es lento tambien, toy viendo de comprimirlo con LZ77, seguramente vaya con eso  ;-).

Saludos

a que nivel de compresion lo llevaria LZ77?
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SRC][C++] ClsScreenCapture
« Respuesta #6 en: 29 Diciembre 2009, 16:32 pm »

a que nivel de compresion lo llevaria LZ77?
Código:
http://es.wikipedia.org/wiki/LZSS
Las compresiones no tienen un ratio invariable... depende de la 'suerte' que tengas :P
Este algoritmo tiene buenos ratios ;D , aunque no tanto como Jpeg... claro que no tiene perdida( :laugh:)
Es un algoritmo relativamente sencillo (sobretodo si lo comparamos con RSA :laugh:)
En línea

Jaixon Jax


Desconectado Desconectado

Mensajes: 859



Ver Perfil
Re: [SRC][C++] ClsScreenCapture
« Respuesta #7 en: 29 Diciembre 2009, 16:51 pm »

  Buen Code Men yo solo habia hecho hasta el BMP me faltaba el algoritmo de compresion  :rolleyes: ahora si podre enviar capturas de 20 kb cada 5 sg  :laugh:  :silbar:

  Saludos ....
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: [SRC][C++] ClsScreenCapture
« Respuesta #8 en: 29 Diciembre 2009, 16:54 pm »

a que nivel de compresion lo llevaria LZ77?
Código:
http://es.wikipedia.org/wiki/LZSS
Las compresiones no tienen un ratio invariable... depende de la 'suerte' que tengas :P
Este algoritmo tiene buenos ratios ;D , aunque no tanto como Jpeg... claro que no tiene perdida( :laugh:)
Es un algoritmo relativamente sencillo (sobretodo si lo comparamos con RSA :laugh:)

Y eso no relentizaria un poco la lectura de las capturas de pantalla?

se debe calcular el tiempo que la aplicacion tardara en la descompresion
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: [SRC][C++] ClsScreenCapture
« Respuesta #9 en: 29 Diciembre 2009, 17:05 pm »

  Buen Code Men yo solo habia hecho hasta el BMP me faltaba el algoritmo de compresion  :rolleyes: ahora si podre enviar capturas de 20 kb cada 5 sg  :laugh:  :silbar:

  Saludos ....

cada 5 segundos... pero en 5 segundos pasan tantas cosas...
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines