hooking.h
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:3k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. Windows Live Messenger Plugin Demo
  3. Copyright (C) 2008  Hern醤 Di Pietro
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  14. /*****************************************************************************/
  15. #ifndef HOOKING_H
  16. #define HOOKING_H
  17. #include "hooklib.h"
  18. // function hooking structure
  19. //
  20. typedef struct
  21. {
  22. LPCWSTR szTargetModule;
  23. LPCSTR szTargetFunction;
  24. USHORT cbParam;
  25. void * pvHookHandler;
  26. NktCallingConvention nccCallingCnv;
  27. int iFlags;
  28. } HOOK_DESCRIPTOR;
  29. // helper macros
  30. //
  31. #define PARAMETER_INDEX(x) ((size_t)hp->context.pms + (sizeof(DWORD) * (x)))
  32. #define NUM_PARAMS(x) (sizeof(void*) * (x))
  33. #define DECLARE_HOOK_HANDLER(fn) void Handle_##fn (NktHandlerParams*)
  34. #define WINAPI_RETVAL (hp->context.regs->EAX)
  35. // hooking typedefs
  36. //
  37. typedef yasper::ptr<NktApiHook> ApiHookPtr;
  38. typedef std::list<ApiHookPtr> HookList;
  39. // hooking function installer
  40. //
  41. void AttachHook (const HOOK_DESCRIPTOR&,  HookList& );
  42. void AttachHookArray (const HOOK_DESCRIPTOR[],  HookList& );
  43. // hook handler prototypes
  44. //
  45. DECLARE_HOOK_HANDLER (CreateWindowExW);
  46. DECLARE_HOOK_HANDLER (CoRegisterClassObject);
  47. DECLARE_HOOK_HANDLER (FindResourceW);
  48. DECLARE_HOOK_HANDLER (LoadResource);
  49. DECLARE_HOOK_HANDLER (LockResource);
  50. DECLARE_HOOK_HANDLER (SizeofResource);
  51. // hook descriptor array
  52. //
  53. const HOOK_DESCRIPTOR hookArray[] = 
  54. {
  55. L"user32.dll", "CreateWindowExW", NUM_PARAMS(12),  Handle_CreateWindowExW, stdcall_, _call_after ,
  56. L"ole32.dll", "CoRegisterClassObject", NUM_PARAMS(5), Handle_CoRegisterClassObject, stdcall_, _call_after,
  57. L"kernel32.dll", "FindResourceW", NUM_PARAMS(3), Handle_FindResourceW, stdcall_, _call_after,
  58. L"kernel32.dll", "LoadResource", NUM_PARAMS(2), Handle_LoadResource, stdcall_, _call_after,
  59. L"kernel32.dll","LockResource", NUM_PARAMS(1), Handle_LockResource, stdcall_, _call_after,
  60. L"kernel32.dll","SizeofResource", NUM_PARAMS(2), Handle_SizeofResource, stdcall_, _call_after
  61.     
  62. /* the following example entry for CONTACTSUX.DLL 
  63. is just there to show that C++ function interception
  64. must be done using decorated names ...
  65. L"contactsux.dll", "?OnInput@CContactElement@@UAEXPAUInputEvent@DirectUI@@@Z",
  66. NUM_PARAMS(2), Handle_CContactElement_OnInput, thiscall_ms_ , _call_after */
  67. };
  68. const UINT NUM_HOOK_DESCRIPTORS = sizeof(hookArray)/sizeof(hookArray[0]);
  69. #endif //HOOKING_H