elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Borrar la cabecera de un ejecutable .NET
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Borrar la cabecera de un ejecutable .NET  (Leído 3,939 veces)
Borito30


Desconectado Desconectado

Mensajes: 481


Ver Perfil
Borrar la cabecera de un ejecutable .NET
« en: 26 Mayo 2017, 16:21 pm »

Hola estoy intentando borrar la cabecera en .NET el método que encontré por internet y que usan es:
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8.  
  9. namespace ConsoleApplication9
  10. {
  11.    class Program
  12.    {
  13.        [DllImport("kernel32.dll")]
  14.        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
  15.        [DllImport("kernel32.dll", SetLastError = true)]
  16.        static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out IntPtr lpNumberOfBytesRead);
  17.        [DllImport("kernel32.dll", SetLastError = true)]
  18.        //static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);
  19.        static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);
  20.        [DllImport("kernel32.dll")]
  21.        public static extern IntPtr GetModuleHandle(string lpModuleName);
  22.        private static int ErasePEHeader() // hModule = Handle to the module, procName = Process name (eg. "notepad")
  23. {
  24.    byte[] imagentheaderptr = new byte[4];
  25.    byte[] Stub = new byte[120];
  26.    byte[] Stub2 = new byte[0x108];
  27.    int Out=0, Out2=0;
  28.  
  29.            IntPtr hModule = GetModuleHandle(null);
  30.  
  31.            string procName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
  32.            procName = procName;
  33.            Console.WriteLine(hModule + "," + procName);
  34.  
  35.            IntPtr proc = OpenProcess(0x001F0FFF, false, System.Diagnostics.Process.GetProcessesByName(procName)[0].Id);
  36.    IntPtr IMAGE_NT_HEADER = new IntPtr((hModule.ToInt32() + 60)), out2 = IntPtr.Zero;
  37.    ReadProcessMemory(proc, IMAGE_NT_HEADER, imagentheaderptr, 4, out out2);
  38.    if ((WriteProcessMemory(proc, hModule, Stub, 120, ref Out) == true) && (WriteProcessMemory(proc, hModule, Stub2, 0x100, ref Out2) == true)) return Out + Out2;
  39.    else return 0;
  40. }
  41.        static void Main(string[] args)
  42.        {
  43.            int a = ErasePEHeader();
  44.            Console.WriteLine(a);
  45.            Console.ReadKey();
  46.        }
  47.    }
  48. }
Pero siempre me devuelve 0 o falso. ¿Alguien que me pueda explicar porque nunca la borra?


« Última modificación: 26 Mayo 2017, 18:59 pm por Eleкtro » En línea

Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.465


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Borrar la cabecera de un ejecutable .NET
« Respuesta #1 en: 26 Mayo 2017, 18:45 pm »

Hola!

Verifica lo que devuelven las APIs que llamas.

Por otro lado, no necesitas ni usar OpenProcess, WriteProcessMemory, etc, etc. pues estás en tu propio proceso.

Lo único que te hraía falta sería VirtualProtect para poder escribir y luego otra API tipo ZeroMemory para poner todo a cero.

También deberías depurar el código...  :P

Saludos!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Borrar la cabecera de un ejecutable .NET
« Respuesta #2 en: 26 Mayo 2017, 18:59 pm »

Verifica lo que devuelven las APIs que llamas.

Ya lo he hecho yo por él. La función WriteProcessMemory le devuelve el código de error Win32 "998" (dec) que hace referencia al nombre de error "ERROR_NOACCESS" ("Invalid access to memory location"), traducido a código de error HRESULT: "800703E6" (hex), lo que equivale a la excepción administrada System.BadImageFormatException con mensaje de error: "Se realizó un acceso no válido a la ubicación de memoria."

Algo falla al intentar escribir la memoria, eso está claro. :xD

No he depurado las demás llamadas a las otras funciones declaradas de la WinAPI (no es mi trabajo hacerlo).



El código que estás usando es un copy&paste de aquí:


Así que si por casualidad lo que estás intentando hacer es eliminar la cabecera PE con la intención de hacer un anti-dumper, entonces quizas esta otra metodología te pueda resultar de utilidad:


( no he probado el código, la ing. inversa o temas relacionados no son mi fuerte. )

En ese código parece aplicarse lo que te mencionó el compañero MckSYS:
Lo único que te hraía falta sería VirtualProtect para poder escribir y luego otra API tipo ZeroMemory para poner todo a cero.

PD: Puedes traducirlo a C# con cualquier conversor de código online.

Saludos!
« Última modificación: 26 Mayo 2017, 19:16 pm por Eleкtro » En línea

Borito30


Desconectado Desconectado

Mensajes: 481


Ver Perfil
Re: Borrar la cabecera de un ejecutable .NET
« Respuesta #3 en: 27 Mayo 2017, 04:51 am »

Algo así pero me devuelve excepcion:
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApplication9
{
    class Program
    {
        public enum MemoryProtectionConsts : uint
        {
            EXECUTE = 0x10,
            EXECUTE_READ = 0x20,
            EXECUTE_READWRITE = 0x40,
            NOACCESS = 0x01,
            READONLY = 0x02,
            READWRITE = 0x04
        }

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string lpModuleName);
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool VirtualProtect(IntPtr lpAddress, int dwSize, MemoryProtectionConsts flNewProtect,
            int lpflOldProtect);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "RtlSecureZeroMemory")]
        private static extern void SecureZeroMemory(IntPtr ptr, IntPtr cnt);
        private static int ErasePEHeader() // hModule = Handle to the module, procName = Process name (eg. "notepad")
        {
            int OldProtect = 0;
            IntPtr pBaseAddr = GetModuleHandle(null);
            VirtualProtect(pBaseAddr, 4096, // Assume x86 page size
             MemoryProtectionConsts.READWRITE, OldProtect);
            SecureZeroMemory(pBaseAddr, (IntPtr)4096);
            return 0;
        }
        static void Main(string[] args)
        {
            ErasePEHeader();
            Console.WriteLine("");
            Console.ReadKey();
        }
    }
}

Citar
Por otro lado, no necesitas ni usar OpenProcess, WriteProcessMemory, etc, etc. pues estás en tu propio proceso.
Tienes razón me pase cinco pueblos.
Citar
Tendré que repasarme enserio la teoria..

El error que me devuelve es:


Y ya de paso dejar de copy/pastear y aprender a programar  :xD

« Última modificación: 27 Mayo 2017, 05:12 am por Ragaza » En línea

Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Borrar la cabecera de un ejecutable .NET
« Respuesta #4 en: 27 Mayo 2017, 12:50 pm »

El error que me devuelve es:

El mensaje de error te está diciendo que no encuentra ningún export con el nombre "RtlSecureZeroMemory", y eso proobablemente sea por que, como se indica en la MSDN, el alias "SecureZeroMemory" que apunta a la función "RtlSecureZeroMemory" no está expuesta en ninguna dll.

En su lugar puedes probar a utilizar la función RtlZeroMemory:
Código
  1. [DllImport("Kernel32.dll", EntryPoint = "RtlZeroMemory", SetLastError = false)]
  2. private void ZeroMemory(IntPtr destination, IntPtr length)
  3. {}
El efecto es exactamente el mismo, según la documentación oficial, la única diferencia es que RtlSecureZeroMemory garantiza el borrado/zerofill.

Saludos.
« Última modificación: 27 Mayo 2017, 12:52 pm por Eleкtro » En línea

Borito30


Desconectado Desconectado

Mensajes: 481


Ver Perfil
Re: Borrar la cabecera de un ejecutable .NET
« Respuesta #5 en: 28 Mayo 2017, 18:18 pm »

Basicamente es lo mismo:
Código:
[DllImport("kernel32.dll")]
private static extern IntPtr ZeroMemory(IntPtr addr, IntPtr size);

[DllImport("kernel32.dll")]
private static extern IntPtr VirtualProtect(IntPtr lpAddress, IntPtr dwSize, IntPtr flNewProtect, ref IntPtr lpflOldProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string lpModuleName);

public static void EraseHeader()
{
IntPtr address = GetModuleHandle(null);
IntPtr dwOld = default(IntPtr);
VirtualProtect(address, (IntPtr)4096, (IntPtr)0x40, ref dwOld);
ZeroMemory(address, (IntPtr)4096);
}

Pero si cargas un formulario a tu aplicación te mostrara System.outofmemory exception.
En línea

Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Terminar proceso y borrar ejecutable en BATCH
Scripting
GN1000 6 5,775 Último mensaje 12 Octubre 2007, 07:33 am
por Crazy.sx
Borrar ejecutable en proceso!
Programación C/C++
dooque 3 3,579 Último mensaje 17 Diciembre 2010, 04:28 am
por dooque
Borrar ejecutable en ejecucion
Análisis y Diseño de Malware
nts94 2 2,923 Último mensaje 26 Marzo 2012, 11:51 am
por nts94
Cuando se pase de fecha, borrar el propio ejecutable.
.NET (C#, VB.NET, ASP)
Meta 9 3,805 Último mensaje 17 Enero 2016, 14:57 pm
por Meta
Como borrar la cabecera de mi ejecutable usando esta funcion
Programación C/C++
Borito30 3 1,891 Último mensaje 26 Mayo 2017, 02:36 am
por Borito30
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines