C++ 挂钩 winsock

2024-01-01

我正在尝试挂接winsock send 和recv 以读取进程的所有流量。 我将以下代码作为 dll 注入目标进程中

#include "dll.h"
#include <windows.h>
#include <winsock2.h>
#include <iostream>
#include <fstream>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

DllClass::DllClass()
{

}


DllClass::~DllClass ()
{

}

BYTE hook[6];
BYTE hook2[6];
BYTE jmp[6] = { 0xe9,0x00, 0x00, 0x00, 0x00 ,0xc3 };  
ofstream myfile;
ofstream myfile2;

DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup)
{  
      DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
      ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
      DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5);
      memcpy(&jmp[1], &dwCalc, 4);
      WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);
      return dwAddr;
}    

BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0))
        return TRUE;
return FALSE;  
}

int nSend(SOCKET s, const char *buf, int len,int flags){
UnHookFunction("ws2_32.dll", "send", hook);


int result = send(s,buf,len,flags);


  myfile.open ("C:\\tmp\\log.txt",ios::app | ios::binary);
  myfile << buf;
  myfile.close();




HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
return result;
} 

int nRecv(SOCKET s, char* buf, int len, int flags)
{
    UnHookFunction("ws2_32.dll", "recv", hook2);
    DWORD tmp;

    len = recv(s, buf, len, flags);

    if (len > 0)
    {

        myfile2.open ("C:\\tmp\\log.txt",ios::app | ios::binary);
        myfile2 << buf;
        myfile2.close();
    }
   HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
    return len;
}
void fun(){ // <-- this is called after the DLL has been injected
HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

这在某些情况下有效,但在某些情况下则无效。 如果我将它注入 filezilla ftp 中,它就会像一个魅力一样工作,并将发送或接收的所有内容写入文件。

但在几乎所有其他程序(Internet Explorer、Firefox 使用)上,它只是向文件写入一些字节,然后进程崩溃......

有谁知道出了什么问题吗?


好的。即使启用了 DataExecutionPrevention,它现在也可以正常工作。如果将来有人遇到类似的问题,这里是工作代码:

dllmain.cpp:

#include "dll.h"
#include <windows.h>
#include <winsock2.h>
#include <iostream>
#include <fstream>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

DllClass::DllClass()
{

}


DllClass::~DllClass ()
{

}

BYTE hook[6];
BYTE hook2[6];
BYTE jmp[6] = { 0xe9,0x00, 0x00, 0x00, 0x00 ,0xc3 };  
ofstream myfile;
ofstream myfile2;
DWORD pPrevious;

DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup)
{  
      DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
      ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
      DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5);
      VirtualProtect((void*) dwAddr, 6, PAGE_EXECUTE_READWRITE, &pPrevious);
      memcpy(&jmp[1], &dwCalc, 4);
      WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);
      VirtualProtect((void*) dwAddr, 6, pPrevious, &pPrevious);
      FlushInstructionCache(GetCurrentProcess(),0,0);
      return dwAddr;
}    

BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);

if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0))
        return TRUE;
        FlushInstructionCache(GetCurrentProcess(),0,0);

return FALSE;  
}

int __stdcall nSend(SOCKET s, const char *buf, int len,int flags){
UnHookFunction("ws2_32.dll", "send", hook);


int result = send(s,buf,len,flags);


  myfile.open ("C:\\tmp\\log.txt",ios::app | ios::binary);
  myfile << buf;
  myfile.close();




HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
return result;
} 

int __stdcall nRecv(SOCKET s, char* buf, int len, int flags)
{
    UnHookFunction("ws2_32.dll", "recv", hook2);
    DWORD tmp;

    len = recv(s, buf, len, flags);

    if (len > 0)
    {

        myfile2.open ("C:\\tmp\\log.txt",ios::app | ios::binary);
        myfile2 << buf;
        myfile2.close();
    }
   HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
    return len;
}
void fun(){
HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HookFunction("ws2_32.dll", "send", (LPVOID*) nSend, hook);
HookFunction("ws2_32.dll", "recv", (LPVOID*) nRecv, hook2);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

dll.h

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


class DLLIMPORT DllClass
{
  public:
    DllClass();
    virtual ~DllClass(void);

  private:

};
extern "C" __declspec(dllexport) void fun();

#endif /* _DLL_H_ */

经过测试并适用于 Windows XP 32 位上的几乎所有程序以及 Windows 7 x64 上的一些程序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 挂钩 winsock 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 返回 foreach 循环外部 var 中存储的所有值

    因此 我假设某些内容正在被覆盖 但我不确定如何停止此操作并检索循环外的所有值 有任何想法吗 foreach gallids as gallterm postterms wp get post terms gallterm type arra
  • 将 null 转换为任何类型

    Can null被转换为任何类型 即以下代码可以工作吗 public
  • 在 DynamoDB 中对关系数据进行建模(嵌套关系)

    实体模型 我已阅读有关创建的 AWS 指南在 DynamoDB 中建模关系数据 https docs aws amazon com amazondynamodb latest developerguide bp modeling nosql
  • RabbitMQ 插件用于删除重复消息

    我有一个用于生成文档的 RabbitMQ 队列 基本上每个文档都有type and state 新的 处理中的 准备就绪 所以我使用带有路由键的主题交换 例如type state 每次文档更改时 我都会将带有最新文档描述的消息发送到交易所
  • 如何让 webdriver 实例在所有类文件中使用相同的实例

    我是 java selenium 的新手 我想使用 webdDrierSingleton 概念 它将帮助我在所有类中使用单个驱动程序实例 我无法获取驱动程序实例 有人可以指导我如何获取它吗 单例类 public class WebDrive
  • Visual Studio 2015。无法注册站点访问的 URL 被拒绝 IIS Express。访问被拒绝 0x80070005

    我在 Visual Studio 2015 中启用了 SSL 以实现Facebook and Google本地登录 我改变了项目网址 in the Web tab项目的属性https 本地主机 44300 https localhost 4
  • 是否可以刷新“今日小部件”中的计时器?

    我想知道是否可以更新今日小部件中计时器的文本标签 我环顾四周 但没有任何帮助 是的你可以 我刚刚测试过并且有效 您只需将计时器添加到主运行循环 NSRunLoopCommonModes 中 RunLoop main add yourTime
  • 指定 seq2seq 自动编码器。 RepeatVector有什么作用?批量学习对预测输出有何影响?

    我正在构建一个基本的 seq2seq 自动编码器 但我不确定我是否做得正确 model Sequential Encoder model add LSTM 32 activation relu input shape timesteps n
  • 如何改进生成多重集组合的算法?

    我该如何优化next and hasNext 下面的生成器中的方法会产生有界多重集的组合 我将其发布到 C 以及 Java 因为该代码与 C 兼容 并且没有不直接转换为 C 的 Java 特定元素 该算法有问题的特定领域是整个hasNext
  • 如何在 QtCreator 的调试器中显示 std::multimap 和 std::multiset 的内容?

    我正在尝试检查 a 的内容std multimap and std multiset in the 局部变量和表达式的窗口Qt创建者 我得到的不是值列表 而是显示的实现细节 奇怪的是 std map and std set对应的显示良好 i
  • 工厂方法“dataSource”在启动时抛出异常

    我已将 MS SQL 与我的 Spring Boot 应用程序集成 但是在启动时我收到以下错误 无法实例化 org apache tomcat jdbc pool DataSource 工厂方法 dataSource 抛出异常 嵌套异常是j
  • 使用 safari 在画布中绘制包含 html 的 svg

    我正在尝试为网站创建一些动态创建的页面的缩略图 我找到了一个解决方案 方法是在 svg 中添加 html 然后在画布内的图像上绘制图像 在绘制图像后调整图像大小 这个解决方案适用于 firefox 和 chrome 但不适用于 safari
  • Xcode - 更改项目模板

    因此 我可以为单个文件添加新模板 但我希望 Xcode 在设置新项目时使用这些文件 最明显的是 Controller 和 Delegate h 和 m 文件 我怎么做 除了您找到的各个类的模板之外 还有适用于各种项目类型的模板 如果您只想替
  • 根据 TypeScript 验证 JSON

    我们使用 JSON 文件来配置一些 Web 应用程序 显然在字段名称等方面出现了错误 是否可以使用 TypeScript 定义验证 JSON 文件 或者我们应该将配置迁移到其他格式 我们同时使用Intellij和VSCode进行开发 定义示
  • 将 pdf 转换为单页可编辑 html

    我一直在努力将 pdf 文件转换为单个漂亮的 html 页面网上冲浪了一下 我得到的解决方案有点缺乏我的要求 因为我必须为大约 200 个 pdf 文件创建单独的 html 页面 因为在线转换器可能不是一个领先的解决方案 所以我尝试了以下解
  • QOpenGLWidget 与 QApplication?

    我们有一个基于 QWidget 的应用程序 之前使用 QWindow 进行 OpenGL 渲染 为了使该窗口适合我们的应用程序 我们必须使用 QWidget QWidget createWindowContainer QWindow 以前我
  • 为 ObjectBoundingBox 导出 SVG

    我对 SVG 的经验很少 我正在尝试保存来自 illustrator 的路径 以便它可以用作响应式剪贴蒙版 其大小相对于其父级 使用clipPathUnits objectBoundingBox 但是 Illustrator 似乎不允许我在
  • 新 luarock 的正确 Rockspec 文件名是什么?

    根据这个页面 http luarocks org en Creating a rock http luarocks org en Creating a rock 这应该保存在名为 luafruits 1 0 1 rockspec 的文件中
  • Nuget 包...项目中不存在...包...文件夹中已存在

    我已经与这个错误斗争了几个小时 但无法找到有效的解决方案 我在多项目解决方案中有一个 ASP Net API 其引用 依赖项配置不正确 我已经尝试修复它两天了 问题是 我相信 该 API 缺少 System Web Http System
  • C++ 挂钩 winsock

    我正在尝试挂接winsock send 和recv 以读取进程的所有流量 我将以下代码作为 dll 注入目标进程中 include dll h include