Самый лучший способ - создать dll и прицепить её к другому процессу через CreateRemoteThread(). Полезный код выделяешь в отдельный поток и запускаешь его из DllMain(). HANDLE процесса можно получить через ToolHelp функции.
Такая система работает следующим образом. Запускается exe-файл, который вызывает CreateRemoteThread() с хендлом чужого процесса. В качестве функции потока указывается LoadLibraryA() (извлекается из kernel32.dll с помощью функции GetProcAddress()), параметр - имя нашей dll (функция вызывается уже от имени чужого процесса). Затем exe-файл завершается, а dll остаётся в адресном пространстве чужого процесса. При вызове LoadLibraryA() в dll выполняется функция DllMain(), которая запускает ещё один поток, в котором и содержится нужный нам код.
В результате в системе присутствуют только "родные" процессы (ничего подозрительного), а dll можно обнаружить только с помощью специальных утилит, показывающих список используемых dll (среди стандартных средств Windows таких утилит нет) + пользователь должен знать имена dll и если свою назвать хитро, то он её может и не заметить...