SPI拦截网络封包(EXE安装篇)

//以下是安装类

/*InsPkgCls.h*/

#include <tchar.h>
#include <stdio.h>
#include <winsock2.h>

#define MY_DLL_NAME _T("spidll.dll")
#define MY_DLL_PATH _T("//spidll.dll")
#define MY_VAR_PATH _T("//myvar.dat")
#define REG_INSTALL_KEY    _T("SYSTEM//CurrentControlSet//Services//WinSock2//MySpi")
#define REG_INSTALL_PATH_ITEM  _T("PathName")
#define REG_PROTOCOL_CATALOG_KEY _T("SYSTEM//CurrentControlSet//Services//WinSock2//Parameters//Protocol_Catalog9//Catalog_Entries")
#define REG_PROTOCOL_CATALOG_ITEM _T("PackedCatalogItem")

#define MAX_PROTOCOL_CATALOG_LENTH  sizeof(WSAPROTOCOL_INFOW) + MAX_PATH

#define DLLPKG_SUCCESS    1
#define DLLPKG_NOT_SUPPORT   -800
#define DLLPKG_NOT_INSTALL   -801
#define DLLPKG_ALREADY_INSTALL  -802
#define DLLPKG_OPEN_REG_FAILED  -803
#define DLLPKG_SAVE_PATH_FAILED  -804
#define DLLPKG_READ_VALUE_FAILED  -805
#define DLLPKG_CREATE_ITEM_FAILED -806
#define DLLPKG_SET_VALUE_FAILED  -807
#define DLLPKG_REG_DELETE_FAILED  -808

class CInstallPkg
{
private:
 BOOL IsInstalled(TCHAR *sInstallPath = NULL);
 int SaveConfig(BOOL bIsRemove);
 int SaveEnumKey(HKEY hkey, LPCTSTR sSubKey, BOOL bIsRemove = FALSE);
public:
 int Install(TCHAR *sInstallPath = NULL);
 int UnInstall();
 BOOL IsSupport();

 BOOL ReadReg(
  TCHAR *sKey,
  BYTE *pBuffer,
  DWORD dwBufSize,
  HKEY hkey = HKEY_LOCAL_MACHINE,
  TCHAR *sSubKey = REG_INSTALL_KEY,
  DWORD ulType = REG_BINARY
  );

 BOOL SaveReg(
  TCHAR *sKey,
  BYTE *pBuffer,
  DWORD dwBufSize,
  HKEY hkey = HKEY_LOCAL_MACHINE,
  TCHAR *sSubKey = REG_INSTALL_KEY, 
  DWORD ulType = REG_BINARY
  );

 BOOL DeleteReg(
  HKEY hkey = HKEY_LOCAL_MACHINE,
  TCHAR *sSubKey = REG_INSTALL_KEY,
  TCHAR *sItem = NULL
  );
public:
 TCHAR m_sInstallPath[MAX_PATH];
};

/*InsPkgCls.cpp*/

#include "InsPkgCls.h"
#include <iostream>
using namespace std;

int CInstallPkg::Install(TCHAR *sInstallPath)
{
 //if(!IsSupport())
  //return DLLPKG_NOT_SUPPORT;
 if (IsInstalled(sInstallPath))
  return DLLPKG_ALREADY_INSTALL;
 _tcscpy(m_sInstallPath, sInstallPath);
 int iRet;
 if((iRet = SaveConfig(FALSE)) != DLLPKG_SUCCESS)
  return iRet;

 if(!SaveReg(
   REG_INSTALL_PATH_ITEM,
   (BYTE*)sInstallPath,
   _tcslen(sInstallPath),
   HKEY_LOCAL_MACHINE,
   REG_INSTALL_KEY,
   REG_SZ
   )
  )
  return DLLPKG_SAVE_PATH_FAILED;

 return DLLPKG_SUCCESS;
}

int CInstallPkg::UnInstall()
{
 int iRet = DLLPKG_SUCCESS;

 if(!IsInstalled())
  return DLLPKG_NOT_INSTALL;

 if((iRet = SaveConfig(TRUE)) != DLLPKG_SUCCESS)
  return iRet;

 if(!DeleteReg())
  return DLLPKG_REG_DELETE_FAILED;

 return DLLPKG_SUCCESS;
}

BOOL CInstallPkg::IsSupport()
{
 WORD wVersionRequested = MAKEWORD(2, 0);
 WSADATA wsaData;
 
 if(WSAStartup(wVersionRequested, &wsaData) != 0)
  return FALSE;
 
 if (LOBYTE(wsaData.wVersion) != 2)
 {
  WSACleanup();
  return FALSE;
 }
 return TRUE;
}

BOOL CInstallPkg::IsInstalled(TCHAR *sInstallPath)
{
 TCHAR tsPathName[MAX_PATH];

 if( ReadReg(REG_INSTALL_PATH_ITEM,
    (BYTE*)tsPathName,
    MAX_PATH,
    HKEY_LOCAL_MACHINE,
    REG_INSTALL_KEY, REG_SZ
    )
  )
  {
   if(sInstallPath != NULL)
    _tcscpy(sInstallPath, tsPathName);
   return TRUE;
  }
 return FALSE;
}

int CInstallPkg::SaveConfig(BOOL bIsRemove)
{
 HKEY hkey = NULL;

 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PROTOCOL_CATALOG_KEY, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
  return DLLPKG_OPEN_REG_FAILED;

 __try
 {
  TCHAR sSubKey[MAX_PATH];
  DWORD dwIndex = 0;
  int   iRet  = 0;

  while(RegEnumKey(hkey, dwIndex, sSubKey, MAX_PATH) == ERROR_SUCCESS)
  {
   if((iRet = SaveEnumKey(hkey, sSubKey, bIsRemove)) != DLLPKG_SUCCESS)
    return iRet;

   dwIndex ++;
  }
 }
 __finally
 {
  RegCloseKey(hkey);
 }

 return DLLPKG_SUCCESS;
}

int CInstallPkg::SaveEnumKey(HKEY hkey, LPCTSTR sSubKey, BOOL bIsRemove)
{
 HKEY hSubKey  = NULL;
 BYTE ItemValue   [MAX_PROTOCOL_CATALOG_LENTH];
 DWORD ItemSize = MAX_PROTOCOL_CATALOG_LENTH;

 if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubKey) != ERROR_SUCCESS)
  return DLLPKG_OPEN_REG_FAILED;

 __try
 {
  if(RegQueryValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, NULL, ItemValue, &ItemSize) != ERROR_SUCCESS
   || (ItemSize != MAX_PROTOCOL_CATALOG_LENTH))
   return DLLPKG_READ_VALUE_FAILED;

  WSAPROTOCOL_INFOW *mProtocolInfo = (WSAPROTOCOL_INFOW *)(ItemValue + MAX_PATH);
  
  if(mProtocolInfo->ProtocolChain.ChainLen == 1)
  {
   TCHAR sItem[21];
   _stprintf(sItem, _T("%u"), mProtocolInfo->dwCatalogEntryId);
 
   if(!bIsRemove)
   {
    if(!SaveReg(
      sItem,
      ItemValue,
      _tcslen((TCHAR*)ItemValue),
      HKEY_LOCAL_MACHINE,
      REG_INSTALL_KEY,
      REG_SZ
      )
     )
     return DLLPKG_CREATE_ITEM_FAILED;

    _tcscpy((TCHAR*)ItemValue, m_sInstallPath);
    
    if(RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize) != ERROR_SUCCESS)
     return DLLPKG_SET_VALUE_FAILED;
   }
   else
   {
    TCHAR sProvider[MAX_PATH];
    
    int iRet = ReadReg(
        sItem,
        (BYTE*)sProvider,
        MAX_PATH,
        HKEY_LOCAL_MACHINE,
        REG_INSTALL_KEY, REG_SZ
        );
    _tcscpy((TCHAR*)ItemValue, sProvider);
    iRet = RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize);
   }
  }
 }
 __finally
 {
  RegCloseKey(hSubKey);
 }

 return DLLPKG_SUCCESS;
}
BOOL CInstallPkg::ReadReg(
 TCHAR *sKey,
 BYTE *pBuffer, 
 DWORD dwBufSize,
 HKEY hkey,
 TCHAR *sSubKey,
 DWORD ulType
)
{
 HKEY hSubkey;

 if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubkey) != ERROR_SUCCESS)
  return FALSE;

 __try
 {
  DWORD dwType;

  if (RegQueryValueEx(hSubkey, sKey, 0, &dwType, pBuffer, &dwBufSize) == ERROR_SUCCESS
   && dwType == ulType)
   return TRUE;
 }
 __finally
 {
  RegCloseKey(hSubkey);
 }

 return FALSE;
}

BOOL CInstallPkg::SaveReg(
 TCHAR *sKey,
 BYTE *pBuffer,
 DWORD dwBufSize,
 HKEY hkey,
 TCHAR *sSubKey,
 DWORD ulType
)
{
 HKEY hSubkey;
 DWORD dwDisposition;

 if (RegCreateKeyEx(hkey, sSubKey, 0, NULL, REG_OPTION_NON_VOLATILE
  , KEY_ALL_ACCESS, NULL, &hSubkey, &dwDisposition) != ERROR_SUCCESS)
  return FALSE;

 if (RegSetValueEx(hSubkey, sKey, 0, ulType, pBuffer, dwBufSize) != ERROR_SUCCESS)
 {
  RegCloseKey(hSubkey);
  return FALSE;
 }

 RegCloseKey(hSubkey);

 return TRUE;
}

BOOL CInstallPkg::DeleteReg(
 HKEY hkey,
 TCHAR *sSubKey,
 TCHAR *sItem
)
{
 if(hkey == NULL || sSubKey == NULL)
  return FALSE;

 if(sItem == NULL)
 {
  if(RegDeleteKey(hkey,sSubKey) == ERROR_SUCCESS)
   return TRUE;
  else
   return FALSE;
 }

 HKEY hSubKey;

 if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubKey) != ERROR_SUCCESS)
  return FALSE;

 __try
 {
  if(RegDeleteValue(hSubKey, sItem) == ERROR_SUCCESS)
   return TRUE;
 }
 __finally
 {
  RegCloseKey(hSubKey);
 }

 return FALSE;
}
//----------------------------------------------------------------------------

//___________________________________________________//

//以下是安装代码

/*main.cpp*/

#include <ws2spi.h>
#include <windows.h>
#include <stdio.h>
#include "InsPkgCls.h"
#pragma comment(lib, "ws2_32.lib")
typedef HANDLE(WINAPI *STOP)();

void GetPath(OUT TCHAR *sPath)
{
 TCHAR sFilename[MAX_PATH];
 TCHAR sDrive[_MAX_DRIVE];
 TCHAR sDir[_MAX_DIR];
 TCHAR sFname[_MAX_FNAME];
 TCHAR sExt[_MAX_EXT];

 GetModuleFileName(NULL, sFilename, _MAX_PATH);
 
 _tsplitpath(sFilename, sDrive, sDir, sFname, sExt);

 _tcscpy(sPath, sDrive);
 _tcscat(sPath, sDir);

 if(sPath[_tcslen(sPath) - 1] != _T('//'))
  _tcscat(sPath, _T("//"));
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanve, LPSTR lpCmdLine, int nCmdShow)
{
 CInstallPkg m_Install;
 TCHAR sProvider[MAX_PATH];
 TCHAR SysDll[MAX_PATH];
 TCHAR SysVar[MAX_PATH];
 TCHAR sysdir[MAX_PATH];

 GetPath(sProvider);
 _tcscat(sProvider, MY_DLL_NAME);
 GetSystemDirectory(SysDll, 256);
 _tcscpy(sysdir, SysDll);
 _tcscat(SysDll, MY_DLL_PATH);
 CopyFile(sProvider, SysDll, FALSE);
 _tcscat(sysdir, MY_VAR_PATH);
 
 
 if(strlen(lpCmdLine) < 5)
 {
  if(SetFileAttributes(sysdir, FILE_ATTRIBUTE_SYSTEM))
  {
   return 0;
  } 
  CreateFile(sysdir, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  m_Install.Install(SysDll);
  MessageBox(NULL, "安装成功经", "提示", MB_OK);
 }
 else
 {
  m_Install.UnInstall();
  DeleteFile(sysdir);
 }

 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值