вот и выросло поколение, которое не умеет работать и думать памятью...
Вобщем надо сменить реализацию хука. Спертые байты переть не по пяткаку, а целыми командами с помощью дизасма длин(учитывая стабильность функции можно просто руками забить длины) и в надежде не словить в начале функции относительных переходов. Переписываем команды на новое место/
originalWordCall: ; тут спертые первые байты
jmp originalFuncNotSplicedCodeStart ; адрес с которого в оригинале идут нетронутые байты
В момент хука высчитываем 4 байта перехода для команды call, чтобы попасть на originalWordCall и меняем их на лету, либо юзаем указатели на функции(хз есть ли они в си) и без всякого гемора
Код:
void (*originalWordFunc)();
void callOriginal(){
originalWordFunc = originalWordCall;
(*originalWordFunc)();
}
Как то так. Гугл на тему сплайсинга раскроет тему пошире. Давно я этим баловался, могут быть косяки.