LogAPI.cpp
上传用户:tzh4061
上传日期:2007-01-08
资源大小:309k
文件大小:5k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. // ----------------------------------- //
  2. //            APISpy32 v2.0            //
  3. //     Copyright 1999 Yariv Kaplan     //
  4. //          WWW.INTERNALS.COM          //
  5. // ----------------------------------- //
  6. #include <windows.h>
  7. #include "LogAPI.h"
  8. #ifdef WINNT
  9. #pragma comment(linker, "/section:.sdata,RWS")
  10. #pragma data_seg(".sdata")
  11. #endif
  12. bool CaptureEvents = false;
  13. DWORD dwAPISpy32ProcessId = 0;
  14. #ifdef WINNT
  15. #pragma data_seg()
  16. #endif
  17. #ifdef WINNT
  18. bool AddLogEntry(DWORD dwProcessId, PSTR pszAPIName, DWORD dwReturnValue, PVOID pvOriginAddress)
  19. {
  20.   HANDLE hMailslot;
  21.   DWORD dwBytesWritten;
  22.   tagLogEntry LogEntry;
  23.   BOOL Result;
  24.   if (CaptureEvents == false || dwProcessId == dwAPISpy32ProcessId)
  25.     return true;
  26.   hMailslot = CreateFile("\\.\mailslot\APISpy32_Mailslot", GENERIC_WRITE,
  27.                          FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  28.   if (hMailslot == INVALID_HANDLE_VALUE)
  29.     return false;
  30.   LogEntry.dwProcessId = dwProcessId;
  31.   LogEntry.dwReturnValue = dwReturnValue;
  32.   LogEntry.pvOriginAddress = pvOriginAddress;
  33.   strcpy(LogEntry.szAPIName, pszAPIName);
  34.   Result = WriteFile(hMailslot, &LogEntry, sizeof(tagLogEntry), &dwBytesWritten, NULL);
  35.   CloseHandle(hMailslot);
  36.   
  37.   return Result!=0;
  38. }
  39. #endif
  40. #ifdef WIN95
  41. tagLogEntry LogBuffer[MAX_LOG_ENTRIES];
  42. DWORD dwReadLogIndex = 0, dwWriteLogIndex = 0;
  43. bool AddLogEntry(DWORD dwProcessId, PSTR pszAPIName, DWORD dwReturnValue, PVOID pvOriginAddress)
  44. {
  45.   HANDLE hOverflowEvent;
  46.   HANDLE hLogEvent;
  47.   HANDLE hLogMutex;
  48.   if (CaptureEvents == false || dwProcessId == dwAPISpy32ProcessId)
  49.     return true;
  50.   hLogMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "APISpy32_LogMutex");
  51.   if (hLogMutex == NULL)
  52.     return false;
  53.   WaitForSingleObject(hLogMutex, INFINITE);
  54.   LogBuffer[dwWriteLogIndex].dwProcessId = dwProcessId;
  55.   LogBuffer[dwWriteLogIndex].dwReturnValue = dwReturnValue;
  56.   LogBuffer[dwWriteLogIndex].pvOriginAddress = pvOriginAddress;
  57.   if (strlen(pszAPIName) > MAX_API_LEN)
  58.   {
  59.     memcpy(LogBuffer[dwWriteLogIndex].szAPIName, pszAPIName, MAX_API_LEN - 3);
  60.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN - 3] = '.';
  61.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN - 2] = '.';
  62.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN - 1] = '.';
  63.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN] = '';
  64.   }
  65.   else
  66.     strcpy(LogBuffer[dwWriteLogIndex].szAPIName, pszAPIName);
  67.   if ((dwReadLogIndex != 0 && dwWriteLogIndex == dwReadLogIndex - 1) ||
  68.       (dwReadLogIndex == 0 && dwWriteLogIndex == MAX_LOG_ENTRIES - 1 ))
  69.   {
  70.     hOverflowEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "APISpy32_OverflowEvent");
  71.     if (hOverflowEvent == NULL)
  72.     {
  73.       ReleaseMutex(hLogMutex);
  74.       CloseHandle(hLogMutex);
  75.       return false;
  76.     }
  77.     hLogEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "APISpy32_LogEvent");
  78.     if (hLogEvent == NULL)
  79.     {
  80.       CloseHandle(hOverflowEvent);
  81.       ReleaseMutex(hLogMutex);
  82.       CloseHandle(hLogMutex);
  83.       return false;
  84.     }
  85.     SetEvent(hOverflowEvent);
  86.     WaitForSingleObject(hLogEvent, INFINITE);
  87.     ResetEvent(hLogEvent);
  88.     CloseHandle(hOverflowEvent);
  89.     CloseHandle(hLogEvent);
  90.   }
  91.   dwWriteLogIndex++;
  92.   if (dwWriteLogIndex == MAX_LOG_ENTRIES)
  93.     dwWriteLogIndex = 0;
  94.   ReleaseMutex(hLogMutex);
  95.   CloseHandle(hLogMutex);
  96.   return true;
  97. }
  98. extern "C" __declspec(dllexport) bool GetLogParameters(DWORD *pdwNumLogEntries, DWORD *pdwReadLogIndex, tagLogEntry **ppLogBuffer)
  99. {
  100.   HANDLE hLogMutex;
  101.   DWORD Result;
  102.   
  103.   hLogMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "APISpy32_LogMutex");
  104.   if (hLogMutex == NULL)
  105.     return false;
  106.   Result = WaitForSingleObject(hLogMutex, INFINITE);
  107.   if (Result == WAIT_FAILED)
  108.   {
  109.     CloseHandle(hLogMutex);
  110.     return false;
  111.   }
  112.   *ppLogBuffer = &LogBuffer[0];
  113.   *pdwReadLogIndex = dwReadLogIndex;
  114.   if (dwWriteLogIndex >= dwReadLogIndex)
  115.     *pdwNumLogEntries = dwWriteLogIndex - dwReadLogIndex;
  116.   else
  117.     *pdwNumLogEntries = dwWriteLogIndex + (MAX_LOG_ENTRIES - dwReadLogIndex);
  118.   ReleaseMutex(hLogMutex);
  119.   CloseHandle(hLogMutex);
  120.   return true;
  121. }
  122. extern "C" __declspec(dllexport) void AdvanceToNextLogEntry()
  123. {
  124.   dwReadLogIndex++;
  125.   if (dwReadLogIndex == MAX_LOG_ENTRIES)
  126.     dwReadLogIndex = 0;
  127. }
  128. #endif
  129. extern "C" __declspec(dllexport) void SetCaptureEventsFlag(bool bNewValue)
  130. {
  131.   CaptureEvents = bNewValue;
  132. }
  133. extern "C" __declspec(dllexport) void SetAPISpy32ProcessId(DWORD dwProcessId)
  134. {
  135.   dwAPISpy32ProcessId = dwProcessId;
  136. }