簡體   English   中英

為什么我可以讀取取消引用的指針,但不能用 C 編寫它,但可以用 C++ 編寫?

[英]Why can I read a dereferenced pointer, but can't write it in C, but can in C++?

我需要修補一個程序,所以我制作了一個可以注入的 dll,並在注入它時修補指令的一個字節。 代碼很簡單,這次我唯一想用C而不是C++來寫的,只是出於好奇。 但是當我加載我的 dll 時,它的線程崩潰而不是寫入該指針。 指針是 100% 並且如果你使用 WriteProcessMemory 來工作,但由於某種原因不能從 dll 直接從進程寫入。 目標可執行文件是 x86,dll 是用 gcc 編譯的。 編譯參數如下所示: gcc -shared mypatch.c -o mypatch.dll

#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>

void main()
{
    AllocConsole(); // Made a console so I can try to read the data, I thought maybe I was getting the wrong address, but I didn't.
    FILE* consoleFile;
    freopen_s(&consoleFile, "CONIN$", "r", stdin);
    freopen_s(&consoleFile, "CONOUT$", "w", stderr);
    freopen_s(&consoleFile, "CONOUT$", "w", stdout);
    DWORD relAddr = 0x123456; // My address
    DWORD addr = (DWORD)GetModuleHandle(NULL) + relAddr; // Adress is relative to the main executable.
    printf("%X", *(byte*)(addr)); // Can read the real byte
    *(byte*)(addr) = 0x90; // Can't write, crash.
    printf("%X", *(byte*)(addr)); // Can't see, crashed.
}

BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)main, 0, 0, 0);
    }
    return 1;
}

錯誤信息:

Unhandled exception at 0x70D41355 in SuperCoolApp.exe: 0xC0000005: Access violation writing location 0x123456. occurred

問題不在 C 或 C++ 中,而是關於頁面保護。 所以這個錯誤本身就非常具有描述性。

在這個令人困惑的嘗試和祈禱序列之后,我決定再次查找我的 C++ 代碼,我發現我的原始 C++ 代碼在另一個文件中有 VirtualProtect 調用,我在詢問之前肯定沒有檢查過。 但是,盡管我發布了錯誤信息的感覺有點糟糕,但我確實了解到 WriteProcessMemory 忽略了頁面保護,並且還對我的 C 代碼進行了一些調整,這更像是對我舊代碼的 C++ 改編。 應該先檢查所有東西兩次。 非常感謝大家,有點抱歉。

就像確認說明一樣,與 C 和 C++ 相比,一切都相同。 我從頭開始重寫了這兩個版本,它們的行為完全相同,沒有保護覆蓋它們會崩潰,並且通過覆蓋它們都可以完成工作。

暫無
暫無

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

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