簡體   English   中英

用來自另一個進程的數據填充分配的 memory

[英]Fill allocated memory with data from another process

好的,這個問題不正常,而且可能很愚蠢,因為我不熟悉 c++ 中的指針和鏈接:

所以我在另一個進程的 memory 中有一些數據( http://prntscr.com/zmfb4p ),大約是 1200-1600 字節。 我有一個驅動程序,它可以對所需進程進行 kernel 讀寫。 我有一個用戶模式應用程序,它與驅動程序進行如下通信:

int reading_data = driver.readvirtualmemory<int>(<processId>, <adress to read>, <size to read>);

它適用於小數據類型,但我不明白如何獲取“大量”字節並存儲它:

分配 memory 來存儲數據:

char* test_buf = new char[size_matricies_buffer];    // allocating memory and creating a pointer to it ~1200-1600 depends on situation
*test_buf = driver.ReadVirtualMemory<char>(<process>, <address>, static_cast<uint32_t>(size_matricies_buffer));  // filling allocated memory with data?

它可以編譯並且可以工作,但是當我嘗試訪問 *test 時出現錯誤:

cout << "buf: " << *test_buf << " | " << &test_buf << endl;

Mysoftware.exe 中 0x00007FF6D1DD1671 處的未處理異常:0xC0000005:訪問沖突寫入位置 0x00000000C21C833C。

知道我在這里缺少什么嗎?

所以基本的 function readVirtualMemory 這樣做(我想我上面的解釋太短了,但現在是 nvm):

template <typename type>
type ReadVirtualMemory(ULONG64 ProcessId, ULONG64 ReadAddress, SIZE_T Size)
{
    type Buffer;

    KERNEL_READ_REQUEST ReadRequest;

    ReadRequest.ProcessId = ProcessId;
    ReadRequest.Address = ReadAddress;
    ReadRequest.pBuff = &Buffer;
    ReadRequest.Size = Size;

    if (DeviceIoControl(hDriver, IO_READ_REQUEST, &ReadRequest, sizeof(ReadRequest), &ReadRequest, sizeof(ReadRequest), 0, 0))
    {
        return Buffer;
    }

    return Buffer;
}

KERNEL_READ_REQUEST 是:

   typedef struct _KERNEL_READ_REQUEST
{
    ULONG64 ProcessId;
    ULONG64 Address;
    PVOID64 pBuff;
    ULONG64 Size;

} KERNEL_READ_REQUEST, * PKERNEL_READ_REQUEST;

所以問題在於原始 function 中的必要類型定義和 function 的結構。 下一個解決方案解決了問題:添加一個新的 kernel_read function,沒有類型聲明,帶有指向緩沖區的指針,需要由讀取數據填充。 (感謝@SamiKuhmonen 的想法):

    bool ReadBuffer(ULONG64 ProcessId, void* buffer, ULONG64 ReadAddress, SIZE_T Size, bool secondary = false)
{
    KERNEL_READ_REQUEST ReadRequest;

    ReadRequest.ProcessId = ProcessId;
    ReadRequest.Address = ReadAddress;
    ReadRequest.pBuff = buffer;
    ReadRequest.Size = Size;

    if (DeviceIoControl(hDriver, IO_READ_REQUEST, &ReadRequest, sizeof(ReadRequest), &ReadRequest, sizeof(ReadRequest), 0, 0))
    {
        return true;
    }

    return false;
}

之后我的緩沖區

char* matricies_buf_buf = new char[size_matricies_buffer];
driver.ReadBuffer(pid, matricies_buf_buf, transform_data[0], size_matricies_buffer);

充滿了所需的數據。

對不起一些對這個問題感到惱火的人,這是我第一次嘗試提出問題和stackoverflow。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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