Bueno la primera técnica consiste en borrar la cabecera para ello usamos:

Código: Seleccionar todo

public enum FreeConsts : uint
        {
            MEM_RELEASE = 0x8000
        }
    	[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")]
        private static extern bool VirtualFree(IntPtr lpAddress, UInt32 dwSize, FreeConsts dwFreeType);
		
		[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);
		VirtualFree(address, 0, FreeConsts.MEM_RELEASE);
		}
Llamamos a la función y se nos borra. Esta es una buena técnica para evitar el dumpeado pero en el momento en que uno usa eventos deja de ser funcional(o al menos yo probe y no funciono)

La otra técnica consiste en usar PAGE_GUARD, descubierta por kris kapersky. La técnica es bastante simple consiste en que si definimos la protección de memoria de una sección como PAGE_GUARD, la función "ReadProcessMemory" fallará. Lo que hacemos es usar VirtualProtectEx" para quitar el atributo PAGE_GUARD, a continuación, leemos la sección y finalmente restauramos el atributo PAGE_GUARD. Un ejemplo de ello sería:

Código: Seleccionar todo

//http://waleedassar.blogspot.com - (@waleedassar)
//Code to show how to use the "PAGE_GUARD" anti-dumping trick.
#include "stdafx.h"
#include "windows.h"
 
 
#pragma data_seg("walied4")
int x=1;
#pragma data_seg()
 
 
int __stdcall watch()
{
        while(1)
        {
            MEMORY_BASIC_INFORMATION MBI={0};
            VirtualQuery(&x,&MBI,sizeof(MBI));
            if(!((MBI.Protect)&PAGE_GUARD)) ExitProcess(0);
        }
}
 
int main(int argc, char* argv[])
{
        unsigned long fake_base=(unsigned long)(&x);  //the page is initially PAGE_WRITECOPY
        *(unsigned long*)fake_base=0xCECECECE;        //Now it is PAGE_READWRITE
        unsigned long old;
        VirtualProtect((void*)fake_base,0x1000,PAGE_READWRITE|PAGE_GUARD,&old);
        unsigned long tid;
        CreateThread(0,0x1000,(LPTHREAD_START_ROUTINE)&watch,0,0,&tid);
        //---------------Useless stuff--------------
        MessageBox(0,"Try to dump me","waliedassar",0);
        ExitProcess(0);
        return 0;
}
Una manera mas creativa es la de indy. Basicamente consiste en diferentes técnicas IDP para evitar el dumpeado en memoria. La documentación sería esta:

Mostrar/Ocultar

Y lo podeis descargar de aqui:
[Enlace externo eliminado para invitados]
Defender a los debiles!
Responder

Volver a “Manuales y Tutoriales”