gpt4 book ai didi

delphi - 如何为开放或固定大小的数组分配多个值?

转载 作者:行者123 更新时间:2023-12-03 15:43:05 25 4
gpt4 key购买 nike

我想执行以下操作,但出现错误:

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;


缓冲区应如下所示:

0x90,0x90,0x90,0xE9,jmppatch[0],jmppatch[1],jmppatch[2],jmppatch[3],0x90


该函数计算应写入的值以从一个地址(当前)跳转到另一个地址(CodeCave)。结果被转换为字节并写入进程,但是我不能像以前那样将字节放入Buffer中以上。

我为这个愚蠢的问题感到抱歉,但是在我开始接受C#教育之后,我已经忘记了Delphi。

最佳答案

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变量不是指针,因此您实际上无法将其类型转换为一个。您需要传递地址。

关于delphi - 如何为开放或固定大小的数组分配多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com