c++ - 扫描速度慢的内存扫描器

标签 c++ c delphi memory

我正在研究内存扫描器,但扫描速度太慢了。有人可以帮助我改进它吗?

procedure FirstScan(scantype, scanvalue: string);
var
 value :integer;
 dwEndAddr : dword;
 i:dword;
 mbi : TMemoryBasicInformation;
begin
  while (VirtualQuery(Pointer(DWORD(mbi.BaseAddress) + MBI.RegionSize), MBI, SizeOf(MEMORY_BASIC_INFORMATION))=SizeOf(TMemoryBasicInformation)) do begin
   if (MBI.State = MEM_COMMIT) and (MBI.Protect = PAGE_READWRITE) then begin
    dwEndAddr := DWORD(mbi.BaseAddress) + MBI.RegionSize;
     for i := DWORD(MBI.BaseAddress) to (dwEndAddr - 1 - sizeof(DWORD)) do begin
      Application.ProcessMessages;
      try
       if scantype = '1 Byte' then begin
        value := PBYTE(i)^;
        if scanvalue = IntToStr(value) then ListBox1.Items.Add(IntToHex(i,8));
       end;
       //others scantypes here...
      except
       Break;
      end;
     end;
   end; 
  end;
end;

我了解到我需要一次读取 4096 字节的页面,然后将它们存储在内存中并对其进行操作,直到我需要一个新页面然后再获取另一个 4096 字节的页面...

但我不知道我该怎么做...

有人可以帮助我吗?代码可以是 C 或 C++...

最佳答案

我可以帮你一点点……让 Application.ProcessMessages 脱离内循环。你在为每个人打电话。单例的。字节。你。扫描。您不需要对窗口消息做出的响应。 :)

将它向上移动到外循环中,您应该会看到速度显着提高。我会说产生一个线程并完全摆脱 Application.ProcessMessages,因为这真的不是这段代码要处理的工作,但我不确定 Delphi 如何/是否执行线程。

另外....您将扫描参数作为字符串传递?如果您坚持这样做,请在开始循环之前设置一个 int 或 enum 或其他东西,说明要使用的扫描类型,将值转换为对您的搜索有用的类型,然后进行比较。字符串比较往往比整数比较慢,尤其是当您每次都创建新字符串时。

关于c++ - 扫描速度慢的内存扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015598/

相关文章:

c - 二叉树提取代码

delphi - 如何将指针值转换为字符串

c# - C#中的Delphi类

sql-server - 为什么带有日期/时间值的 TADOTable 中的 Locate() 不起作用

c++ - 为什么 std::count 在处理字符串时将常量传递给 lambda,而不是字符?

C++ json-nlohmann 访问列表元素

c++ - 未捕获从代码的特定部分抛出的异常

c++ - 如何迭代 Boost Multi_index 容器的索引?

c - localtime() 在 c 中因段错误而崩溃

c - 是否有任何 C 标准中定义的通用 printf-ish 例程