elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
14 Febrero 2012, 10:34  


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  [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 4,234 veces)
[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


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

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
//---------------------------------------------------------------------------------------------------------
//Autor: Hacker_Zero
//Fecha: 29-12-09
//Descripción: Clase ClsScreenShot, captura de pantalla comprimida en diferentes formatos
//GDI+: Incuído en Windows XP o superior
//Código liberado bajo la GNU Public License (GPL) <http://www.gnu.org/licenses/gpl-3.0.html>
//---------------------------------------------------------------------------------------------------------
 
#ifndef SCREENSHOT_H
#define SCREENSHOT_H
 
#include <windows.h>
#include <gdiplus.h>
 
using namespace Gdiplus;
 
class cScreenShot
{
public:
cScreenShot();
~cScreenShot();
HBITMAP CrearCapturaPantalla(DWORD dwLeft,DWORD dwTop,DWORD dwRight,DWORD dwBottom);
CLSID GetEncoder(WCHAR* lpEnconder);
LPSTR ComprimirImagen(HBITMAP hBitmap);
VOID GuardarImagen(LPSTR lpFileName,LPSTR lpImage,DWORD ImageSize);
DWORD ImageSize;
RECT RC;
 
private:
GdiplusStartupInput GDIStartup;
unsigned long GDIToken;
EncoderParameters EP;
ImageCodecInfo* ICI;
CLSID Codec;
IStream* lpIStream;
unsigned int Codecs;
unsigned int CodecSize;
HDC hDC;
HDC hCCDC;
HBITMAP hBitmap;
HBITMAP hOldBitmap;
ULARGE_INTEGER StreamSize;
LARGE_INTEGER StreamSeek;
ULONG Read;
DWORD dwRead;
LPSTR lpBuffer;
HANDLE hFile;
};
 
#endif
 

ClsScreenShot.cpp
Código
#include "ClsScreenShot.h"
 
cScreenShot::cScreenShot()
{
GdiplusStartup(&GDIToken,&GDIStartup,0);
GetWindowRect(GetDesktopWindow(),&RC);
}
 
cScreenShot::~cScreenShot()
{
GdiplusShutdown(GDIToken);
}
 
HBITMAP cScreenShot::CrearCapturaPantalla(DWORD dwLeft,DWORD dwTop,DWORD dwRight,DWORD dwBottom)
{
hDC=CreateDCA("DISPLAY",0,0,0);
hCCDC=CreateCompatibleDC(hDC);
hBitmap=CreateCompatibleBitmap(hDC,dwRight,dwBottom);
hOldBitmap=(HBITMAP)SelectObject(hCCDC,hBitmap);
BitBlt(hCCDC,0,0,dwRight,dwBottom,hDC,dwLeft,dwTop,SRCCOPY);
 
DeleteDC(hDC);
DeleteDC(hCCDC);
 
return hBitmap;
}
 
CLSID cScreenShot::GetEncoder(WCHAR* lpEnconder)
{
GetImageEncodersSize(&Codecs,&CodecSize);
ICI=(ImageCodecInfo*)GlobalAlloc(GPTR,CodecSize);
GetImageEncoders(Codecs,CodecSize,ICI);
 
for(DWORD i=1;wcscmp(ICI[i-1].MimeType,lpEnconder);i++)
{
Codec=ICI[i].Clsid;
}
 
GlobalFree(ICI);
 
return Codec;
}
 
LPSTR cScreenShot::ComprimirImagen(HBITMAP hBitmap)
{
Bitmap bmp(hBitmap,NULL);
 
CreateStreamOnHGlobal(NULL,TRUE,(LPSTREAM*)&lpIStream);
 
Codec=GetEncoder(L"image/jpeg");
//~Codec=GetEncoder(L"image/png"); ~//
 
EncoderParameters EP;
DWORD Quality=40;
EP.Count=1;
EP.Parameter[0].NumberOfValues=1;
EP.Parameter[0].Guid=EncoderQuality;
EP.Parameter[0].Type=EncoderParameterValueTypeLong;
EP.Parameter[0].Value=&Quality;
 
//bmp.SetResolution(550,600);
bmp.Save(lpIStream,&Codec,&EP);
 
StreamSeek.QuadPart=0;
lpIStream->Seek(StreamSeek,STREAM_SEEK_END,&StreamSize);
lpIStream->Seek(StreamSeek,STREAM_SEEK_SET,NULL);
 
lpBuffer=(LPSTR)GlobalAlloc(GPTR,(SIZE_T)StreamSize.QuadPart);
lpIStream->Read(lpBuffer,(ULONG)StreamSize.QuadPart,&Read);
ImageSize=(DWORD)Read;
return lpBuffer;
}
 
VOID cScreenShot::GuardarImagen(LPSTR lpFileName,LPSTR lpImage,DWORD ImageSize)
{
hFile=CreateFileA(lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,0,CREATE_ALWAYS,0,0);
WriteFile(hFile,lpImage,ImageSize,&dwRead,0);
CloseHandle(hFile);
}
 

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

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


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

Mensajes: 2.132


Se siente observado ¬¬'


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

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 por Karcrack » En línea

[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


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

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
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


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

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]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


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

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.508


El Dictador y Verdugo de H-Sec


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

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
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


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

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: 856



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

  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

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.508


El Dictador y Verdugo de H-Sec


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

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.508


El Dictador y Verdugo de H-Sec


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

  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

Karcrack
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


Ver Perfil
Re: [SRC][C++] ClsScreenCapture
« Respuesta #10 en: 29 Diciembre 2009, 17:18 »

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
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.508


El Dictador y Verdugo de H-Sec


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

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...
En línea

[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


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

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
En línea


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


Desconectado Desconectado

Mensajes: 856



Ver Perfil
Re: [SRC][C++] ClsScreenCapture
« Respuesta #13 en: 29 Diciembre 2009, 17:57 »

Para Capturas Por Click esta bien  ::) a nos ser que haya un fenomeno y cuelgue la PC con 15 Clicks por segundo  :laugh:
En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
Debci
Wiki

Desconectado Desconectado

Mensajes: 1.940


Actualizate o muere!


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

Bestial, lo añadire a mi libreria de codigo ^^

Saludos
En línea

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

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines