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

基于SPI的数据报过滤原理与实现 转自安焦一. 个人防火墙技术概述二. Winsock 2 SPI介绍三. 相关程序代码分析四. 小结与后记五. 附录之源代码一)个人防火墙技术概述????随着网络安全问题日益严重,广大用户对网络安全产品也越来越关注。防火墙作为一种网络安全工具,早已受到大家的青睐。在PC机上使用的个人防火墙,很大程度上成为广大网民的安全保护者。Windows下的个人防火墙都是基于对数据报的拦截技术之上。当然在具 阅读详情

//以下是安装类

/*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;
}

游戏外挂技术原理与反外挂防护机制解析 游戏外挂技术通过内存修改、网络封包拦截和代码注入等方式突破游戏规则,涉及进程内存操作、网络协议逆向等底层技术。从技术实现看,内存扫描工具如Cheat Engine通过差异定位动态地址,网络层则借助WPE等工具分析修改通信协议。反外挂系统采用多层防护策略,包括客户端内存校验、驱动级监控和服务器行为分析,其中机器学习检测模型和零信任架构成为行业热点。游戏安全工程师需要掌握合法逆向技术,参与反外挂系统开发,当前AI反外挂和协议加固是重点研究方向。 阅读详情

相关推荐

Windows网络监控实战:手把手教你用LSP劫持注入技术抓取网络流量

本文详细介绍了在Windows用户态(Ring3)利用LSP劫持注入技术监控特定进程网络流量的实战方法。通过编写LSP DLL并安装到系统协议链,可以精准捕获应用程序的TCP/UDP连接与数据,为安全分析、逆向工程和网络调试提供底层洞察。文章涵盖LSP原理、DLL构建、核心钩子实现、系统安装部署及数据解析等完整流程。

weixin_29228781的博客 580

Winsock2 SPI网络封包截获技术

众所周知,网络封包的截获技术分为几种,例如,过滤驱动程序,NDIS中间驱动程序以及Winsock2 SPI截取技术等等。其中要数Winsock2使用最为广泛,下面就向大家介绍下winsock2封包截获技术——它的很大一个特点,就是Winsock2在Winsock1.1的基础上引入了SPI技术! Winsock2之关键函数Winsock2的函数多是以WSP开头的,他们都是在WS2_32.DLL中实现的,而我们熟悉的Winsock 扩展API是以WSA开头的,因为Winsock的API在SPI函数都有相互对应

kun81的专栏 5471

SPI网络数据包拦截程序源码

基于SPI的用户态防火墙源码,来自Windows防火墙与网络封包截获技术中的PacketCapture例子

Burp suite 和 Fiddler 抓包exe 客户端【 主讲Fiddler 】

Burp suite 我没有抓到包。 附上别人抓包成功的连接! https://blog.youkuaiyun.com/weixin_43455294/article/details/102728064 # 包含Proxifier软件 环境: win10 +Fiddler +Proxifier( 用来做全局代理的) 建议先看下Fiddler 的基本使用外加配置https证书:https://www.jianshu.com/p/690eb9bebe3c 接下来讲下我的采坑之路: #...

weixin_41244495的博客 9909

LSP spi 劫持

基于SPI的lsp劫持。此demo可以实现对所有进程进行拦截。上传目的就是备份,以后使用

AXI Memory Mapped To PCI Express IP 核设计实例

本文详细描述了AXI Memory Mapped To PCI Express(2.9) IP核的应用实例

u011565038的博客 2796

SPI总线知识总结

SPI总线知识总结

汽车以太网和SOA 5676

什么是Claude 的 Agent Skills?

摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。

jobleap.cn求职助手首页 1729

揭示win32 api拦截细节

  原文出处:http://www.codeproject.com/system/hooksys.asp    拦截win32 API 调用对于多数windows开发人员来说都一直是很有挑战性的课题,我承认,这也是我感兴趣的一个课题。钩子机制就是用一种底层技术控制特定代码段的执行,它同时提供了一种直观的方法,很容易就能改变操作系统的行为,而并不需要涉及到代码。这跟一些第三方产品类似。   

1303

电脑蓝牙与ESP32蓝牙连接,让电脑发现ESP32

让PC发现ESP32蓝牙

injre! injre~ 5445

STM32硬件SPI驱动W25Q128实战:从CubeMX配置到DMA高速读写(附完整代码)

本文详细介绍了如何使用STM32硬件SPI驱动W25Q128 Flash存储器,从CubeMX配置到DMA高速读写的完整实战指南。内容包括硬件连接方案、SPI参数优化、DMA配置技巧以及完整代码实现,帮助开发者快速掌握高速稳定的SPI Flash存储解决方案。

weixin_33734785的博客 184

_tsplitpath_s(分解路径)

函数原型: errno_t _splitpath_s(    const char * path,    char * drive,    size_t driveNumberOfElements,    char * dir,    size_t dirNumberOfElements,    char * fname,    size_t nameNumberOfElement

booster123456789的专栏 7550

SAP 实施:Waterfall vs. Agile —— 一场“结构性矛盾“的深刻比较先说结论:在 SAP 世界里,这从来不是“谁更好“的宗教问题,而是“你的项目 DNA 是什么“的战略选择。​

SAP 实施:Waterfall vs. Agile —— 一场"结构性矛盾"的深刻比较 先说结论:在 SAP 世界里,这从来不是"谁更好"的宗教问题,而是"你的项目 DNA 是什么"的战略选择。​ SAP 早已用 SAP Activate​ 给出了官方态度——它不是纯 Agile,也不是回头去搞旧 Waterfall,而是一个带质量门的混合架构。 1. 先回到本质:两者解决的是不同维度的风险 维度 Waterfall(传统 ASAP 路线)​ Agile(SCRUM/Kanban 式迭代)​

金牌架构师 336

Windows下网络数据报的监听和拦截技术

Windows下网络数据报的监听和拦截技术1        Windows下网络数据报的监听和拦截技术是一个比较古老的话题,应用也很广泛,例如防火墙等等。这篇小文只是对该技术的一个总结,没有新技术,高手免看:)        要监听和拦截Windows下的数据报,基本可以在两个层次进行,一个是用户态(user-mode),一个是核心态(kernel-mode)。       

Zfrong繁荣的IT技术、IT项目、解决方案专栏Blog-上海 7816

【Frida Android】实战篇4:SSL Pinning 证书绑定绕过 Hook 教程(一)

在前两章中,我们学习了中间人抓包与 Hook 抓包的基础方法,这些方法在理想环境下能够有效获取网络请求数据。但在实际的企业级应用中,出于安全防护需求,很多 APP 会启用证书绑定(SSL Pinning)机制。这种机制会让客户端对服务器证书的校验更为严格,导致常规的抓包方法(即使将 BurpSuite/Charles 证书安装到系统信任区)也无法生效。因此,从本章开始,我们将系统学习 SSL Pinning 机制的绕过技术。SSL Pinning(证书绑定)是客户端校验服务器身份的进阶安全机制。

水滴石穿 1609

【51单片机仿真】基于51单片机设计的温湿度采集检测系统__资料编号11

该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的集成,实时读取环境中的温度和湿度数据并在LCD1602上显示这些信息,其中系统初始化LCD1602显示屏、通过DHT11_receive()函数接收并校验DHT11传感器的温湿度数据、使用LCD_ShowNum()函数逐位显示湿度和温度数据并在这些数据后附加相应的单位符号,以便用户可以直观地看到当前环境的温湿度情况。

嵌入式阿齐Archie 2万+

对个人防火墙XFilter的感受

前一段时间,用了XFilter个人防火墙,刚开始的时候,感觉还不错,可是渐渐的发现,原来是那么的不如任意.同时我也阅读了他的源代码,我个人认为,对于XFilter,如果作为个人开发测试还可以,但是如果要作为专业的防火墙,还差得远!!XFilter的实现原理:  只是根据我阅读的源代码而论,XFilter是用的spi实现的对网络的监控和拦截,但是有一个最重要的部分要注意的是它修改了注册表这个位置

zihan的专栏 5662

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1257

VC++基于LSP实现数据拦截

LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为“分层服务提供商”的机制进行扩展。Winsock LSP 可用于非常广泛的实用用途,包括 Internet 家长控制 (parental control) 和 Web 内容筛选。在以前版本的 Windows XP 中,删除不正确的(也称为“buggy”)LSP 可能会导致注册表中的 Winsock

尹成的技术博客 8294

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

phoenix Fire Wall (凤凰防火墙)原理分析

<br />phoenix防火墙原理<br /> <br /><br /> <br />应用层原理<br />Winsock 2 服务提供者接口(SPI)为应用程序提供服务。<br />SPI的体系结构为:<br />(协议层次)<br />Winsock 2 API -> WS2_32.DLL -> SPI -> Transport ,Layered Protocol, SPI -> BaseProtocol<br /> <br />(Winsock 2 结构)<br />Winsock 2 Applic

1094

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: SPI拦截网络封包(DLL篇)
下一篇: 插入型ASP后门代码
classfree
博客等级 码龄23年 27粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值