簡體   English   中英

通過P / Invoke將空終止字符串作為字節數組發送到WriteProcessMemory()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM