-5

我正在尝试将 10 位的整数值转换为字节,但该函数只返回 4 个值,我需要 6 个点,如何解决?

我用来将整数转换为字节的函数

var
  i, j: integer;
  bbI : array[1.. sizeof(integer)] of byte;
begin
  i := 2337669003;
  Move(i, bbI[1], SizeOf(Integer));
  for j := Low(bbI) to High(bbI) do
  Memo1.Lines.Append(IntToHex(bbI[j],2))
end;

函数返回我

8B FF 55 8B

返回的值, 在此处输入图像描述 但我需要更多 2 个值

欧共体 51

该函数应该返回我

8B FF 55 8B EC 51

根据作弊引擎的正确值

在此处输入图像描述

4

3 回答 3

4

我正在尝试将 10 位的整数值转换为字节,但该函数只返回 4 个值,我需要 6 个点,如何解决?

你不能。AnInteger的大小只有 4 个字节。该Integer2337669003是字节序列8B FF 55 8B。您无法从中获得额外的EC 51字节。

AnInt64大小为 8 个字节。字节序列8B FF 55 8B EC 51将是其高 2 字节 ( ) 被截断的Int64值。590324641305165824000 00

从截图中我们可以清楚的看到,字节序列8B FF 55 8B EC 51其实对应的是Win32BitBlt()函数的前4个x86汇编指令。为什么要使用整数值来表示汇编指令?这不是解决这个问题的好方法。您了解 x86 指令集的实际工作原理吗?你了解整数是如何工作的吗?

在这种情况下,我建议使用实际的字节数组而不是整数数组:

var
  Instructions: array[0..5] of byte;
  i: Integer;
begin
  // mov edi,edi
  Instructions[0] := $8B;
  Instructions[1] := $FF;

  // push ebp
  Instructions[2] := $55;

  // mov ebp,esp
  Instructions[3] := $8B;
  Instructions[4] := $EC;

  // push ecx
  Instructions[5] := $51;

  for i := Low(Instructions) to High(Instructions) do
    Memo1.Lines.Append(IntToHex(Instructions[i], 2));
end;

甚至使用记录代替:

type
  BitBltInstructions = packed record
    MovEdiEdi: array[0..1] of byte; // $8B $FF
    PushEbp: byte; // $55
    MovEbpEsp: array[0..1] of byte; // $8B $EC
    PushEcx: byte; // $51
  end;

var
  Instructions: BitBltInstructions;
  bytes: array[0..Sizeof(BitBltInstructions)-1] of byte absolute Instructions;
  i: Integer;
begin
  Instructions.MovEdiEdi[0] := $8B;
  Instructions.MovEdiEdi[1] := $FF;
  Instructions.PushEbp      := $55;
  Instructions.MovEbpEsp[0] := $8B;
  Instructions.MovEbpEsp[1] := $EC;
  Instructions.PushEcx      := $51;

  for i := Low(bytes) to High(bytes) do
    Memo1.Lines.Append(IntToHex(bytes[i], 2));
end;
于 2016-05-25T19:02:20.880 回答
1

您可以使用该指令absolute

procedure Main;
var
  i: Integer;
  x: array[0..3] of Byte absolute i;
begin
  i := 123456;
  Writeln(x[0]);
  Writeln(x[1]);
  Writeln(x[2]);
  Writeln(x[3]);
end;
于 2016-05-25T13:20:57.150 回答
-1

您为此使用变体记录。在这种情况下,记录的两个字段共享相同的内存:

program Test;
uses
  System.SysUtils;

type
  TInteger = record
    case Byte of
      0: (AsValue: Integer);
      1: (AsArray: array [0..3] of Byte);
  end;

var
  X: TInteger;
begin
  X.AsValue := 123456;
  Writeln(X.AsArray[0]);
  Writeln(X.AsArray[1]);
  Writeln(X.AsArray[2]);
  Writeln(X.AsArray[3]);
end.
于 2016-05-25T11:24:50.000 回答