C/C++에서 Windows 기능을 후크하려면 어떻게 해야 합니까?
나에게 함수가 foo()
kernel32.dll에 window가 구현되어 있고 항상 true로 반환됩니다. 제 프로그램("bar.exe" hook/douver)을 통해 window가 기능하고 대신 모든 프로세스에 대해 false로 반환되도록 할 수 있습니까?
예를 들어 내 svchost가 전화하면foo()
, 이 으로 입니다 입니다 으로 이 현재 실행 중인 다른 모든 프로세스에서도 동일한 작업이 수행되어야 합니다.
만약 그렇다면, 어떻게?저는 시스템 전체의 고리 같은 것을 찾고 있는 것 같습니다.
디투어스를 보세요, 이런 종류의 것들에 딱 맞습니다.
시스템 전체의 후킹에 대해서는 MSDN의 이 기사를 읽으십시오.
먼저 함수 후킹을 처리하는 DLL을 만듭니다.아래 예에서는 소켓 송수신 기능을 후크합니다.
#include <windows.h>
#include <detours.h>
#pragma comment( lib, "Ws2_32.lib" )
#pragma comment( lib, "detours.lib" )
#pragma comment( lib, "detoured.lib" )
int ( WINAPI *Real_Send )( SOCKET s, const char *buf, int len, int flags ) = send;
int ( WINAPI *Real_Recv )( SOCKET s, char *buf, int len, int flags ) = recv;
int WINAPI Mine_Send( SOCKET s, const char* buf, int len, int flags );
int WINAPI Mine_Recv( SOCKET s, char *buf, int len, int flags );
int WINAPI Mine_Send( SOCKET s, const char *buf, int len, int flags ) {
// .. do stuff ..
return Real_Send( s, buf, len, flags );
}
int WINAPI Mine_Recv( SOCKET s, char *buf, int len, int flags ) {
// .. do stuff ..
return Real_Recv( s, buf, len, flags );
}
BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID ) {
switch ( dwReason ) {
case DLL_PROCESS_ATTACH:
DetourTransactionBegin();
DetourUpdateThread( GetCurrentThread() );
DetourAttach( &(PVOID &)Real_Send, Mine_Send );
DetourAttach( &(PVOID &)Real_Recv, Mine_Recv );
DetourTransactionCommit();
break;
case DLL_PROCESS_DETACH:
DetourTransactionBegin();
DetourUpdateThread( GetCurrentThread() );
DetourDetach( &(PVOID &)Real_Send, Mine_Send );
DetourDetach( &(PVOID &)Real_Recv, Mine_Recv );
DetourTransactionCommit();
break;
}
return TRUE;
}
그런 다음 대상 응용 프로그램에 DLL을 주입할 프로그램을 생성합니다.
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
void EnableDebugPriv() {
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );
LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid );
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, false, &tkp, sizeof( tkp ), NULL, NULL );
CloseHandle( hToken );
}
int main( int, char *[] ) {
PROCESSENTRY32 entry;
entry.dwSize = sizeof( PROCESSENTRY32 );
HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );
if ( Process32First( snapshot, &entry ) == TRUE ) {
while ( Process32Next( snapshot, &entry ) == TRUE ) {
if ( stricmp( entry.szExeFile, "target.exe" ) == 0 ) {
EnableDebugPriv();
char dirPath[MAX_PATH];
char fullPath[MAX_PATH];
GetCurrentDirectory( MAX_PATH, dirPath );
sprintf_s( fullPath, MAX_PATH, "%s\\DllToInject.dll", dirPath );
HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, entry.th32ProcessID );
LPVOID libAddr = (LPVOID)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "LoadLibraryA" );
LPVOID llParam = (LPVOID)VirtualAllocEx( hProcess, NULL, strlen( fullPath ), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( hProcess, llParam, fullPath, strlen( fullPath ), NULL );
CreateRemoteThread( hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)libAddr, llParam, NULL, NULL );
CloseHandle( hProcess );
}
}
}
CloseHandle( snapshot );
return 0;
}
이 정도면 충분히 시작할 수 있을 겁니다!
이지훅 https://github.com/EasyHook/EasyHook
단순성, 유연성 및 기능성에서 언급된 모든 기술을 지배합니다.
이전에 후크 프로세스에 대해서도 논의하지 않았습니다.나는 이 실의 모든 잎사귀를 읽었고, EASYHOOK은 확실히 엄청나게 뛰어납니다.C, C++, CLR 등을 사용해도 상관없습니다.
코드플렉스 홈페이지에서 오마주를 충분히 결제할 수 있도록 붙여넣겠습니다.
다음은 기능의 불완전한 목록입니다.
- 소위 "스레드 교착 장애"는 알려지지 않은 API를 후킹할 때 많은 핵심 문제를 제거합니다. 이 기술은 이지만의 고유한 기술입니다.훅
- 관리되지 않는 API에 대해 관리되는 후크 핸들러를 작성할 수 있습니다.
- NET Remote, WPF 및 WCF와 같이 관리되는 편리한 코드를 모두 사용할 수 있습니다.
- 문서화된 순수 관리되지 않는 후킹 API
- 32비트 및 64비트 커널 모드 후킹 지원(Release List에서 확인할 수 있는 PatchGuard 3 바이패스 드라이버도 확인)
- 대상에 리소스 또는 메모리 누수가 남아 있지 않습니다.
- 현재 AV 소프트웨어의 주목을 끌지 못할 실험적인 스텔스 주입 메커니즘
- EasyHook32.dll 및 EasyHook64.dll은 순수하게 관리되지 않는 모듈이며 NET 프레임워크를 설치하지 않고도 사용할 수 있습니다!
- 모든 후크는 안정적인 방법으로 장착 및 자동으로 탈거됩니다.
- 완전한 문서화되지 않은 API를 사용하여 Windows Vista SP1 x64 및 Windows Server 2008 SP1 x64를 지원하여 모든 터미널 세션에 연결할 수 있습니다.
- 후크 핸들러 내부의 관리/관리되지 않는 모듈 스택 트레이스
- 후크 핸들러 내에서 관리/관리되지 않는 모듈 호출 가져오기
- 후크 핸들러 내부에 사용자 지정 스택 트레이스 만들기
- AnyCPU용으로 컴파일된 주입 라이브러리와 호스트 프로세스를 작성할 수 있습니다. 그러면 모든 경우에 동일한 어셈블리를 사용하여 64비트 및 32비트 프로세스의 32비트 및 64비트 프로세스에 코드를 주입할 수 있습니다.
- EasyHook은 64비트 대상에 대해 RIP 관련 주소 재배치를 지원합니다.
- 언팩/설치가 필요 없습니다.
- Visual Studio 재배포가 필요하지 않습니다.
내 후커가 아직도 내가 그들과 비교할 수 있는 몇 가지 요령을 알고 있어서 기뻐요.하지만 확실하게 말하자면, 훅이 필요할 때는 100번의 99번, EASY HOOK'r이 더 빨리 갈 수 있을 겁니다.그리고 상당히 적극적으로 유지되고 있습니다.
후크하고 싶은 기능에 대해 자세히 알려주세요!이러한 경우에 자신의 코드를 호출하는 몇 가지 방법이 있습니다.
할 수 가 하는 를 한 DLL 할 의 에 를 의 에 의 를 할 가 ).
foo.exe
DLL과 노출된 각 함수는 후킹하려는 함수를 제외하고 원래 DLL로 호출을 바이패스합니다."kitchen"에서 언급한 (상업용) Douvert 패키지와 같이 런타임 중에 기능 포인터 테이블을 변경할 수 있습니다.하지만, 그런 후킹을 하는 것은 여러분 스스로 쉽게 할 수 있습니다. 어떻게 하는지에 대해서는 이 기사를 참조하세요.
특정 함수가 어디에서 호출되는지 알 수 있습니다.
foo.exe
를 "코드로 대체하면 됩니다.true
patching "입니다. 기본적으로 패치를 적용하고 있습니다."foo.exe
"..Windows(윈도우)에서는 키 및 마우스 이벤트와 같은 특정 기능에 대해 자동 후킹 기능을 제공합니다.SetWindows(윈도우) 기능을 확인합니다.이거 훅.
이는 대상으로 삼고자 하는 Windows 버전에 따라 다소 달라집니다.그러나 Pre-Vista에서 플레이하는 경우에는 간단히 SetWindows(윈도우)를 사용할 수 있습니다.HookEx - 실행 중인 모든 프로세스에 DLL을 주입합니다.그런 다음 DLL은 우회 또는 유사한 방법을 사용하여 해당 기능을 후크해야 합니다.
(어떤 이유로든) 우회로를 사용하지 않고 조립 시 후크를 작성하는 경우 FALSE 반환에 대한 몇 가지 주요 정보가 필요합니다.
- Win32, EAX를 0으로 설정
- Win64, RAX를 0으로 설정
후킹하는 기능의 마지막 작업으로 EAX 또는 RAX(플랫폼에 따라 다름)를 0으로 설정해야 합니다.그러면 호출 코드가 반환 값으로 0을 받게 됩니다(인터 포인터 유형 값을 반환한다고 가정).
언급URL : https://stackoverflow.com/questions/873658/how-can-i-hook-windows-functions-in-c-c
'source' 카테고리의 다른 글
Python에서 C를 호출하는 기능 (0) | 2023.09.11 |
---|---|
봄 부팅 애플리케이션에서 AWS SDK를 초기화하는 방법은? (0) | 2023.09.11 |
Django 앱을 Mariadb에서 Postgresql로 전환 (0) | 2023.09.11 |
Swift에서 인터넷 연결 가능 여부 확인 (0) | 2023.09.11 |
조건부 서식(공백이 아닌 경우) (0) | 2023.09.06 |