在另一个进程中搜索字节数组

时间:2015-08-23 11:15:13

标签: delphi memory

我希望在另一个进程中搜索一个字节数组。我正在使用VirtualQueryEx和ReadProcessMemory,但我不确定该怎么做。

以下是我的代码到目前为止的样子:

Dim KeyValues As Dictionary(Of String, String)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '' to fill the dictionary
    KeyValues = New Dictionary(Of String, String)
    Dim fileContents = IO.File.ReadAllLines("C:\Test\test.txt")  '-- replace with your config file name
    For Each line In fileContents
        Dim kv = Split(line, "=", 2)
        KeyValues.Add(kv(0), kv(1))
    Next

    '' to get a particular value from dictionary, say get value of "developer"
    Dim value As String = KeyValues("developer")
    MessageBox.Show(value)

End Sub

程序冻结。

1 个答案:

答案 0 :(得分:1)

您的代码存在许多问题 而不是用勺子提供解决方案,我将解释在哪里获取信息。

您使用的每个局部变量都必须事先初始化。

初始化局部变量
以下变量未初始化:

{mbi - Set to zero using} FillChar(mbi, SizeOf(Mbi), #0);

BuffSize:= 1024*4 + SizeOf(Target);
//Also add a 
const
  DefaultBufSize = 1024*4; 

从0开始阅读
而是使用GetModuleInfoAddr初始化为流程的起始地址 不要忘记使用以下命令初始化mi: TModuleInfo结构: FillChar(mi, SizeOf(mi), #0);

读取4k +缓冲区
现在继续加载BuffSize的缓冲区,但只增加Addr DefaultBuffSize

检查实际读取的字节数
确保检查BytesRead参数并减少BuffSize,如果读取的字节数更少(或者您将获得访问冲突)。

使用智能搜索算法
使用以下例程查找字符串:

Boyer-Moore-Horspool字符串搜索算法 - Wiki
(Thanks to: Dorin Duminica)

{$PointerMath on}
function FindMem(P1: pointer; Size1: Cardinal; P2: Pointer; Size2: Cardinal): Integer;
var
  i,j,k: Integer;
  LenPattern: Integer;
  LenValue: Integer;
  SkipTable: array[byte] of Integer;
  Found: Boolean;
  B: Byte;

    function __SameByte: Boolean;
    begin
      Result := (PByte(P1)[i] = PByte(P2)[j])
    end; // function __SameChar: Boolean;

begin
  Found := False;
  Result := -1;
  LenPattern := size2;
  if LenPattern = 0 then begin
    Result := 0;
    Found := True;
  end; // if LenPattern = 0
  for B:= low(byte) to high(byte) do SkipTable[B]:= LenPattern;
  for k:= 1 to LenPattern - 1 do SkipTable[PByte(P2)[k]]:= LenPattern - k;
  k:= LenPattern + 0;
  LenValue := size1;
  while (not Found) and (k <= LenValue) do begin
    i := k;
    j := LenPattern;
    while (j >= 1) do begin
      if __SameByte then begin
        j := j -1;
        i := i -1;
      end else
        j := -1;
      if j = 0 then begin
        Result := i;
        Found := True;
      end; // if j = 0 
      k := k + SkipTable[PByte(P1)[k]];
    end; // while (j >= 1)
  end; // while (not Found) and (k <= Size1)
end;

请参阅here for info on GetModuleInfo

祝你好运