击败从内存中擦除 PE

Posted

技术标签:

【中文标题】击败从内存中擦除 PE【英文标题】:Defeat erase PE from memory 【发布时间】:2021-04-03 22:22:04 【问题描述】:

我怎样才能从内存中删除 PE?

首先:我正在处理的可执行文件是 C++ 中的 CLR 主机,所以后面的程序是 C# 二:C#程序用Virtual Protect(非常常见的反倾销保护)功能擦除PE头

在所有情况下,我都使用 x64dbg 转储了 C# 程序,然后由于擦除 PE 标头,我无法真正实现我的目标。我发现修补此问题的唯一方法是在程序启动时用 NOP 替换 VirutalProtect 调用,然后程序将无法擦除 PE 标头,也许?

PS:我无法通过原始文件修补转储文件,因为没有原始文件,我拥有的唯一可执行文件是 C++ 中的 CLR 主机和 C# 中的转储可执行文件。

我会很感激任何帮助,对不起我的英语不好。

【问题讨论】:

c# 是托管的,c++ 不是托管的。因此 c# 在微处理器中添加了选择器,因此如果发生异常并且 PC 不会出现蓝屏。当应用程序从文件中执行时,加载程序会在应用程序运行之前使用可以访问微处理器寄存器的系统凭据分配选择器。因此,您需要进行大量的讨论才能让您的代码运行。最好编写一个托管代码的 c++ 应用程序作为 c# 和您要运行的可执行文件之间的接口。 【参考方案1】:

编辑:我终于明白如何转储它了,我只是在程序真正启动之前添加一个断点,然后探索存储在内存中的所有 PE 头

【讨论】:

以上是关于击败从内存中擦除 PE的主要内容,如果未能解决你的问题,请参考以下文章

从向量中擦除指针

从类型列表中擦除类型 C++ 元编程

C ++根据成员函数从向量中擦除对象[重复]

boost::erase_all 从字符串中擦除多个字符

使用指向值的原始指针从 std::list<Value> 中擦除?

在本机反应中擦除 AsyncStorage