Mira la declaración de VirtualProtectEx:
http://msdn.microsoft.com/en-us/library/aa366899(v=vs.85).aspx
hProcess [in]
A handle to the process whose memory protection is to be changed. The handle must have the PROCESS_VM_OPERATION access right. For more information, see Process Security and Access Rights.
No dice que pueda ser NULL. Y además:
lpflOldProtect [out]
A pointer to a variable that receives the previous access protection value of the first page in the specified region of pages. If this parameter is NULL or does not point to a valid variable, the function fails.
Saludos
Edito: Además, en el jmp con el que pisas el comienzo de la api, no tienes que poner la dirección hacia la que quieres saltar, sinó la distancia de salto.
Edioto 2:
Además, con esta línea:
Te estás cargando el puntero, tú quieres hacer mov byte[ebx],0xE9