There are two simple fixes to what you’re experiencing. They are simple, but not easy.
First, create a poignant “expectations” event at the beginning of every project. It’s easier to say no before they ask for extras than after. That “before” time is when you start a new project. I’m guessing you already do some version of this. At the beginning of a new project, you should explain to the client that “I promise not to ask you for extra money beyond what we’ve agreed. I also expect you not to ask me for extra work that isn’t paid.” If you’re already doing this, I suggest you take extra steps to ensure it is a punctuated moment, not just a ceremonial mumble.