我想执行以下操作,但遇到错误:
procedure JumpToCodeCave(CurrentLocation:DWORD;Destination:Pointer;out_JmpBack:Pointer);
var calc:DWORD;
jmppatch:Array[0..3] of byte absolute calc;
Buffer:Array[0..9] of byte;
begin
calc := (Cardinal(Destination) - $5)-(CurrentLocation + $4);
Buffer := [$90,$90,$90,$90,$E9,jmppatch,$90]; //<< Error here <<
WriteProcessmemory(Handle,Pointer(CurrentLocation),Pointer(Buffer),10,nil);
out_JmpBack^ := Currentlocation + $A;
end;Buffer应如下所示:
0x90,0x90,0x90,0xE9,jmppatch[0],jmppatch[1],jmppatch[2],jmppatch[3],0x90该函数计算从一个地址(当前地址)跳转到另一个地址(CodeCave)时应该写入的值。.The结果被转换为字节并写入到进程中,但我不能像上面那样将字节放入缓冲区。
我为这个愚蠢的问题感到抱歉,但在我开始在C#接受教育后,我已经忘记了Delphi。
发布于 2009-07-10 14:34:37
Delphi不支持这样的数组文字,特别是那些接受四字节值并将其转换为四个单字节值的数组文字。
你可以有数组常量,as Kcats's answer demonstrates。您也可以使用开放数组文字,但只能将其传递给需要开放数组参数的函数。
在你的情况下,我会做一些不同的事情。代码不仅仅是一个字节数组。它有结构,所以我会做一个记录,并为代码中的每条指令指定字段。
type
TPatch = packed record
Nops: array [0..3] of Byte;
JmpInst: packed record
Opcode: Byte;
Offset: LongWord;
end;
Nop: Byte;
end;
const
Nop = $90;
Jmp = $e9;
var
Buffer: TPatch;
begin
// nop; nop; nop; nop;
FillChar(Buffer.Nops, SizeOf(Buffer.Nops), Nop);
// jmp xxxx
Buffer.JmpInst.Opcode := Jmp;
Buffer.JmpInst.Offset := LongWord(Destination) - SizeOf(Buffer.JmpInst)
- (CurrentLocation + SizeOf(Buffer.Nops));
// nop
Buffer.Nop := Nop;
WriteProcessmemory(Handle, Ptr(CurrentLocation), @Buffer, SizeOf(Buffer), nil);
end;即使您没有执行所有这些操作,请注意我已经更改了WriteProcessMemory的第三个参数。您的Buffer变量不是指针,所以您确实不能将其类型转换为指针。您需要传递地址。
发布于 2009-07-10 13:05:54
没有办法分配你想要的方式。请改用Move()和FillMemory()过程:
FillMemory(@Buffer[0], 4, $90);
Buffer[4] := $E9;
Move(Calc, Buffer[5], 4);
Buffer[9] := $90;注意,我已经删除了absolute变量,因为它不再是必需的。
发布于 2009-07-10 13:09:45
你不能这么做。尝试如下所示:
var
Buffer:Array[0..9] of byte = ($90,$90,$90,$90,$E9,$CC,$CC,$CC,$CC,$90);
begin
PCardinal(@buffer[5])^ := (Cardinal(Destination) - $5)-(CurrentLocation + $4);https://stackoverflow.com/questions/1109330
复制相似问题