使用c#擦除PE HEADER

时间:2017-05-27 02:48:09

标签: c#

我正在尝试使用此功能删除我的PE HEADER:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApplication9
{
    class Program
    {
        public enum MemoryProtectionConsts : uint
        {
            EXECUTE = 0x10,
            EXECUTE_READ = 0x20,
            EXECUTE_READWRITE = 0x40,
            NOACCESS = 0x01,
            READONLY = 0x02,
            READWRITE = 0x04
        }

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string lpModuleName);
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool VirtualProtect(IntPtr lpAddress, int dwSize, MemoryProtectionConsts flNewProtect,
            int lpflOldProtect);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "RtlSecureZeroMemory")]
        private static extern void SecureZeroMemory(IntPtr ptr, IntPtr cnt);
        private static int ErasePEHeader() // hModule = Handle to the module, procName = Process name (eg. "notepad")
        {
            int OldProtect = 0;
            IntPtr pBaseAddr = GetModuleHandle(null);
            VirtualProtect(pBaseAddr, 4096, // Assume x86 page size
             MemoryProtectionConsts.READWRITE, OldProtect);
            SecureZeroMemory(pBaseAddr, (IntPtr)4096);
            return 0;
        }
        static void Main(string[] args)
        {
            ErasePEHeader();
            Console.WriteLine("");
            Console.ReadKey();
        }
    }
}

然而,一直向我展示未处理的异常: enter image description here

启动我的异常,永远不会删除我的最小例子中的PE HEADER。在这种情况下,我的目标是删除THE PE HEADER,仅用于学习目的。

2 个答案:

答案 0 :(得分:0)

上一个答案使用SecureZeroMemory(),但由于它不是导出函数,因此我们不能简单地调用它。

但是您可以使用Marashal.Copy()将零填充数组复制到内存中

public static void Copy (byte[] source, int startIndex, IntPtr destination, int length);

请参阅msdn

答案 1 :(得分:-1)

没有SecureZeroMem.dll这样的东西 - 这就是你的代码无法加载它的原因。如果您正在寻找函数SecureZeroMemory,那么它就在kernel32.dll中。

[DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint "RtlSecureZeroMemory")]
private static extern void SecureZeroMemory(IntPtr ptr, IntPtr cnt);