簡體   English   中英

將十六進制地址傳遞給指針變量

[英]Pass a hex address to a Pointer Variable

我知道如何使用指針。 但我不知道如何做到這一點:

我有一個十六進制地址,當然它具有來自任何應用程序的任何值。

我知道找到我想要的地址。 我想編寫一個 C 代碼將此地址傳遞給指針變量,然后我可以從該地址捕獲值等等。

例如:

hex 0x00010010
int *pointer;

如何將此地址傳遞給指針,它的語法是什么?

通過使用int*您假設您指向的數據是一個int (在大多數操作系統上為 4 個字節)。

我們不應該使用void*來代替嗎? 稍后,如果您想使用特定類型訪問它的數據,您需要做的就是強制轉換。

void *addr = (void*)0x0023FF74; // valid memory address within my app

printf("Address: %p\n", addr);
getchar();

printf("Data (4bytes): %d\n", *(int*)addr); // print the first 4 bytes of data as int
getchar();

編輯

幫助我理解你想要做什么,因為這句話讓我很困惑:

有應用程序使用該地址,我知道其中的值,但 (int) 指針不訪問該值。

您是否正在嘗試編寫一個應用程序來修改運行您系統的另一個應用程序的 memory? 您當前的方法不起作用,這就是原因:當操作系統將您的應用程序加載到進程中時,它會保留一個 memory 區域供該進程使用,並為該區域分配一系列虛擬地址。 這些虛擬地址不會 map 直接到 RAM 中的 memory 地址,因此操作系統必須為此保留一個內部表。

在 Windows 上,加載的每個進程都接收相同范圍的虛擬地址,但該區域僅對在其中運行的進程可見。 For instance, (on Windows) processes are loaded in memory address 0x00400000, which mean each process has it's own memory address 0x00400000 , and therefore you can't assign X memory address to a pointer in your application and expect Windows to magically know that you正在引用另一個應用程序內部的地址 X。

您嘗試完成的操作稱為代碼注入,並且在 web 上有很多關於它的信息。

在典型的現代操作系統中,您無法訪問另一個進程(應用程序)的地址空間。 地址是虛擬的,所以相同的數值對不同的進程意味着不同的東西。

如果您在具有真正“平坦”地址空間的系統上(其中進程直接使用實際物理 memory 地址),例如 680x0 上的 Amiga OS,您可以執行以下操作:

int *pointer = (int *) 0x00010010;

暫無
暫無

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

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