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
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;
}