如何编写一个最大化物理 RAM 使用的程序
本文关键字:RAM 程序 最大化 何编写 一个 | 更新日期: 2023-09-27 18:33:41
我正在尝试编写一个仅使用所有可用物理内存的程序(即任务管理器显示 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();
}
}
如果你在64位系统上运行,你可以使用AllocateUserPhysicalPages
函数来分配物理内存
从文档中:
分配用户物理页面函数用于分配物理内存,这些内存以后可以在进程的虚拟地址空间中映射。必须在调用方的令牌中启用 SeLockMemoryPrivilege 特权,否则函数将失败并ERROR_PRIVILEGE_NOT_HELD。有关详细信息,请参阅特权常量。 此函数分配的内存必须实际存在于系统中。分配内存后,它将被锁定,并且对虚拟内存管理系统的其余部分不可用。
有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366528%28v=vs.85%29.aspx
嗯...这是我为 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 个字符的字符串,它将永远循环。除非你真的想蛮力,否则我对此不承担任何责任。
系统为您管理内存。这意味着,只要您的应用程序超出可用 ram 的边界,系统就会处理它。(将其移动到硬盘等。
因此,您不能将内存填满到 100%。
如果一个应用程序可以填满内存,那就太糟糕了;)