Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Rekt

#1
.NET (C#, VB.NET, ASP) / Escanear memoria.
22 Julio 2017, 12:37 PM
Hola, estoy programando un programa que detecta malware según ciertos patrones que tenga.
La verdad es que soy novato con lo relacionado con memoria y no estoy seguro de cómo hacerlo, estoy interesado en escanear cadenas/strings que son estáticas en la memoria pero no he encontrado ninguna forma eficaz de hacerlo.

He encontrado esto en un foro, pero siempre devuelve 0

Código (csharp) [Seleccionar]
           public static List<MEMORY_BASIC_INFORMATION> MemReg { get; set; }

           public static void MemInfo(IntPtr pHandle)
           {
               IntPtr Addy = new IntPtr();
               while (true)
               {
                   MEMORY_BASIC_INFORMATION MemInfo = new MEMORY_BASIC_INFORMATION();
                   int MemDump = VirtualQueryEx(pHandle, Addy, out MemInfo, Marshal.SizeOf(MemInfo));
                   if (MemDump == 0) break;
                   if ((MemInfo.State & 0x1000) != 0 && (MemInfo.Protect & 0x100) == 0)
                       MemReg.Add(MemInfo);
                   Addy = new IntPtr(MemInfo.BaseAddress.ToInt32() + MemInfo.RegionSize);
               }
           }
           public static IntPtr _Scan(byte[] sIn, byte[] sFor)
           {
               int[] sBytes = new int[256]; int Pool = 0;
               int End = sFor.Length - 1;
               for (int i = 0; i < 256; i++)
                   sBytes[i] = sFor.Length;
               for (int i = 0; i < End; i++)
                   sBytes[sFor[i]] = End - i;
               while (Pool <= sIn.Length - sFor.Length)
               {
                   for (int i = End; sIn[Pool + i] == sFor[i]; i--)
                       if (i == 0) return new IntPtr(Pool);
                   Pool += sBytes[sIn[Pool + End]];
               }
               return IntPtr.Zero;
           }
           public static IntPtr AobScan(string ProcessName, byte[] Pattern)
           {
               Process[] P = Process.GetProcessesByName(ProcessName);
               if (P.Length == 0) return IntPtr.Zero;
               MemReg = new List<MEMORY_BASIC_INFORMATION>();
               MemInfo(P[0].Handle);
               for (int i = 0; i < MemReg.Count; i++)
               {
                   byte[] buff = new byte[MemReg[i].RegionSize];
                   ReadProcessMemory(P[0].Handle, MemReg[i].BaseAddress, buff, MemReg[i].RegionSize, 0);

                   IntPtr Result = _Scan(buff, Pattern);
                   if (Result != IntPtr.Zero)
                       return new IntPtr(MemReg[i].BaseAddress.ToInt32() + Result.ToInt32());
               }
               return IntPtr.Zero;
           }