Autor
|
Tema: Borrar la cabecera de un ejecutable .NET (Leído 4,248 veces)
|
Borito30
Desconectado
Mensajes: 481
|
Hola estoy intentando borrar la cabecera en .NET el método que encontré por internet y que usan es: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication9 { class Program { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out IntPtr lpNumberOfBytesRead); [DllImport("kernel32.dll", SetLastError = true)] //static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten); static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string lpModuleName); private static int ErasePEHeader() // hModule = Handle to the module, procName = Process name (eg. "notepad") { byte[] imagentheaderptr = new byte[4]; byte[] Stub = new byte[120]; byte[] Stub2 = new byte[0x108 ]; int Out=0, Out2=0; IntPtr hModule = GetModuleHandle(null); string procName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; procName = procName; Console.WriteLine(hModule + "," + procName); IntPtr proc = OpenProcess(0x001F0FFF, false, System.Diagnostics.Process.GetProcessesByName(procName)[0].Id); IntPtr IMAGE_NT_HEADER = new IntPtr ((hModule .ToInt32() + 60)), out2 = IntPtr .Zero; ReadProcessMemory(proc, IMAGE_NT_HEADER, imagentheaderptr, 4, out out2); if ((WriteProcessMemory(proc, hModule, Stub, 120, ref Out) == true) && (WriteProcessMemory(proc, hModule, Stub2, 0x100, ref Out2) == true)) return Out + Out2; else return 0; } static void Main(string[] args) { int a = ErasePEHeader(); Console.WriteLine(a); Console.ReadKey(); } } }
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
|
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... 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
Mensajes: 9.878
|
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. 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
Mensajes: 481
|
Algo así pero me devuelve excepcion: 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(); } } } 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. Tendré que repasarme enserio la teoria.. El error que me devuelve es: Y ya de paso dejar de copy/pastear y aprender a programar
|
|
« Ú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
Mensajes: 9.878
|
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: [DllImport("Kernel32.dll", EntryPoint = "RtlZeroMemory", SetLastError = false)] private void ZeroMemory(IntPtr destination, IntPtr length) {}
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
Mensajes: 481
|
Basicamente es lo mismo: [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)
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Terminar proceso y borrar ejecutable en BATCH
Scripting
|
GN1000
|
6
|
6,093
|
12 Octubre 2007, 07:33 am
por Crazy.sx
|
|
|
Borrar ejecutable en proceso!
Programación C/C++
|
dooque
|
3
|
3,821
|
17 Diciembre 2010, 04:28 am
por dooque
|
|
|
Borrar ejecutable en ejecucion
Análisis y Diseño de Malware
|
nts94
|
2
|
3,135
|
26 Marzo 2012, 11:51 am
por nts94
|
|
|
Cuando se pase de fecha, borrar el propio ejecutable.
.NET (C#, VB.NET, ASP)
|
Meta
|
9
|
4,244
|
17 Enero 2016, 14:57 pm
por Meta
|
|
|
Como borrar la cabecera de mi ejecutable usando esta funcion
Programación C/C++
|
Borito30
|
3
|
2,122
|
26 Mayo 2017, 02:36 am
por Borito30
|
|