[Enlace externo eliminado para invitados]
y falla al cargar la tabla de importacion de direcciones , si alguien tiene idea de como seguir que me diga por que estoy estancado.
//-------------------------------------------------------------------------------------------
// PoC - [Base Relocation]
//
//Descripción: Ejecuta un archivo mapeado en memoria sin guardarlo en disco
//Autor: Hacker_Zero
//Fecha: 18-8-2009
//Basado en: http://www.joachim-bauch.de/tutorials/load_dll_memory.html
// modificaciones 2015 joselin
//-----------------------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
IMAGE_REL_BASED_HIGHLOW = 3;
type
PImageImportDescriptor = ^TImageImportDescriptor;
TImageImportDescriptor = packed record
NAME :DWORD;
FirstThunk: DWORD;
END;
//imagebase
PImageBaseRelocation = ^TImageBaseRelocation;
TImageBaseRelocation = packed record
VirtualAddress: DWORD;
SizeOfBlock: DWORD;
END;
PImageImportByName = ^TImageImportByName;
TImageImportByName = packed record
name:dword;
END;
_u1=packed record
dName: DWORD;
case Integer of
0: (ForwarderString:PByte);
1: (Functionn:PDWORD);
2: (Ordinal: DWORD);
3: (AddressOfData:PImageimportbyname)
END;
PImageThunkData = ^TImageThunkData;
TImageThunkData = packed record
u1:_u1;
END;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
IDH: PIMAGEDOSHEADER ;
INTH:PIMAGENTHEADERS ;
ISH:PIMAGESECTIONHEADER ;
IBR: PImageBaseRelocation;
IID : PImageImportDescriptor;
ITD: PImageThunkData ;
IIBN: PImageImportByName ;
implementation
{$R *.dfm}
{$R recurso.res}
procedure ejecutarenmemoria;
var
//recursos***
hResource:thandle;
HGlobal : thandle;
FileSize :dword;
//
lpfilemaped:pansichar;
exebuffer:pansichar;
i:integer;
delta :dword;
RelocationBlock:pansichar;
RelocationEntry:PDWORD; //^Word;??
types :dword;
offset:dword;
newAddr:pdword;
HLIB:HMODULE;
EntryPoint:dword;
dwTemp:dword;
begin
hResource := FindResource(HInstance, 'EXE', RT_RCDATA);
if hResource = 0 then Exit;
HGlobal := LoadResource(HInstance, hResource);
if HGlobal = 0 then Exit;
FileSize := SizeOfResource(HInstance, hResource);
lpFileMaped :=LockResource(hGlobal);
//Obtenemos la cabecera DOS y PE en las estructuras
IDH :=PIMAGEDOSHEADER(@lpFileMaped[0]);
INTH :=PIMAGENTHEADERS(@lpFileMaped[IDH._lfanew]);
showmessage(pansichar(idh));
showmessage(pansichar(inth));
//Creamos el buffer del tamaño del SizeOfImage en el que cargaremos el ejecutable
exebuffer :=pansichar (VirtualAlloc(nil, INTH^.OptionalHeader.SizeOfImage,MEM_COMMIT or MEM_RESERVE , PAGE_EXECUTE_READWRITE));
if exebuffer = nil then
showmessage('exebuffer = nil')
else
showmessage('valor sizeimage difiere del que me da lordpe: '+ inttohex(integer(exebuffer),8)+#13#10+
'creo que esta bien asi');
//Copiamos la cabecera DOS y PE al buffer
CopyMemory(@ExeBuffer[0],@lpFileMaped[0],INTH^.OptionalHeader.SizeOfHeaders);
//Copiamos las secciones en su VirtualOffset en el buffer
for i := 0 to INTH^.FileHeader.NumberOfSections - 1 do
begin
// ISH := @lpFileMaped[IDH^._lfanew + 248 + i * 40];
ISH :=(PIMAGESECTIONHEADER(@lpFileMaped[IDH._lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i]));
CopyMemory(@ExeBuffer[ISH.VirtualAddress],@lpFileMaped[ISH.PointerToRawData],ISH.SizeOfRawData);
end;
showmessage('exebuffer: '+INTTOSTR(INTEGER(EXEBUFFER))+' - '+'imagebase:'+ inttostr(INTH^.OptionalHeader.ImageBase));
//Calculamos el delta entre la dirección del buffer y el ImageBase
Delta:= dword(exebuffer) -(INTH^.OptionalHeader.ImageBase);
showmessage('cabezera copiada : ' +exebuffer + ' valor delta '+ inttostr(delta));
//------------------------------------------------------------
//* -Reubicamos la dirección base del ejecutable :D- */
//------------------------------------------------------------
//Si no hay tabla de reubicación, salimos
if(INTH^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)= 0 then
begin
showmessage('No se ha encontrado Tabla de Reubicaciones\nImposible cargar el archivo');
Exit;
end
else begin
//Obteemos el Image Base Relocation
ibr :=(PImageBaseRelocation(ExeBuffer+INTH^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress));
//Vamos recorriendo todas las etradas del bloque
while ibr.VirtualAddress <> 0 DO
begin
//Obtenemos el Bloque de reubicación
RelocationBlock :=(ExeBuffer)+(IBR.virtualAddress);
//Obtenemos la primera entrada del bloque
RelocationEntry :=(PDWORD(pansichar(IBR)+sizeof(TImageBaseRelocation)));
//Recorremos todas las entradas del bloque
for i:= 0 to(trunc((IBR.SizeOfBlock - sizeof(TImageBaseRelocation))/2)-1) do
begin
//Obtenemos los 4 bits que definen el tipo de reubicación
Types:= (RelocationEntry^ and $F000) div $1000;
//Obtenemos los 12 bits que definen la dirección de la reubicación
offset :=(RelocationEntry^ and $FFF);
//Si el tipo de reubicación es relativo a la dirección base, añadimso el delta
if types = IMAGE_REL_BASED_HIGHLOW then begin
newAddr :=(PDWORD(RelocationBlock+offset));
newAddr^ := Delta+(DWORD(newAddr^));
inc(RelocationEntry);
END;
//Vamos al siguiente bloque
IBR := PIMAGEBASERELOCATION(DWORD(IBR) + IBR.SizeOfBlock);
END;
END;
//---------------------------------------------------------------------
//* -Cargamos los valores de la IAT para poder llamar a las apis- */
//---------------------------------------------------------------------
//Comprobamos si hay Import Data Descriptor
if (INTH^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size>0) then
begin
//
IID :=PIMAGEIMPORTDESCRIPTOR(exebuffer+(INTH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
//Vamos recorriendo todas las Dll's importadas por el ejecutable
showmessage(exebuffer+inttostr(INTH^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
while (IID^.Name <> 0) do begin
//Cargamos la dll
hLib := LoadLibraryA(pansichar(ExeBuffer+IID^.Name);
//Obtenemos la dirección al primer miembro del array Image Thunk Data's
ITD :=PImageThunkData(ExeBuffer+IID^.FirstThunk);
//Vamos recorriendo las funciones importadas
while ITD^.u1.Ordinal <> 0 do begin
//Cargamos el Image Import By Name para obtener el nombre
IIBN := PIMAGEIMPORTBYNAME(dword(pdword(ExeBuffer))+dword(ITD^.u1.Functionn));
//Obtenemos la dirección de la función y la guardamos en la IAT
ITD^.u1.Functionn :=pdword(GetProcAddress(hLib,(@IIBN^.Name)));
end;
//Obteemos el EntryPoint de ejecutable que cargamos en el buffer
EntryPoint :=DWORD(ExeBuffer)+(INTH^.OptionalHeader.AddressOfEntryPoint);
end;
//Llamamos al EntryPoint
CreateThread(nil,dwTemp,@EntryPoint,nil,dwTemp,dwTemp);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ejecutarenmemoria;
end;
end.