Реальная дефрагментация памяти на уровне процесса возможна только в управляемых средах, таких как, например, виртуальные машины Java, когда у вас есть какой-то доступ к объектам, выделенным в памяти, и вы можете управлять ими.
Но если мы говорим о неуправляемых приложениях, то нет возможности контролировать их память сторонними инструментами, потому что каждый процесс (и инструмент, и приложение) работает в своем собственном адресном пространстве и не имеет доступа к чужой, по крайней мере без помощи ОС.
Однако даже если вы получите доступ к памяти другого процесса (взломав вашу ОС или еще) и начнете ее изменять, я думаю, что целевое приложение будет очень «удивлено».
Представьте себе, вы выделили кусок памяти, получили его начальный адрес, и в следующую секунду этот кусок памяти перемещается куда-то еще из-за «VeryCoolMemoryDefragmenter»:)