2013-08-20 78 views
0
  • 平臺:Linux的x86的3.2.0(Debian的7.1)
  • 編譯器:GCC 4.7.2(Debian的4.7.2-5)

我寫生成的函數「隨機」整數通過讀取「隨機」值的內存分配部分。這個想法是基於未初始化變量具有未定義值的事實。我最初的想法是使用malloc()分配一個數組,然後使用它的未初始化元素來生成一個隨機數。但malloc()傾向於返回NULL塊的內存,所以我不能保證有任何可讀的內容。所以我想讀取一個單獨的進程內存以保證NULL以外的值。我目前的想法是找到第一個有效的內存地址並從那裏讀取,但我不知道如何做到這一點。我嘗試初始化一個指向NULL的指針,然後遞增1,但如果我嘗試打印引用的內存位置,則會出現分段錯誤。所以我的問題是如何讀取單獨的進程內存。除了讀取它之外,我不需要對內存做任何事情。查找分配的內存

+0

什麼是「NULL塊內存」?一個被初始化爲所有字節的零?或者是其他東西? –

+0

與此不同的是,如果你的進程讀取進程的內存,人們會感到不安;你可能正在閱讀密碼,信用卡號碼,社會安全號碼,或其他各種東西,這些東西都應該保持私密。你必須是root才能讀取任意其他用戶的進程;如果你真的想要,你可以閱讀你自己的進程的內存,但是你真的不需要,因爲你沒有處理真正的隨機值。 –

+1

'/ dev/[u] random'就是隨機的,而且問題少得多。 – nneonneo

回答

2

這個想法是基於未初始化變量具有未定義值的事實。

只要你無法預測它們包含什麼,它們就是未定義的。它主要依賴於操作系統的內容。

早在DOS時代,您可能會依賴這樣一個事實:如果您在當前會話中執行了多個程序,則內存中會出現垃圾。但即使如此,數據並不是一個可靠的隨機性來源。

現在,事情是不同的。

  • 如果您在棧中的變量,並在corrent程序運行你像現在從來沒有在棧上深,你的局部變量是0,否則,它們包含從以前的函數調用的數據。

  • 如果您malloc()和libc從已使用的內存池中獲取返回的內存,它也可能包含垃圾。但是如果它從操作系統中重新獲得它,它將被歸零。

我的初始想法是分配一個使用陣列的malloc(),然後使用它的未初始化的元素,以生成隨機數。但malloc()傾向於返回NULL塊的內存,所以我不能保證有任何可讀的內容。

(NOT NULL,但0或NUL) 見我最後一點:這取決於malloc() ED地區的歷史。

所以我想讀取一個單獨的進程內存以保證NULL以外的值。

您不能,因爲過程是相互分離和屏蔽的。

正如其他人所說,有更好的隨機性來源。 /dev/random如果你肯定需要真熵,否則/dev/urandom

5

這個想法是基於未初始化變量具有未定義值的事實。

不,你不能。它們具有垃圾價值,這意味着無論在記憶中發生什麼,它們都不是隨機的。

3

您無法讀取單獨的進程內存,內核可以保護您免於執行此操作,因爲它通常是因爲設置指針時發生錯誤而發生的。即使可能,你也不會在隨機整數附近得到任何東西。爲什麼不從/dev/random讀取?

3

通過軟件在計算機中生成隨機數很硬(有硬件隨機數發生器)。在新程序中的內存是一個可怕的來源,尤其是在早期,因爲操作系統在啓動程序之前將所有內存置零。你看到的任何非零都是從初始化代碼中遺留下來的,它留下了污點。

假設你想這麼做「自己動手」的數字,當時的微秒/納秒數字是一箇舊式的解決方案...理論顯示如下...玩你自己的數字。具有大素數的Modulo會很好。只要確保丟棄高於1/1000秒的任何東西。

 (long long)(nano * 1E10) % 1000

這假設你是從一個手動命令開始的,而不是一個預定的工作。

如果您在UNIX上運行考慮從/ dev/urandom的,或適當的照顧,的/ dev /隨機(閱讀man page)讀取幾個字節。

Windows有它自己的API。在perl中,

 new Win32::API "advapi$b32","CryptAcquireContextA",'PNNNN','N' || 
        die "$^E\n"; # Use MS crypto or die

嚴肅的工作好隨機數發生器採取獲取好數字是在這裏超出一個快速的反應;這通常依賴於硬件,例如時間戳中斷。

3

隨機數有一定的特殊性能。計算機內存通常不能滿足這些屬性。

如果我品嚐計算機內存,噸,這將是非常相似,有些數字將有現有的這種概率很低,他們甚至可能不會在計算機的整個存儲器中找到。

這並不是說如果我讀取分配給程序的內存之外的一點內存,操作系統將使用SEGFAULT將我殺死。

這是一個壞主意,在許多層面上。使用適當的隨機數發生器。