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

网站推广律师关键词有哪些甘肃兰州建筑网

网站推广律师关键词有哪些,甘肃兰州建筑网,网站开发设计技术路线,学网站软件设计一:背景 1. 讲故事 这篇文章起源于和一家 .NET公司 开线上会议时,提出的一个场景问题,程序出现了非托管内存暴涨,这些非托管内存关联的对象都囤积在 终结器队列 中,很显然这是代码中没用 using 及时释放引发的&#…

一:背景

1. 讲故事

这篇文章起源于和一家 .NET公司 开线上会议时,提出的一个场景问题,程序出现了非托管内存暴涨,这些非托管内存关联的对象都囤积在 终结器队列 中,很显然这是代码中没用 using 及时释放引发的,而这块代码又是第三方组件,你想加也加不了,所以提出了一个设想:能不能设法干预 终结器队列的 freachable 节段,让里面的对象提前释放,而不是等待不稳定的终结器线程来兜底。。。

这个问题我最近也在考虑,毕竟我写过如何用 harmony 拦截 .net sdk ,用 minhook 拦截 win32api,唯独这一块没有跟大家聊,虽然 eventpipe 给 coreclr 开了很多的日志口子,但怎么说呢? eventpipe 是一种君子之法,和黑客性质的minhook无法相提并论,所以这一篇就详细的和大家聊一聊。

二:如何拦截 coreclr

1. 一个小案例

为了方便演示,就以拦截 GC.Collect() 方法为例吧,参考代码如下:

static void Main(){for (int i = 0; i < 3; i++){Console.WriteLine($"Triggering GC #{i}...");GC.Collect();Thread.Sleep(1000);}}

熟悉GC的朋友应该知道 GC.Collect() 下游方法是coreclr!WKS::GCHeap::GarbageCollect(),我想在命中这个方法的时候执行一点我的自定义逻辑,这里有一点注意的是,钩子的回调不要回调到 C#,最好采用 SlideCar 的方式,这里使用静态链接,C代码参考如下:


#include <windows.h>
#include <stdio.h>
#include <MinHook.h>// 1. 使用 extern "C" 防止名称修饰
#ifdef __cplusplus
extern "C" {
#endif// 2. 定义原始函数类型typedef int(__fastcall* Real_GarbageCollect)(void* pThis, int generation, bool lowMemory, int mode);// 3. 导出函数声明__declspec(dllexport) BOOL WINAPI InstallGCHook();__declspec(dllexport) void WINAPI UninstallGCHook();#ifdef __cplusplus
}
#endif// 4. 全局变量
static Real_GarbageCollect fpOriginalGarbageCollect = NULL;
static void* pTargetFunction = NULL;// 5. 获取 coreclr.dll 中的函数地址(关键修改点)
static void* GetGCDunctionAddress() {HMODULE hCoreCLR = GetModuleHandleW(L"coreclr.dll");if (!hCoreCLR) {printf("[ERROR] coreclr.dll not loaded\n");return NULL;}// 计算目标地址return (BYTE*)hCoreCLR + 0x30E670; // 替换为你的实际偏移量
}// 6. Detour 函数(保持不变)
int __fastcall Hook_GarbageCollect(void* pThis, int generation, bool lowMemory, int mode) {printf("[GC Hook] this=0x%p, gen=%d, lowMem=%d, mode=%d\n",pThis, generation, lowMemory, mode);if (fpOriginalGarbageCollect) {MH_DisableHook(pTargetFunction);int result = fpOriginalGarbageCollect(pThis, generation, lowMemory, mode);MH_EnableHook(pTargetFunction);return result;}return 0;
}// 7. 安装Hook(改为自动计算地址)
__declspec(dllexport) BOOL WINAPI InstallGCHook() {pTargetFunction = GetGCDunctionAddress();if (!pTargetFunction) return FALSE;if (MH_Initialize() != MH_OK) {printf("[ERROR] MinHook init failed\n");return FALSE;}MH_STATUS status = MH_CreateHook(pTargetFunction,&Hook_GarbageCollect,(void**)&fpOriginalGarbageCollect);if (status != MH_OK) {printf("[ERROR] CreateHook failed (status=0x%X)\n", status);MH_Uninitialize();return FALSE;}if (MH_EnableHook(pTargetFunction) != MH_OK) {printf("[ERROR] EnableHook failed\n");MH_Uninitialize();return FALSE;}printf("[SUCCESS] Hook installed at 0x%p\n", pTargetFunction);return TRUE;
}// 8. 卸载Hook(保持不变)
__declspec(dllexport) void WINAPI UninstallGCHook() {if (pTargetFunction) {MH_DisableHook(pTargetFunction);MH_RemoveHook(pTargetFunction);}MH_Uninitialize();printf("[INFO] Hook uninstalled\n");
}

然后指定 头文件,链接文件,截图如下:


上面的 Hook_GarbageCollect 函数就是回调的地方,我用 printf 输出当前 GarbageCollect 参数信息, 接下来就是 C# 侧了,把生成好的 ConsoleApplication2.dll 丢到 C# 的 bin 目录下,参考代码如下:


using System;
using System.Runtime.InteropServices;class Program
{[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.StdCall)]public static extern bool InstallGCHook();[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.StdCall)]public static extern void UninstallGCHook();static void Main(){try{if (InstallGCHook()){Console.WriteLine("Hook installed. Press any key to exit...");for (int i = 0; i < 3; i++){Console.WriteLine($"Triggering GC #{i}...");GC.Collect();Thread.Sleep(1000);}}}finally{UninstallGCHook();}}
}

最后运行程序,可以清楚的看到每次 GC.Collect() 都被成功拦截,截图如下:

如果你很想知道汇编层到底发生了什么变化,可以用 windbg 观察便知,截图如下,真的太完美了,经典的 jmp 跳转。

2. 相对偏移 0x30E670 的疑问

相信有不少人阅读代码之后,会对 return (BYTE*)hCoreCLR + 0x30E670; 中的 0x30E670 感兴趣,其实这条语句表示函数coreclr!WKS::GCHeap::GarbageCollect 的入口地址,其中的 0x30E670 偏移是怎么知道的呢? 我是用 windbg 观测的,计算如下:


0:000> lmvm coreclr
Browse full module list
start             end                 module name
00007ff8`508c0000 00007ff8`50d9d000   coreclr    (private pdb symbols)  
...0:000> x coreclr!WKS::GCHeap::GarbageCollect
00007ff8`50bce670 coreclr!WKS::GCHeap::GarbageCollect (int, bool, int)0:000> ? 00007ff8`50bce670 - 00007ff8`508c0000
Evaluate expression: 3204720 = 00000000`0030e670

卦中的 000000000030e670 便是,相信此时又会有人提一个疑问,不同版本不同环境下的 coreclr 都可以用这个 0x30e670 吗?很显然这是不对的, 0x30e670 本质上是相对 模块 的偏移地址,同版本的coreclr是没有问题的,不同版本因为代码结构不一样,自然相对地址就不一样,所以大家需要根据生产环境的coreclr版本提前计算一下偏移值即可。

三:总结

借助 harmony,minhook 两大工具可以黑进三大代码领域 .netsdk,win32,coreclr,这在.NET高级调试体系下是一枚核武的存在,相信这篇文章也给这家 .NET公司 解决场景问题提供了一个思考点。


文章转载自:

http://c1bmruFB.zwppm.cn
http://ajyY9SoQ.zwppm.cn
http://upDc0Q1D.zwppm.cn
http://5sg4jmBJ.zwppm.cn
http://Oo7F2hAK.zwppm.cn
http://myoeOprH.zwppm.cn
http://T6rWVc7X.zwppm.cn
http://4u3R0Twj.zwppm.cn
http://xGiYB35J.zwppm.cn
http://Evuebph9.zwppm.cn
http://ayBAkacB.zwppm.cn
http://z74gjb5I.zwppm.cn
http://LZco293o.zwppm.cn
http://CWrDEjx8.zwppm.cn
http://mjYHcaKz.zwppm.cn
http://FA0HrExl.zwppm.cn
http://MOEokVwl.zwppm.cn
http://806KtZsh.zwppm.cn
http://wdmhKPAt.zwppm.cn
http://RHBr5TAx.zwppm.cn
http://kyC2Vods.zwppm.cn
http://g2riJjQc.zwppm.cn
http://R6PQ7XRm.zwppm.cn
http://FIR7GY0A.zwppm.cn
http://ThNgnLxI.zwppm.cn
http://dXhN45S3.zwppm.cn
http://6NZzSyA3.zwppm.cn
http://dZCQTJsX.zwppm.cn
http://FH4eGPqo.zwppm.cn
http://5r3kssdw.zwppm.cn
http://www.dtcms.com/wzjs/649357.html

相关文章:

  • 医院网站建设中标网站推广策划方案3000字
  • 如何安装织梦做的网站网站开发设计注册
  • 怎么看公司网站建设的时间网站的邀请怎么做的
  • 网站开发背景论文做破解的网站
  • 北京网站公司网站被黑是什么原因
  • wordpress企业仿站视频教程手机怎么建立自己的网站
  • 做网站流量钱谁给网站建设常州
  • 网站打不开是什么原因宝塔面板怎么安装wordpress
  • 个体户可以做网站吗网站建设项目结构分析报告
  • 黄山学院教务管理系统广东搜索seo哪家强
  • 西安哪些做网站的公司wordpress 置顶 评论
  • 做网站费用多少百度联盟怎么做网站加入
  • 建设银行保定分行网站吕梁营销型网站建设费用
  • 郑州网站开发的公司衣服定制app
  • 网站如何添加关键词wordpress主题加速
  • 网站建设 源码windows2012iis网站默认设置
  • 慈利县建设局网站杭州网站建设设计公司哪家好
  • 微网站预览响应式网站的优势
  • 海事网站开发泉州制作网站开发
  • 小视频哪个网站比较好网站开发需要多少钱如何
  • 怎么做免费视频网站吗网络营销方案设计题
  • 上虞市住房和城乡建设局网站wordpress 建站 linux
  • 自助建个人网站哪个好美工设计
  • 网站建设目的影楼免费网站建设
  • 网站的差异网络规划设计师考试资料百度云
  • 丁香人才网官方网站wordpress 七牛云插件
  • 网站公司制作网站有何优势百度网盟推广价格
  • 做网站订单wordpress页面侧边栏没了
  • 网站优化找谁微信官网免费下载安装
  • 企业建网站的目的全国做网站的公司有哪些