Windows desktop application Had semantic versioning (maj,min,patch) Policy of support for current + LTS Essentially subscription based revenues And had a fairly modular design...
initial throes of the GFC Suddenly “automated testing is popular” An internal tool was re-purposed to provide a testing front end / runner And now, we need to ship it to the customers
customers is who they are. Large outfits like insurance companies that have: • important pre-existing installations • long lead in times for testing • Sarbanes Oxley constraints on system changes • a variety of installed versions
version could mean waiting years for the customers to upgrade Really not an option to wait (people are trying to improve their models, and soon) Really not an option to modify existing installations
do what I want” [More context] • there was a collection of components with a pretty stable API that had been in place for some time • Allows scripting languages / Excel to run models • Allows other apps to drive model runs
your app/ binary from being run. Someone needs to return non-zero from dllmain at application startup There are hardware solutions that will do this. A less strong approach is have a driver for the hardware that verifies there is a dongle present after process start
process, then ask it if it will run the runtime is linked to the security component, which queries the hardware dongle and asks it if it authorised to run the passed in application ID the security component gets a "magic question" from runtime security component returns a “magic answer" All good!
IAT of A.dll and overwrite with a function that lets the test app in. Fits all the requirements right?: • localised to a new drop-in app • does not impact existing runtimes • works with a range of release versions Only one problem - didn’t work
IAT of A.dll and overwrite with a function that lets the test app in. Fits all the requirements: • localised to a new drop-in app • does not impact existing runtimes • works with a range of version Only one problem - didn’t work
A.dll - replace GetProcAddress() with a hook that passes through the result (by name) except for our target functions, where we return substitute function pointers. Of course, matching in parameters and calling convention.