我正在尝试使用此功能删除我的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();
}
}
}
启动我的异常,永远不会删除我的最小例子中的PE HEADER。在这种情况下,我的目标是删除THE PE HEADER
,仅用于学习目的。
答案 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);