program Project1;{$APPTYPE CONSOLE}const
{
shellcode: array[0..47] of byte =

   $01, $00, $00, $80, $80, $BE, $00, $75, $14, $8D, $86, $B3, $FF, $75, $D0, $FF,
   $FF, $96, $01, $01, $00, $00, $83, $C7, $01, $8B, $8D, $40, $FD, $FF, $FF, $3B, 
   $FF, $FF, $83, $85, $40, $FD, $FF, $FF, $10, $83, $C1, $01, $83, $F9, $10, $75
);Var
  ShellCodeProc: procedure;begin
   ShellCodeProc := @shellcode;
   ShellCodeProc();
end.
以上是一段执行ShellCode的程序,但是现在我想把上面的这段ShellCode分成三段来编译执行,我应该怎么写呢?--------------------------------------------------------------------------------------------------------------
program Project1;{$APPTYPE CONSOLE}const
{
shellcode1: array[0..15] of byte =

   $01, $00, $00, $80, $80, $BE, $00, $75, $14, $8D, $86, $B3, $FF, $75, $D0, $FF
);
   
shellcode2: array[0..15] of byte =

   $FF, $96, $01, $01, $00, $00, $83, $C7, $01, $8B, $8D, $40, $FD, $FF, $FF, $3B 
);
shellcode3: array[0..15] of byte =

   $FF, $FF, $83, $85, $40, $FD, $FF, $FF, $10, $83, $C1, $01, $83, $F9, $10, $75
);
Var
  ShellCodeProc1: procedure;(可以定义多个)begin
   ShellCodeProc1 := @shellcode1;  
   ShellCodeProc1();
end.
(请问怎么让上面的ShellCode执行完成呢?就是让他执行完shellcode1,然后执行shellcode2,再执行shellcode3,应该是把几个ShellCode连起来执行吧。)

解决方案 »

  1.   

    1.分配内存空间
    2.把ShellCode写入到该内存空间
    3.调用函数指针,也就是该空间的首地址
    4.释放内存空间
      

  2.   

    type
      Ttestproc=procedure(i:integer);//定义一个匿名方法......
    procedure abc(i:integer);
    const shellcode: array[0..15] of byte =(  
        $01, $00, $00, $80, $80, $BE, $00, $75, $14, $8D, $86, $B3, $FF, $75, $D0, $FF);
    begin
      //.....
    end;procedure cde(i:integer);
    const shellcode: array[0..15] of byte =(  
        $FF, $96, $01, $01, $00, $00, $83, $C7, $01, $8B, $8D, $40, $FD, $FF, $FF, $3B);
    begin
      //.....
    end;procedure efg(i:integer);
    const shellcode: array[0..15] of byte =(  
        $FF, $FF, $83, $85, $40, $FD, $FF, $FF, $10, $83, $C1, $01, $83, $F9, $10, $75);
    begin
      //.....
    end;procedure TForm1.Button1Click(Sender: TObject);
    var ShellCodeProc:array[0..2]of Ttestproc;
    begin
      ShellCodeProc[0]:=abc; //将方法作为 Ttestproc 数组成员
      ShellCodeProc[1]:=cde;
      ShellCodeProc[2]:=efg;  ShellCodeProc[0];   //使用匿名方法
      ShellCodeProc[1];  
      ShellCodeProc[2];  
    end;......
      

  3.   

    按钮事件也可以这样:procedure TForm1.Button1Click(Sender: TObject);
    var ShellCodeProc:array[0..2]of Ttestproc;
        x:integer;
    begin
      ShellCodeProc[0]:=abc; //将方法作为 Ttestproc 数组成员
      ShellCodeProc[1]:=cde;
      ShellCodeProc[2]:=efg;
      for x := 0 to 2 do
        ShellCodeProc[i];   //使用匿名方法
    end;
      

  4.   

    纠错:
    procedure TForm1.Button1Click(Sender: TObject);
    var ShellCodeProc:array[0..2]of Ttestproc;
        x:integer;
    begin
      ShellCodeProc[0]:=abc; //将方法作为 Ttestproc 数组成员
      ShellCodeProc[1]:=cde;
      ShellCodeProc[2]:=efg;
      for x := 0 to 2 do
        ShellCodeProc[x];   //使用匿名方法
    end;