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

外贸网站 站长工具如何做双版网站

外贸网站 站长工具,如何做双版网站,雄县网站建设,网站怎么申请备案一#xff1a;背景 1. 讲故事 高级调试训练营里的一位朋友找到我#xff0c;说他们跑在linux上的.NET程序出现了内存泄露的情况#xff0c;上windbg观察发现内存都是IMAGE给吃掉了#xff0c;那些image都标记了 doublemapper__deleted_ 字样#xff0c;问我为啥会这样背景 1. 讲故事 高级调试训练营里的一位朋友找到我说他们跑在linux上的.NET程序出现了内存泄露的情况上windbg观察发现内存都是IMAGE给吃掉了那些image都标记了 doublemapper__deleted_ 字样问我为啥会这样说实话作为我们这些调试者非常喜欢和这样的人打交道毕竟沟通起来顺畅也特别能激发对方的探索欲这也是训练营给予的一种魅力吧。 二内存暴涨分析 1. 为什么会暴涨 看过我这个系列的朋友都知道观察内存用 !address -summary 命令但这个命令是为 windows 打造的所以在 linux 上行不通为此sos提供了一个专门的命令 !maddress 来替代接下来使用 !maddress -orderBySize 观察下内存分布情况。 0:000 !maddress -orderBySize---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Memory Kind | StartAddr | EndAddr-1 | Size | Type | State | Protect | Image | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Image | 7f4000000000 | 7f4007ff6000 | 127.96mb | MEM_IMAGE | MEM_COMMIT | PAGE_READWRITE | doublemapper__deleted_ | | Image | 7f3fc4000000 | 7f3fcbff5000 | 127.96mb | MEM_IMAGE | MEM_COMMIT | PAGE_READWRITE | doublemapper__deleted_ | | Image | 7f404c021000 | 7f4051b4c000 | 91.17mb | MEM_IMAGE | MEM_UNKNOWN | PAGE_UNKNOWN | doublemapper__deleted_ | | Image | 7f3fae82e000 | 7f3fb4000000 | 87.82mb | MEM_IMAGE | MEM_COMMIT | PAGE_EXECUTE_READ | doublemapper__deleted_ | | Image | 7f406c021000 | 7f40701ff000 | 65.87mb | MEM_IMAGE | MEM_UNKNOWN | PAGE_UNKNOWN | doublemapper__deleted_ ...---------------------------------------------------------------------- | Memory Type | Count | Size | Size (bytes) | ---------------------------------------------------------------------- | Image | 980 | 3.54gb | 3,801,517,056 | | PAGE_READWRITE | 1,178 | 1.17gb | 1,255,059,968 | | Stack | 66 | 499.35mb | 523,604,992 | ...| NewStubPrecodeHeap | 4 | 64.00kb | 65,536 | ---------------------------------------------------------------------- | [TOTAL] | 8,254 | 6.01gb | 6,451,347,968 | ---------------------------------------------------------------------- 从卦象看总计 6.4G 的内存使用Image 就吃了 3.8G从 details 看确实都标记了 doublemapper__deleted_说实话我分析了300多例的dumpImage 吃了大头是第二次遇到这种故障案例一般是可遇不可求的接下来我们探究下 doublemapper__deleted_ 为何方神圣。 2. doublemapper__deleted_ 是什么 要想找到这个答案先从 coreclr 源代码中寻找蛛丝马迹全局检索之后很快发现了关键词 doublemapper相关的代码 bool VMToOSInterface::CreateDoubleMemoryMapper(void** pHandle, size_t *pMaxExecutableCodeSize) { #ifndef TARGET_OSX#ifdef TARGET_FREEBSDint fd shm_open(SHM_ANON, O_RDWR | O_CREAT, S_IRWXU); #elif defined(TARGET_SUNOS) // has POSIX implementationchar name[24];sprintf(name, /shm-dotnet-%d, getpid());name[sizeof(name) - 1] \0;shm_unlink(name);int fd shm_open(name, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); #else // TARGET_FREEBSDint fd memfd_create(doublemapper, MFD_CLOEXEC); #endif // TARGET_FREEBSD*pMaxExecutableCodeSize MaxDoubleMappedSize;*pHandle (void*)(size_t)fd; #else // !TARGET_OSX*pMaxExecutableCodeSize SIZE_MAX;*pHandle NULL; #endif // !TARGET_OSXreturn true; } 从卦象看真尼玛乱coreclr 为了兼容各种操作系统核加了无数的 ifelse 判断无语了最后在非OSX,非FREEBSD,非SUNOS的情况下走了 memfd_create 函数到这里事情有了一些进展了。 熟悉 Linux 的朋友应该知道 memfd_create 是一个 Linux 系统调用用于创建一个匿名文件描述符如果在 Windows 上找等价函数的话那就是 win32api 中的 CreateFileMapping 函数即内存映射文件这个在源码目录中也能观之一二 可能有些朋友对 memfd_create 的使用还是有些模糊我让 chatgpt 帮我生成一段简单的 demo 辅助大家理解下简化后如下 int main() {const char *name example_memfd;int fd;size_t size 1024; // 1 KBvoid *map;const char *text Hello, memfd_create!;// Create the memory file descriptorfd memfd_create(name, MFD_CLOEXEC);// Resize the memory file to the desired sizeftruncate(fd, size)// Map the memory file into the address spacemap mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);// Write some data to the memory filestrncpy(map, text, strlen(text));// Print the data from the memory fileprintf(Data in memory file: %s\n, (char *)map);// Unmap the memorymunmap(map, size)// Close the file descriptorclose(fd);return 0; } 卦中的逻辑非常简单需要注意的是这里有一个重要步骤就是通过 mmap 将 fd 挂上物理内存即 fd - mmap - memory挂上之后就可以轻松的往里面写数据了。 有了这些基础之后大家再看 doublemapper__deleted_ 字样是不是有种豁然开朗的感觉大概就是资源释放中只执行了 close(fd)但没有执行 mummap参考如下 // Unmap the memory (某种原因未执行)//munmap(map, size) // Close the file descriptorclose(fd); 哈哈当然我的推测不一样对熟悉 linux 的朋友可以指点指点。 接下来研究方向在哪里呢既然我已经推测出貌似存在某种逻辑bug但 coreclr 代码不是我们写的所以我能不能绕过去呢 3. 可以绕过 memfd_create 吗 要想知道能不能绕过去还得从源代码中寻找答案天不负有心人还真给找到了简化后的代码如下 bool ExecutableAllocator::Initialize() {if (IsDoubleMappingEnabled()){if (!VMToOSInterface::CreateDoubleMemoryMapper(m_doubleMemoryMapperHandle, m_maxExecutableCodeSize)){g_isWXorXEnabled false;return true;}m_CriticalSection ClrCreateCriticalSection(CrstExecutableAllocatorLock,CrstFlags(CRST_UNSAFE_ANYMODE | CRST_DEBUGGER_THREAD));}return true; }bool ExecutableAllocator::IsDoubleMappingEnabled() {#if defined(HOST_OSX) defined(HOST_ARM64)return false; #elsereturn g_isWXorXEnabled; #endif }bool ExecutableAllocator::g_isWXorXEnabled CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_EnableWriteXorExecute) ! 0;RETAIL_CONFIG_DWORD_INFO(EXTERNAL_EnableWriteXorExecute, W(EnableWriteXorExecute), 1, Enable W^X for executable memory.); 从卦中代码看最终是由 EnableWriteXorExecute 外部变量控制的那这个变量是什么意思呢其实它是操作系统和CPU联合提供的功能在 https://en.wikipedia.org/wiki/W%5EX 上对 W^X 特性做了介绍大概意思就是: 它是一种内存保护策略根据该策略进程或内核地址空间中的每个页面要么是可写的要么是可执行的但不能同时具备这两种属性,如果没有这种保护程序就可以在原本用于存储数据的内存区域中写入作为数据 “W”CPU 指令然后运行作为可执行代码 “X”或读 - 执行 “RX”这些指令。如果写入内存的一方怀有恶意这就会带来危险。 而且 EnableWriteXorExecute 这东西导致的问题在 github 上有很多的讨论 https://github.com/dotnet/runtime/issues/97765https://stackoverflow.com/questions/77164379/how-do-i-debug-a-net-core-console-app-with-windbg-by-launch-executablehttps://github.com/dotnet/runtime/issues/79469 大家给出的建议都是将其关闭操作方式如下 export DOTNET_EnableWriteXorExecute0 让朋友关闭了这个选项之后朋友反馈程序运行正常。 4. 到底是什么代码导致的 虽然可以通过 export DOTNET_EnableWriteXorExecute0 搞定这个问题那到底是什么业务导致产生了很多的 doublemapper 呢这就需要从这些内存段上寻找答案了仔细想想既然是内存文件嘛大概率承载了 .NET 的 dll 文件而 dll 文件都是魔术 MZ 开头的。所以使用 s-a 抽查其中一个内存段。 0:000 s-a 7f3fc4000000 7f3fcbff5000-0x1 MZ 00007f3fc4059ce4 4d 5a 00 00 00 00 00 00-00 00 00 00 7c 00 00 00 MZ..........|... 00007f3fc44f2989 4d 5a 3c 40 7f 00 00 b1-05 00 00 94 99 00 00 80 MZ............ 00007f3fc44f2b69 4d 5a 3c 40 7f 00 00 b1-05 00 00 98 99 00 00 40 MZ........... 00007f3fc44f3d99 4d 5a 3c 40 7f 00 00 b2-05 00 00 ac 99 00 00 80 MZ............ 00007f3fc44f4d49 4d 5a 3c 40 7f 00 00 b2-05 00 00 b6 99 00 00 80 MZ............ 00007f3fc45a3c61 4d 5a c4 3f 7f 00 00 00-00 00 00 00 00 00 00 cd MZ.?............ 00007f3fc45a3ca1 4d 5a c4 3f 7f 00 00 00-00 00 00 00 00 00 00 cd MZ.?............ 00007f3fc45a3ce1 4d 5a c4 3f 7f 00 00 00-00 00 00 00 00 00 00 cd MZ.?............ 00007f3fc45a3d21 4d 5a c4 3f 7f 00 00 00-00 00 00 00 00 00 00 cd MZ.?............ ... 然后用了一段私藏的脚本导出来后发现是大量的项目dll这个就不截图了朋友也有说他们程序有动态生成代码的逻辑。 四总结 EnableWriteXorExecute 特性是在 .NET7 之后默认将0设为1的在某些开源linux上会因为各种兼容性问题导致各种奇葩的问题发生这东西我感觉目前还是能禁掉就禁掉吧。
http://www.hkea.cn/news/14375625/

相关文章:

  • 做asp.net网站参考文献软件开发文档编写规范
  • 网站的技术解决方案企业建立网站的优势
  • 长治招聘网站建设广州白云区做网站
  • 长沙门户网站linux系统网站建设
  • 自己网站做访问统计代码岳池住房和城乡建设厅网站
  • 常州网站设计湛江公司电话网站建设风格要求
  • 南开做网站福州企业建站服务
  • wordpress开放多站点宁波城乡住房建设厅网站
  • 专门做墓志铭的网站免费空间可以上传网站吗
  • 28网站怎么做代理皇马logo做网站
  • 襄阳网站设计制作公司加强网站建设会
  • 哪个网站可以做平面兼职阿里云中文域名建设网站
  • 友点企业网站管理系统商业网站在规划与设计时应着重考虑哪些因素
  • 专业的网站设计公司新能源网站开发
  • 做关键词搜索的网站app软件开发费用多少
  • 网站后台上传图片 不可用网站广告位
  • 网站推广的宣传途径贺州网站seo
  • 益阳网站seo网页相册制作
  • 北京哪家做网站wordpress 远程调用函数
  • 哪里有做区块链网站的网站开发建站
  • 吉林市做网站哪家好建设云购网站
  • 廊坊公司网站建设百度网站怎样做推广
  • 深圳专业建网站公司排行厦门人才网招聘
  • 北京网站建设公司网站优化资讯免费网站建站 知乎
  • 莆田 做网站的公司wordpress是什么软件
  • 滨江网站建设公司wordpress表单邮件
  • 网站被恶意解析app推广软件有哪些
  • 爱的网站台州汇客网站建设
  • 泰安企业网站seo电商网站国内外需求分析
  • 初学者自己做网站洞头区小程序模板源代码