[英]Send null terminated string as byte array to WriteProcessMemory() via P/Invoke
我的P / Invoke WriteProcessMemory
方法當前如下所示:
[DllImport("kernel32", SetLastError = true)]
[return : MarshalAs(UnmanagedType.Bool)]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr baseAddress,
byte[] bufferToWrite,
uint numBytesToWrite,
out IntPtr numBytesWritten
);
我需要將一個字符串發送到bufferToWrite
參數,但是它需要一個byte[]
因此在將其傳入之前,我將其轉換為byte[]
。
我的問題是,由於.NET字符串不是以null終止的,因此不會將終止null寫入遠程內存。 如果我在非托管代碼中執行此操作,那么我將分配字符串的長度+終止null,並將所有這些都放入分配的內存中,因為我正在讀取的“字符串”包含null。 但是托管字符串不包含它。
也許我可以分配一個足夠大的緩沖區以包含一個終止null,然后再次調用WriteProcessMemory
來寫入null。 或者我可以創建一個足以容納字符串+ null的byte[]
,將它們都寫入數組,然后像這樣傳遞它。
但是,對於這個問題是否有更優雅的解決方案?
聲明這樣的重載:
[DllImport("kernel32", SetLastError = true)]
[return : MarshalAs(UnmanagedType.Bool)]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr baseAddress,
string bufferToWrite,
uint numBytesToWrite,
out uint numBytesWritten
);
這樣,您將強制編組器將null終止字符串。
您可以將數據作為IntPtr
傳遞,並使用Marshal.StringToPtrAnsi
。 但是隨后您需要管理內存。
如果文本是Unicode,請使用CharSet.Unicode
選項。
您還可以分配字符串以及一個空終止符。 例如,如果您想編寫字符串
string szToWrite = "This is what I want to write";
我希望通過例如使用ASCII轉換將其轉換為byte[]
byte[] aBytes = Encoding.ASCII.GetBytes(szToWrite);
然后將其與一個額外的空字節連接在一起。
aBytes = aBytes.Concat(new byte[] { 0x00 }).ToArray();
如果需要,請創建自己的函數WriteProcessMemoryString
,讓它接受string
而不是byte[]
並使用與上述相同的概念。 還要注意,您可能希望使用與ASCII不同的編碼,例如UTF7 / UTF8或任何本機需要的東西(例如寬字符字符串)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.