我希望在另一个进程中搜索一个字节数组。我正在使用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
程序冻结。
答案 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开始阅读
而是使用GetModuleInfo
将Addr
初始化为流程的起始地址
不要忘记使用以下命令初始化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;
祝你好运