Процесс хуков функций C++
По мере изучения хуков C++, у меня произошел некий диссонанс с механикой этих самых хуков. Хотя у меня и есть чувство что это очень глупый вопрос, однако...
Ниже необходимый код перехвата функции CreateFileA.
#pragma pack(push, 1)
struct jump_near {
BYTE opcode;
DWORD relativeAddress;
};
#pragma pack(pop)
int main() {
HMODULE hMod = GetModuleHandleA("kernel32.dll");
if(!hMod) return 1;
jump_near* lpFunc = reinterpret_cast<jump_near*>(GetProcAddress(hMod, "CreateFileA"));
DWORD dwProtect = PAGE_READWRITE;
VirtualProtect(lpFunc, sizeof(jump_near), dwProtect, &dwProtect);
lpFunc->opcode = 0xE9;
lpFunc->relativeAddress = _CalculateDispacement(lpFunc, &_My_CreateFileA);
VirtualProtect(lpFunc, sizeof(jump_near), dwProtect, &dwProtect);
HANDLE hFile = CreateFileA("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(hFile);
return 0;
}
Некоторые уточнения по функциям, чтобы не вставлять полный код в целях чистоты.
*
CalculateDispacement - вычисляет относительный адрес посредством secondAddress - (firstAddress+5)
*_My_CreateFileA - выполняет MessageBox
В основном, в статьях и т.п. про хуки функций находится преимущественно код и объяснение типа "Во время хука происходит прыжок на адрес функции с нашей логикой", это я в общем-то понимаю.
- Но когда именно происходит этот прыжок, в какой момент?
- Как я читал "#pragma pack(push,1) 'some code here' #pragma pack(pop)" производит некое выравнивание структур, тоже непонятное для меня действие.
- Почему производится каст
lpFunc
вjump_near*
?
Я находил ответы на некоторые свои вопросы, но они были неполными. На MSDN достаточно абстрактные определения и объяснения, поэтому ищу помощи тут.