Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: [Zero] en 29 Diciembre 2009, 11:43 am



Título: [SRC][C++] ClsScreenCapture
Publicado por: [Zero] 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  ;)


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Karcrack 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


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [Zero] en 29 Diciembre 2009, 14:53 pm
No, DirectX es lento tambien, toy viendo de comprimirlo con LZ77, seguramente vaya con eso  ;-).

Saludos


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Karcrack 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:


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [Zero] 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


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [L]ord [R]NA 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?


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Karcrack 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:)


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Jaixon Jax 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 ....


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [L]ord [R]NA 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


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [L]ord [R]NA 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...


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Karcrack en 29 Diciembre 2009, 17:18 pm
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
Es un tiempo 'despreciable'...

cada 5 segundos... pero en 5 segundos pasan tantas cosas...
Seria bonito hacerlo a 24fps o 20fps o 15fps... pero se necesita una compresion/descompresion muy rapida :xD


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [L]ord [R]NA en 29 Diciembre 2009, 17:20 pm
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
Es un tiempo 'despreciable'...

cada 5 segundos... pero en 5 segundos pasan tantas cosas...
Seria bonito hacerlo a 24fps o 20fps o 15fps... pero se necesita una compresion/descompresion muy rapida :xD

xD algo a 15FPS necesita un buen trabajo...


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: [Zero] en 29 Diciembre 2009, 17:31 pm
Más que la compresión lo que no me gustaba de GDI+ era la lentitud/consumo de cpu. Comprimía aproximadamente 25 capturas en 2-3 segundos, pero claro, a 100 de cpu, y eso para un RAT no es viable  :xD. El algoritmo LZ77 destaca por su rapidez, sobre todo en tiempo de descompresión, por lo que, aunque no tenga tanto ratio, no hay el problema de la cpu  :P.

Saludos


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Jaixon Jax en 29 Diciembre 2009, 17:57 pm
Para Capturas Por Click esta bien  ::) a nos ser que haya un fenomeno y cuelgue la PC con 15 Clicks por segundo  :laugh:


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: Debci en 29 Diciembre 2009, 19:50 pm
Bestial, lo añadire a mi libreria de codigo ^^

Saludos


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: engel lex en 10 Julio 2010, 23:11 pm
Disculpen por revivir el tema... pero intento usar el codigo, y el gdipluh.h me dá miles de errores junto con el resto de sus librerias... no sé si fue mi fuente de descargar que está mal o que... ya que lo descargué por lo menos de 4 sitios diferentes... y no consigo lograr que funciones


Título: Re: [SRC][C++] ClsScreenCapture
Publicado por: bizco en 10 Julio 2010, 23:48 pm
pon los errores en el foro de programacion.