www.pudn.com > API_VC_HOOK-.rar > CapConsole.c


#if _MSC_VER > 1000 
#pragma once 
#endif 
 
#define WIN32_LEAN_AND_MEAN 
 
#include  
#include "ApiHooks.h" 
 
 
HANDLE hLog = INVALID_HANDLE_VALUE; 
 
 
BOOL APIENTRY DllMain( HANDLE hModule,  
                       DWORD  ul_reason_for_call,  
                       LPVOID lpReserved 
					 ) 
{    
    switch (ul_reason_for_call) 
	{ 
		case DLL_PROCESS_ATTACH: 
			if(hLog == INVALID_HANDLE_VALUE) 
                 hLog = CreateFile("console.log", GENERIC_WRITE, FILE_SHARE_READ, 
                         NULL, CREATE_ALWAYS, 0, NULL); 
		         break; 
		case DLL_PROCESS_DETACH: 
             CloseHandle(hLog); 
			 hLog = INVALID_HANDLE_VALUE; 
			break; 
    } 
    return TRUE; 
} 
 
 
BOOL WINAPI NewWriteConsoleA(HANDLE hConOut, LPCVOID lpvBuffer, DWORD cchToWrite, LPDWORD lpcchWritten, LPOVERLAPPED lpvReserved) {               
      WriteFile(hLog, lpvBuffer, cchToWrite, lpcchWritten, NULL); 
      return(WriteConsoleA(hConOut, lpvBuffer, cchToWrite,lpcchWritten, lpvReserved)); 
} 
 
 
char Place[4096]; 
 
BOOL WINAPI NewWriteConsoleW(HANDLE hConOut, LPCVOID lpvBuffer, DWORD cchToWrite, LPDWORD lpcchWritten, LPOVERLAPPED lpvReserved) { 
	  int nbytes = 0; 
      if(nbytes = WideCharToMultiByte(CP_ACP, 0, lpvBuffer, -1, Place, sizeof(Place), NULL, NULL)) 
        WriteFile(hLog, Place, nbytes, lpcchWritten, NULL); 
      return(WriteConsoleW(hConOut, lpvBuffer, cchToWrite,lpcchWritten, lpvReserved)); 
} 
 
 
HANDLE hErr = 0; 
 
HANDLE WINAPI NewGetStdHandle(DWORD nStdHandle) { 
	     HANDLE NewHandle = GetStdHandle(nStdHandle); 
	     if(nStdHandle == STD_ERROR_HANDLE) hErr = NewHandle; 
	     return(NewHandle); 
} 
 
 
BOOL WINAPI NewWriteFile(HANDLE hFile, LPCVOID lpvBuffer, DWORD cchToWrite, LPDWORD lpcchWritten, LPOVERLAPPED lpvReserved) { 
	  if(hFile == hErr) 
      WriteFile(hLog, lpvBuffer, cchToWrite, lpcchWritten, NULL); 
      return(WriteFile(hFile, lpvBuffer, cchToWrite, lpcchWritten, lpvReserved)); 
} 
 
 
FARPROC WINAPI NewGetProcAddress(HMODULE hModule, LPCSTR lpProcName) { 
	if(hModule == GetModuleHandle("KERNEL32.DLL"))	{  
      if(!lstrcmp(lpProcName, "WriteConsoleA"))  return((FARPROC)NewWriteConsoleA); 
      if(!lstrcmp(lpProcName, "WriteConsoleW"))  return((FARPROC)NewWriteConsoleW); 
      if(!lstrcmp(lpProcName, "GetStdHandle"))   return((FARPROC)NewGetStdHandle); 
      if(!lstrcmp(lpProcName, "WriteFile"))      return((FARPROC)NewWriteFile); 
      if(!lstrcmp(lpProcName, "GetProcAddress")) return((FARPROC)NewGetProcAddress); 
	} 
    return(GetProcAddress(hModule, lpProcName)); 
} 
 
__declspec(dllexport) API_HOOK ApiHookChain[6] = { 
	{"KERNEL32.DLL","WriteConsoleA", HOOK_ALL, ALL_MODULES, NULL, NewWriteConsoleA}, 
	{"KERNEL32.DLL","WriteConsoleW", HOOK_ALL, ALL_MODULES, NULL, NewWriteConsoleW}, 
	{"KERNEL32.DLL","GetStdHandle" , HOOK_ALL, ALL_MODULES, NULL, NewGetStdHandle}, 
	{"KERNEL32.DLL","WriteFile"    , HOOK_ALL, ALL_MODULES, NULL, NewWriteFile}, 
	{"KERNEL32.DLL","GetProcAddress",HOOK_ALL, ALL_MODULES, NULL, NewGetProcAddress}, 
	{HOOKS_END} 
};