Fix and extend Windows API hooking #548
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixing bugs in API hooking of Windows functions GetModuleHandleExW() and _alloca_probe(), and adding more vamp signatures for _alloca_probe(). The correct stack adjustment in _alloca_probe() is important for deciding if variables are local, and in guessing how many arguments are passed to a function.
The signatures cover 32-bit and 64-bit executables from all Visual Studio versions; it turns out the opcodes change a little over time, and vamp was only covering some of the 32-bit cases. One of the existing signatures was misnamed.
The GetModuleHandleExW() hook had a typo.
The _alloca_probe() hook had a few problems: stack size delta is off by 4 bytes, stack size not safeguarded against going negative (which can happen during emulation if EAX is garbage), and needless execution of the page read loop which in real samples can take up to 1.5 secs of CPU time.
I created a unit test that leverages existing VIVTESTFILE samples.