簡體   English   中英

如何在C / C ++中“使用write()系統調用從頁面讀取(寫入虛擬管道()文件描述符)”?

[英]How to “use the write() system call to read from the page (writing to a dummy pipe() file descriptor)” in C/C++?

我需要測試內存地址是否可讀,因此我搜索並發現了以下問題: 如何在Linux用戶空間應用程序中測試地址是否可讀如用戶@caf所述:

規范的方法是使用write()系統調用從頁面讀取(寫入啞管道()文件描述符)。

不幸的是,他沒有提供任何代碼示例,並且我無法評論(信譽低下),也無法向他發送消息(至少我不知道如何)。

編輯

我不能只通過做類似的事情來創建管道嗎?

int result = write(0, addr, 1);

@Mats Petersson:我已經嘗試使用函數指針將其加載到內存中之后分析和更改一個函數(我正在遞增指針並逐字節復制其值),以便確定它是否仍然是該函數,我需要知道內存是否可寫和可讀(我知道這有點愚蠢)。 無論如何,我不想更改程序的內存讀取/寫入權限,所以您所說的可能是個問題。

編輯2 @Damon:那么還有其他確定的方法嗎?

首先,創建一個管道對以將數據寫入:

 int fd[2];
 pipe(fd);

然后嘗試將一些數據從您的地址寫入管道的寫入端:

 int result = write(fd[1], addr, 1);

如果result為1,則寫入成功,因此該地址可讀取。 如果為零且errno == EFAULT ,則該地址不可讀。 如果errno是其他問題,則其他地方出了問題。

當然,請確保完成后關閉管道:

 close(fd[0]);
 close(fd[1]);

我自己從未使用過該方法,但是我認為您必須創建一個管道(使用pipe系統調用),然后在write該管道時提供您要檢查的地址作為緩沖區。

因此,假設您要檢查地址0x1000000 ,然后執行例如

int res = write(dummypipe[1], 0x1000000, 1);

如果res-1則檢查errno == EFAULT是否表示該地址無效。

暫無
暫無

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

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