首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个值赋给开放数组或固定大小的数组?

如何将多个值赋给开放数组或固定大小的数组?
EN

Stack Overflow用户
提问于 2009-07-10 12:50:31
回答 3查看 977关注 0票数 1

我想执行以下操作,但遇到错误:

代码语言:javascript
复制
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应如下所示:

代码语言:javascript
复制
0x90,0x90,0x90,0xE9,jmppatch[0],jmppatch[1],jmppatch[2],jmppatch[3],0x90

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-10 14:34:37

Delphi不支持这样的数组文字,特别是那些接受四字节值并将其转换为四个单字节值的数组文字。

你可以有数组常量,as Kcats's answer demonstrates。您也可以使用开放数组文字,但只能将其传递给需要开放数组参数的函数。

在你的情况下,我会做一些不同的事情。代码不仅仅是一个字节数组。它有结构,所以我会做一个记录,并为代码中的每条指令指定字段。

代码语言:javascript
复制
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变量不是指针,所以您确实不能将其类型转换为指针。您需要传递地址。

票数 3
EN

Stack Overflow用户

发布于 2009-07-10 13:05:54

没有办法分配你想要的方式。请改用Move()和FillMemory()过程:

代码语言:javascript
复制
FillMemory(@Buffer[0], 4, $90);
Buffer[4] := $E9;
Move(Calc, Buffer[5], 4);
Buffer[9] := $90;

注意,我已经删除了absolute变量,因为它不再是必需的。

票数 2
EN

Stack Overflow用户

发布于 2009-07-10 13:09:45

你不能这么做。尝试如下所示:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1109330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档