当前位置: 首页 > wzjs >正文

没有备案的网站怎么访问打开网页链接

没有备案的网站怎么访问,打开网页链接,wordpress 底部备案号,网站后台改一:背景 1. 讲故事 在前面的系列中,我们聊过.NET外挂 harmony,他可以对.NET SDK方法进行拦截,这在.NET高级调试领域中非常重要,但这里也有一些遗憾,就是不能对SDK领域之外的函数进行拦截,比如…

一:背景

1. 讲故事

在前面的系列中,我们聊过.NET外挂 harmony,他可以对.NET SDK方法进行拦截,这在.NET高级调试领域中非常重要,但这里也有一些遗憾,就是不能对SDK领域之外的函数进行拦截,比如 Win32 函数。。。

这篇我们就来解决这个问题,对,它就是 MinHook,当然我也调查了easyhookdetours,前者年久失修,后者是商业库,加上我的要求相对简单,使用极简版的 minhook 就够了,而且该项目在github上也是非常活跃的:https://github.com/TsudaKageyu/minhook

  • 开箱即用,下载 MinHook_134_bin.zip 即可。
  • 多项目融合,下载 MinHook_134_lib.zip 即可。

二:MinHook 案例演示

1. 开箱即用方式

观察 MinHook.h 头文件,会发现很多的 C 导出函数,如下所示:


#ifdef __cplusplus
extern "C" {
#endif// Initialize the MinHook library. You must call this function EXACTLY ONCE// at the beginning of your program.MH_STATUS WINAPI MH_Initialize(VOID);// Uninitialize the MinHook library. You must call this function EXACTLY// ONCE at the end of your program.MH_STATUS WINAPI MH_Uninitialize(VOID);...
}

有了这些导出函数,就可以通过 C# 的 PInvoke 直接调用,这里就演示一个拦截 MessageBox 方法,完整代码如下:


using System;
using System.Diagnostics;
using System.Runtime.InteropServices;namespace ConsoleApp2
{internal class Program{static void Main(string[] args){// 安装钩子HookManager.InstallHook("user32.dll", "MessageBoxW",(IntPtr hWnd, string text, string caption, uint type) =>{Console.WriteLine($"我已成功拦截到 MessageBox:内容 {text}, 标题: {caption}");var original = Marshal.GetDelegateForFunctionPointer<HookManager.MessageBoxDelegate>(HookManager.OriginalFunction);return original(hWnd, text, caption, type);});// 测试 MessageBox 调用(钩子会捕获这个)MessageBox(IntPtr.Zero, "This is a test", "Test", 0);// 卸载钩子HookManager.UninstallHook();Console.ReadLine();}[DllImport("user32.dll", CharSet = CharSet.Unicode)]private static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);}public static class HookManager{// 定义 MessageBox 的委托[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]public delegate int MessageBoxDelegate(IntPtr hWnd, string text, string caption, uint type);// 原始函数的指针public static IntPtr OriginalFunction = IntPtr.Zero;// 当前钩子的目标函数地址private static IntPtr _targetFunction = IntPtr.Zero;public static void InstallHook(string moduleName, string functionName, MessageBoxDelegate detourFunc){// 1. 初始化 MinHookvar status = MinHook.MH_Initialize();if (status != MinHook.MH_STATUS.MH_OK){Console.WriteLine($"MH_Initialize failed: {status}");return;}// 2. 获取目标函数的地址_targetFunction = MinHook.GetProcAddress(MinHook.GetModuleHandle(moduleName), functionName);if (_targetFunction == IntPtr.Zero){Console.WriteLine($"Failed to get {functionName} address");return;}// 3. 创建钩子var detourPtr = Marshal.GetFunctionPointerForDelegate(detourFunc);status = MinHook.MH_CreateHook(_targetFunction, detourPtr, out OriginalFunction);if (status != MinHook.MH_STATUS.MH_OK){Console.WriteLine($"MH_CreateHook failed: {status}");return;}// 4. 启用钩子status = MinHook.MH_EnableHook(_targetFunction);if (status != MinHook.MH_STATUS.MH_OK){Console.WriteLine($"MH_EnableHook failed: {status}");return;}Console.WriteLine($"{functionName} hook installed successfully");}public static void UninstallHook(){if (_targetFunction == IntPtr.Zero){Console.WriteLine("No active hook to uninstall");return;}// 1. 禁用钩子var status = MinHook.MH_DisableHook(_targetFunction);if (status != MinHook.MH_STATUS.MH_OK){Console.WriteLine($"MH_DisableHook failed: {status}");}// 2. 移除钩子status = MinHook.MH_RemoveHook(_targetFunction);if (status != MinHook.MH_STATUS.MH_OK){Console.WriteLine($"MH_RemoveHook failed: {status}");}// 3. 卸载 MinHookstatus = MinHook.MH_Uninitialize();if (status != MinHook.MH_STATUS.MH_OK){Console.WriteLine($"MH_Uninitialize failed: {status}");}_targetFunction = IntPtr.Zero;OriginalFunction = IntPtr.Zero;Console.WriteLine("Hook uninstalled successfully");}}public class MinHook{// MH_STATUS 枚举public enum MH_STATUS{MH_UNKNOWN = -1,MH_OK = 0,MH_ERROR_ALREADY_INITIALIZED,MH_ERROR_NOT_INITIALIZED,MH_ERROR_ALREADY_CREATED,MH_ERROR_NOT_CREATED,MH_ERROR_ENABLED,MH_ERROR_DISABLED,MH_ERROR_NOT_EXECUTABLE,MH_ERROR_UNSUPPORTED_FUNCTION,MH_ERROR_MEMORY_ALLOC,MH_ERROR_MEMORY_PROTECT,MH_ERROR_MODULE_NOT_FOUND,MH_ERROR_FUNCTION_NOT_FOUND}public IntPtr MH_ALL_HOOKS = IntPtr.Zero;// 导入 MinHook 函数[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern MH_STATUS MH_Initialize();[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern MH_STATUS MH_Uninitialize();[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern MH_STATUS MH_CreateHook(IntPtr pTarget, IntPtr pDetour, out IntPtr ppOriginal);[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]public static extern MH_STATUS MH_CreateHookApi(string pszModule, string pszProcName, IntPtr pDetour, out IntPtr ppOriginal);[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern MH_STATUS MH_RemoveHook(IntPtr pTarget);[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern MH_STATUS MH_EnableHook(IntPtr pTarget);[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern MH_STATUS MH_DisableHook(IntPtr pTarget);[DllImport("MinHook.x86.dll", CallingConvention = CallingConvention.Cdecl)]public static extern IntPtr MH_StatusToString(MH_STATUS status);[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]public static extern IntPtr GetModuleHandle(string lpModuleName);[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);}
}

由于这个 C# 程序是 32bit 的,所以将 MinHook.x86.dll 拷贝到C#程序的当前目录。

最后将程序运行起来,该有的都出现了。

个人实践下来,我发现有两个小问题:

  1. 当你用 vs 单步调试的时候,走到 MH_CreateHook 方法时会抛 Fatal error. Internal CLR error. (0x80131506) CLR 内部错误,看起来VS调试器做了一些手脚,截图如下:

  1. 当你想在 InstallHook 中的 detourFunc 函数下断点,也不会被命中,截图如下:

总的来说对VS调试有一点影响,但也不太大,还是可以接受的,毕竟用 C# 来调用轻车熟路,如果你熟悉 windbg 的话,用它是一点问题都没有。。。

2. 深度融合方式

用 C# 的 Pinvoke 调用 MinHook,总感觉少了那个味,如果用原汁原味的 C 调用 MinHook 那就相当完美了,在解决一些比较复杂注入非常有必要。

这里我采用 libMinHook.x86.lib 以静态链接的方式将当前的 ConsoleApplication2 和 MinHook 合二为一,截图如下:

接下来做三点配置:

  1. 右键属性 配置下 头文件 和 dll库 搜索路径,截图如下:

  1. 右键属性 配置下 依赖文件名,截图如下:

最后就是完整的 C 代码。


#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <MinHook.h>typedef int (WINAPI* Real_MessageBoxW)(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);Real_MessageBoxW fpMessageBoxW = NULL;int WINAPI Hook_MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
{_setmode(_fileno(stdout), _O_U16TEXT);wprintf(L"拦截 MessageBoxW:\n");wprintf(L"  文本: %s\n", lpText);  // 移除 &,直接使用 lpTextwprintf(L"  标题: %s\n", lpCaption);  // 移除 &,直接使用 lpCaptionreturn fpMessageBoxW(hWnd,lpText,lpCaption,uType);
}extern "C" __declspec(dllexport) void InstallHook()
{HMODULE hModule = GetModuleHandleW(L"user32.dll");Real_MessageBoxW pOrigMessageBoxW = (Real_MessageBoxW)GetProcAddress(hModule, "MessageBoxW");if (pOrigMessageBoxW == NULL) {printf("无法获取 MessageBoxW 地址\n");return;}if (MH_Initialize() != MH_OK) {printf("MinHook 初始化失败\n");return;}if (MH_CreateHook(pOrigMessageBoxW, &Hook_MessageBoxW, (void**)&fpMessageBoxW) != MH_OK) {printf("创建 Hook 失败\n");return;}if (MH_EnableHook(pOrigMessageBoxW) != MH_OK) {printf("启用 Hook 失败\n");return;}printf("MessageBoxW Hook 安装成功\n");
}extern "C" __declspec(dllexport) void UninstallHook()
{MH_DisableHook(MH_ALL_HOOKS);MH_Uninitialize();
}

这是只对外公开了 InstallHook 和 UninstallHook 装卸载方法,最后就是高层的 C# 代码。


using System;
using System.Runtime.InteropServices;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){Console.WriteLine("正在安装 MessageBox 钩子...");InstallHook();Console.WriteLine("将弹出测试消息框,观察输出...");// 弹出测试消息框(会被钩子拦截)MessageBoxW(IntPtr.Zero, "这是测试内容", "测试标题", 0);Console.WriteLine("按任意键退出并卸载钩子...");Console.ReadKey();UninstallHook();Console.WriteLine("钩子已卸载");}// 导入 user32.dll 的 MessageBoxW[DllImport("user32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]public static extern int MessageBoxW(IntPtr hWnd,string lpText,string lpCaption,uint uType);// 导入DLL中的函数[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]public static extern void InstallHook();[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]public static extern void UninstallHook();}
}

在运行之前将 ConsoleApplication2 拷贝到 C# 程序的当前目录,直接运行 C# 项目即可。

三:总结

开箱和融合两种方式都有自己的用途,下一篇我们上一个很真实的场景,让大家体会下 win32 的注入对高级调试领域 的强大功效。


文章转载自:

http://YMTzi9YN.mLcnh.cn
http://io5scRJn.mLcnh.cn
http://jZSStLHX.mLcnh.cn
http://updUGroG.mLcnh.cn
http://Emnd57TX.mLcnh.cn
http://rQ8tDZg1.mLcnh.cn
http://AuzvfTmw.mLcnh.cn
http://ZqV5rFyp.mLcnh.cn
http://VGm4ae9Y.mLcnh.cn
http://tdoStQQ5.mLcnh.cn
http://qVNgZhW5.mLcnh.cn
http://hA9OlGsE.mLcnh.cn
http://FRRPtrTM.mLcnh.cn
http://FfLj21ek.mLcnh.cn
http://JeaaiyZz.mLcnh.cn
http://d2LTEN3O.mLcnh.cn
http://mJnfTxhQ.mLcnh.cn
http://ElPp3wX5.mLcnh.cn
http://KEQVSivq.mLcnh.cn
http://m5faU7Iz.mLcnh.cn
http://iv4qVtYf.mLcnh.cn
http://rbORUYwM.mLcnh.cn
http://z7Jk3xz2.mLcnh.cn
http://IGatcx6J.mLcnh.cn
http://DqIlf933.mLcnh.cn
http://JcbiMvLC.mLcnh.cn
http://JYs6BplJ.mLcnh.cn
http://H8vsXS9R.mLcnh.cn
http://nDLZRnue.mLcnh.cn
http://nmEFIAU0.mLcnh.cn
http://www.dtcms.com/wzjs/646048.html

相关文章:

  • 河北建设集团官方网站免费wordpress建立
  • 做淘客应该知道的网站园林景观网站模板
  • 什么是移动端网站适配普达建站快车
  • 青岛大型门户网站建设推广房屋建设设计网站
  • 中学生制作的网站网络平台宣传方式有哪些
  • 嘉兴港区建设局网站app设计公司
  • 网站加密传输怎么做开发人员公众号
  • 苏州市住房和城乡建设部网站山西建设网站
  • 哪些网站不扣流量在线做家装设计的网站
  • 网站建设saas现在装宽带要多少钱
  • 沈阳网站建设联系方式哪些网站是用wordpress
  • 台州企业网站seo网站建设涉及到哪些方面
  • 北京网站备案负责人变更东城网站建设哪家好
  • 做电影网站还是国外服务器网站上传后怎么访问
  • 如何能让企业做网站的打算手机编程免费软件app
  • 青岛做网站费用深圳建筑企业排名
  • 郑州树标网站建设技术优化seo
  • html网站建设购物案例搅拌机东莞网站建设技术支持
  • 装饰公司名字起名大全医疗网站建设及优化方案
  • 怎么做二次元网站源码自己电脑做网站好吗
  • 自动采集网站php源码住房城市建设网站
  • 宜昌外贸网站建设优化推广维修网站怎么做
  • 设计师服务平台网站wordpress显示选项取消了吗
  • 南宁软件优化网站建设国家开发银行app下载
  • 企业网站建设算什么费用上海龙华医院的网站建设
  • 做淘客需要用的网站wordpress数据库表管理
  • 网站做seo需要哪些准备点图片跳到网站怎么做的
  • 关键对话呼和浩特企业网站排名优化
  • vue网站开发教程七牛云公司怎么样
  • 福泉市自己的网站中国建筑人才网官网查询