2009-07-10 12 views
1

Je veux faire ce qui suit, mais je reçois des erreurs:Comment affecter plusieurs valeurs à un tableau ouvert ou de taille fixe?

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; 

tampon devrait ressembler à ceci:

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

La fonction calcule la valeur qui doit être écrit pour passer d'une adresse (actuelle) à une autre adresse (CodeCave). Le résultat est converti en octets et écrit dans le processus, mais je ne peux pas mettre les octets dans le tampon comme je l'ai fait ci-dessus.

Je suis désolé pour la question stupide, mais j'ai oublié Delphi après avoir commencé mon éducation avec C#.

Répondre

3

Delphi ne supporte pas les littéraux de tableau comme ça, surtout pas ceux qui accepteraient une valeur de quatre octets et la transformer en quatre valeurs d'un octet.

Vous pouvez avoir des constantes de matrice, as Kcats's answer demonstrates. Vous pouvez également avoir des littéraux à tableau ouvert, mais vous ne pouvez le passer qu'à une fonction qui attend un paramètre de tableau ouvert.

Je ferais quelque chose de différent, dans votre cas. Le code n'est pas seulement un tableau d'octets. Il a une structure, donc je ferais un enregistrement et lui donnerais des champs pour chacune des instructions du code.

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; 

Même si vous ne faites pas tout ce que, notez que j'ai changé le troisième paramètre de WriteProcessMemory. Votre variable Buffer n'est pas un pointeur, donc vous ne pouvez vraiment pas l'utiliser comme type. Vous devez passer l'adresse .

2

Il n'y a aucun moyen d'assigner comme vous le souhaitez. Au lieu de cela, utilisez le Move() et FillMemory() procédures:

FillMemory(@Buffer[0], 4, $90); 
Buffer[4] := $E9; 
Move(Calc, Buffer[5], 4); 
Buffer[9] := $90; 

Notez que j'ai supprimé la variable absolute, car il est plus nécessaire.

1

Vous ne pouvez pas faire cela. Essayez quelque chose comme:

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); 
Questions connexes