First, you need to know exactly what hooks you want to trigger. There are a lot of them, actually. For product modification, these can be called (and that's only a subset of them)
actionObjectAddBefore
actionObjectProductAddBefore
actionObjectAddAfter
actionObjectProductAddAfter
actionObjectUpdateBefore
actionObjectProductUpdateBefore
actionAdminUpdateAfter
actionObjectProductUpdateAfter
actionAdminProductControllerAddBefore
actionAdminAddBefore
actionAdminProductControllerUpdateBefore
actionAdminUpdateBefore
actionProductUpdate
...
Once you know which hook(s) to trigger, you need to find the place in the core that is calling them, and figure out what parameters are send. Each hook sends different parameter.
For example, hookObjectProductUpdateAfter
https://github.com/thirtybees/thirtybees/blob/82b3102a421ce53347c4a660966048439e4f759b/classes/ObjectModel.php#L857-L858
Expects single parameter 'object' that is instance of Product class. You can trigger it as this one (for product 123):
Hook::exec('hookObjectProductUpdateAfter', ['object' => new Product(123)]);
Note that this can actually cause you more troubles. Modules can expect that the hooks are triggered in some sequence. For example, I have a module that create create audit logs of all changes. This module expects that first 'hookObjectProductUpdateBefore' is called -- at that point I retrieve data from database. Then when 'hookObjectProductUpdateAfter' is called, I once again retrieve data from db, and compare these two datasets to find out what has changed.
If you just trigger hookObjectProductUpdateAfter, my module would be quite confused 🙂
And I'm sure there will be other modules that depends on things like these (sequence, context, controllers, GET / POST parameters, etc). So be aware