1

我正在尝试编写一个简单地使用所有可用物理内存的程序(即,任务管理器显示 100% 的 RAM 利用率)。我写了以下内容,但尽管它分配了惊人的内存量(我的系统上大约 58GB),所有这些似乎都转到了交换文件或其他东西,并且任务管理器仍然报告了大量可用的物理内存。

    class Program
    {
        static void Main(string[] args)
        {
            var memoryBlocks = new List<byte[]>();
            var chunk = 10000000;
            while (chunk > 100)
            {
                try
                {
                    memoryBlocks.Add(new byte[chunk]);
                    Console.WriteLine("Using {0}MB", memoryBlocks.Sum(b => (float)b.Length) / 1000000);
                }
                catch (OutOfMemoryException)
                {
                    chunk /= 10;
                }
            }
            Console.ReadKey();
        }
    }
4

3 回答 3

1

如果您在 64 位系统上运行,则可以使用AllocateUserPhysicalPages分配物理内存的函数

从文档中:

AllocateUserPhysicalPages 函数用于分配物理内存,以后可以在进程的虚拟地址空间中映射。必须在调用者的令牌中启用 SeLockMemoryPrivilege 特权,否则函数将失败并显示 ERROR_PRIVILEGE_NOT_HELD。有关详细信息,请参阅特权常量。此函数分配的内存必须实际存在于系统中。分配内存后,它被锁定并且对虚拟内存管理系统的其余部分不可用。

有关详细信息,请参阅:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366528%28v=vs.85%29.aspx

于 2013-10-02T16:49:34.907 回答
0

嗯......这是我为 MD5 暴力破解制作的一个脚本,它在一小时左右的时间内将 RAM 耗尽......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace csharp
{
    class Program
    {
        public static string[] letters = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };

        static void Main(string[] args)
        {
            //string mg = MD5Hash("john");
            bool inp = false;
            string hash;
            while (!inp) {
                Console.WriteLine("Please input the hash you're trying to bruteforce...");
                hash = Console.ReadLine();
                if (hash.Length == 32) {
                    inp = true;
                    Console.WriteLine("Cracked! There you go: " + startProcess(hash));
                    Console.ReadLine();
                }
            }
        }
        public static string startProcess(string hsh) {
            bool solved = false;
            string track = letters[0];
            string ltrack = letters[letters.Length - 1];
            while (!solved) {
                //Console.WriteLine(track); // remove this line for debug
                track = setLCharPos(track, ltrack);
                if (MD5Hash(track) == hsh) {
                    solved = true;
                    return track;
                }
            } return track;
        }
        public static string setLCharPos(string ttr, string ltr) {

            if (ttr == "") return letters[0];

            if (ttr[ttr.Length - 1].ToString() != ltr) {
                return ttr.Substring(0, ttr.Length - 1) + letters[Array.IndexOf(letters, ttr[ttr.Length - 1].ToString()) + 1];
            } else {
                return setLCharPos(ttr.Substring(0, ttr.Length - 1), ltr) + letters[0];
            }
        }
        public static string MD5Hash(string text)
        {
            MD5 md5 = new MD5CryptoServiceProvider();

            //compute hash from the bytes of text
            md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text));

            //get hash result after compute it
            byte[] result = md5.Hash;

            StringBuilder strBuilder = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                //change it into 2 hexadecimal digits
                //for each byte
                strBuilder.Append(result[i].ToString("x2"));
            }

            return strBuilder.ToString();
        }
    }
}

只需插入任何 32 个字符的字符串,它将永远循环。除非您实际上是在尝试暴力破解,否则我对此不承担任何责任。

于 2013-10-02T16:48:42.473 回答
-1

系统为您管理内存。这意味着,只要您的应用程序超出可用内存的边界,系统就会处理它。(将其移动到硬盘等。)

因此,您不能将 ram 填充到 100%。

如果一个应用程序可以填满内存,那就太糟糕了;)

于 2013-10-02T16:38:58.300 回答