mydll.cpp
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. // ------------------------------------- //
  2. // 您如果要使用本文件,请不要删除本说明  //
  3. // ------------------------------------- //
  4. //             HOOKAPI 开发例子          //
  5. //   Copyright 2002 编程沙龙 Paladin     //
  6. //       www.ProgramSalon.com            //
  7. // ------------------------------------- //
  8. #include "stdafx.h"
  9. #include <stdio.h>
  10. #include "../dll/mydll.h"
  11. #include "util.h"
  12. #include "psapi.h"
  13. #include "tlhelp32.h"
  14. #include "ps.h"
  15. #include "filter.h"
  16. HINSTANCE g_hInstance =NULL;
  17. CFilter g_Filter;
  18. BOOL APIENTRY DllMain( HANDLE hModule, 
  19.                        DWORD  ul_reason_for_call, 
  20.                        LPVOID lpReserved
  21.  )
  22. {
  23. g_hInstance =(HINSTANCE)hModule;
  24.     return TRUE;
  25. }
  26. typedef BOOL (WINAPI *EnumProcessesFunc)(DWORD *, DWORD, DWORD *);
  27. BOOL WINAPI myEnumProcesses(DWORD *lpidProcess,DWORD cb, DWORD *cbNeeded)
  28. {
  29. WriteLog("EnumProcesses");
  30. return EnumProcesses(lpidProcess, cb, cbNeeded);
  31. }
  32. DWORD WINAPI myNtQuerySystemInformation(DWORD d1, PDWORD pd1, DWORD d2, PDWORD p1)
  33. {
  34. //WriteLog("NtQuerySystemInformation, d1=%d,d2 =%d", d1, d2);
  35. HMODULE hMod =GetModuleHandle("ntdll.dll");
  36. NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
  37. NtQuerySystemInformation =(NTQUERYSYSTEMINFORMATION) GetProcAddress(hMod, "NtQuerySystemInformation");
  38. DWORD ret =NtQuerySystemInformation(d1, pd1, d2, p1);
  39. int err=GetLastError();
  40. if(d1 ==5)
  41. {
  42. char fname[128];
  43. PROCESS_INFO *p1, *p2, *p =(PROCESS_INFO *)pd1;
  44. p1 =p;
  45. p2 =NULL;
  46. while(((DWORD)p-(DWORD)pd1 <(DWORD)d2) && p1->NextEntryDelta !=0)
  47. {
  48. if(p->ProcessName.Buffer !=NULL)
  49. {
  50. int len =WideCharToMultiByte( CP_ACP, 0, p->ProcessName.Buffer, -1, fname, 128,NULL,NULL); 
  51. fname[len] =0;
  52. //WriteLog("NtQuery:fname=%s", fname);
  53. if(g_Filter.FilterName(fname))
  54. {
  55. if(p2) p2->NextEntryDelta +=p->NextEntryDelta;
  56. else
  57. {
  58. //if(p->NextEntryDelta)
  59. p1->NextEntryDelta += p->NextEntryDelta;
  60. p2 =p1;
  61. }
  62. //WriteLog("*********NtQuery:fname=%s", fname);
  63. }
  64. else p2 =NULL;
  65. //WriteLog("NtQuery:fname=%s", fname);
  66. }
  67. p1 =p;
  68. p =(PROCESS_INFO *)((char *)p+p->NextEntryDelta);
  69. }
  70. if(p2)
  71. p2->NextEntryDelta =0;
  72. //WriteLog("okkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,p2=%x", p2);
  73. }
  74. SetLastError(err);
  75. return ret;
  76. }
  77. WNDENUMPROC g_old_enumproc =NULL;
  78. typedef UINT (WINAPI *FuncGetWindowModuleFileNameA)(HWND hWnd, char *name, UINT);
  79. BOOL CALLBACK myWndEnumProc(HWND hWnd, LPARAM lParam)
  80. {
  81. char appname[50];
  82. appname[0] =0;
  83. GetFileNameFromhWnd(hWnd, appname);
  84. if(appname[0] ==0 || !g_Filter.FilterName(appname))
  85. {
  86.  if(g_old_enumproc) g_old_enumproc(hWnd, lParam);
  87. }
  88. return true;
  89. }
  90. BOOL WINAPI myEnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
  91. {
  92. g_old_enumproc =lpEnumFunc;
  93. return EnumWindows(myWndEnumProc, lParam);
  94. }
  95. MYAPIINFO myapi_info[] =
  96. {
  97. //{"PSAPI.DLL", "EnumProcesses(DWORD *,DWORD,DWORD *)", "myEnumProcesses"},
  98. {"ntdll.dll", "NtQuerySystemInformation", 4, "myNtQuerySystemInformation"},
  99. {"user32.dll", "EnumWindows", 2, "myEnumWindows"},
  100. {NULL,NULL,NULL}
  101. };
  102. MYAPIINFO *GetMyAPIInfo()
  103. {
  104. return &myapi_info[0];
  105. }