Знаете ли вы, почему я не могу запустить программу при подключении одной из функций kernel32? Я пишу анти-чит и хочу оптимизировать его больше, потому что в настоящее время он в потоке, но что-то не так ...Hooking kernel32.dll перестает работать с моей программой
Написано OpenProcess, потому что я попытался прежде, чем подключить его и ту же проблему.
typedef HANDLE (WINAPI * pOpenProcess)( _In_ HANDLE hProcess,
_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_ LPDWORD lpThreadId);
pOpenProcess original;
__declspec(naked) void hOpenProcess()
{
__asm PUSHAD
__asm PUSHFD
//my actions here
__asm POPFD
__asm POPAD
__asm JMP[original]
};
void ZPerformHook()
{
DWORD Address = (DWORD)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateRemoteThread");
original = (pOpenProcess)DetourFunction((PBYTE)Address, (PBYTE)hOpenProcess);
}
Аргументы для OpenProcess передаются в стек. Самое первое, что вы делаете, это изменить стек. Это не хорошо. Ваш код должен как сохранить регистры процессора *, так и * не повредить стек. Это нетривиально, лучше не писать этот код самостоятельно. Это было сделано, вы уже отметили вопрос с помощью [обходных путей], чтобы вы уже знали хорошее решение. Нет смысла ожидать другого. –
@ HansPassant: Несмотря на то, что я искренне согласен с тем, что для этого не существует оснований для написания собственного кода, аргумент о том, что стек представляет собой сообщение выше, не применяется, поскольку те же операции PUSH сопоставляются с операциями POP - по крайней мере а не для вызова исходной функции. Более вероятно, что '// мои действия здесь 'как-то сломаны (или' original' не содержит правильный адрес, возможно). –
[Предполагая, что это скомпилировано для 32-битного кода, но я думаю, что встроенный ассемблер в любом случае не поддерживается в 64-битном режиме, а встроенный ассемблер должен знать, что PUSHFD и POPFD, PUSHAD и POPAD не работают для x86-64. –