CApiHook By gwsbhqt

见过网上有很多ApiHook的类,但是都不尽入人意,要么就是写的不够好不够完善,要么就是跑不起来.

用别人写的代码总是有种不安心,所以自己就花了一晚上写了CApiHook类.现在还在编写和测试中,尽量确保自己写的类是非常完善的.

//编写和测试环境: Microsoft Visual Studio 2015 Enterprise RC

CApiHook.h

 1 #pragma once
 2
 3 #ifndef CAPIHOOK_H
 4 #define CAPIHOOK_H
 5
 6 #include <cstdio>
 7 #include <windows.h>
 8
 9 using namespace std;
10
11 class CApiHook
12 {
13 public:
14     bool status;            // the status of Hook
15     HMODULE hModule;        // the dll moudle handle of original function
16     LPVOID lpOldFunAddr;        // the address of original function
17     LPVOID lpNewFunAddr;        // the address of Hook function
18     BYTE bOldByte[5];        // the raw data of the original address
19     BYTE bNewByte[5];        // the new data of the original address / the key jump statement of structure
20
21     CApiHook();
22     bool Install(PSTR szModuleName, PSTR szFunName, FARPROC pFun);
23
24 };
25
26 #endif    //    define CAPIHOOK_H

CApiHook.cpp

 1 #include "CApiHook.h"
 2
 3 CApiHook::CApiHook()
 4 {
 5     memset(this, 0, sizeof(CApiHook));
 6 }
 7
 8 bool CApiHook::Install(PSTR szModuleName, PSTR szFunName, FARPROC pFun)
 9 {
10     if (status == true)
11         return false;
12
13     hModule = GetModuleHandleA(szModuleName);
14     if (hModule == NULL)
15     {
16         hModule = LoadLibraryA(szModuleName);
17         if (hModule == NULL)
18             return false;
19     }
20
21     lpNewFunAddr = (LPVOID)pFun;
22     lpOldFunAddr = (LPVOID)GetProcAddress(hModule, szFunName);
23     if (lpOldFunAddr == NULL)
24     {
25         CloseHandle(hModule);
26         return false;
27     }
28
29     RtlMoveMemory(bOldByte, lpOldFunAddr, 5);
30
31     bNewByte[0] = 0xE9;
32     *((PDWORD)(&(bNewByte[1]))) = (DWORD)lpNewFunAddr - (DWORD)lpOldFunAddr - 5;
33
34
35     MEMORY_BASIC_INFORMATION mbi;
36     if (VirtualQueryEx(GetCurrentProcess(), lpOldFunAddr, &mbi, sizeof(mbi)) == 0)
37     {
38         CloseHandle(hModule);
39         return false;
40     }
41
42     DWORD dwOldProtect;
43     if (VirtualProtectEx(GetCurrentProcess(), mbi.BaseAddress, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect) == 0)
44     {
45         CloseHandle(hModule);
46         return false;
47     }
48
49     DWORD dwWriteByte;
50     if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)lpOldFunAddr, bNewByte, 5, &dwWriteByte) == 0)
51     {
52         CloseHandle(hModule);
53         return false;
54     }
55
56     if (VirtualProtectEx(GetCurrentProcess(), mbi.BaseAddress, 5, dwOldProtect, &dwOldProtect) == 0)
57     {
58         CloseHandle(hModule);
59         return false;
60     }
61
62     return true;
63 }

main.cpp  //  测试

 1 #include <cstdio>
 2 #include <windows.h>
 3
 4 #include "CApiHook.h"
 5
 6 using namespace std;
 7
 8 CApiHook apihook;
 9
10 typedef int (WINAPI* PFNMessageBoxA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
11
12 int WINAPI HookMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
13 {
14     printf("here~!");
15
16     return 0;
17 }
18
19 int main()
20 {
21     apihook.Install("User32.dll", "MessageBoxA", (FARPROC)HookMessageBoxA);
22
23     MessageBoxA(NULL, "Hello Me~", "", MB_OK | MB_ICONINFORMATION);
24
25     printf("HelloWorld!\n\n");
26
27     system("pause");
28     return 0;
29 }

时间: 2024-10-11 09:21:15

CApiHook By gwsbhqt的相关文章

CNtdll By gwsbhqt

一直想写一个很完善的CNtdll类,只要初始化了CNtdll的实例对象之后,就能使用Ntdll.dll里的API了. 所以花了一整个晚上,翻出以前写过的CNtdll类,重新写了一遍,虽然只实现了Ntdll.dll里的20个常用的NtAPI,但是已经尽量确保自己写的类是非常完善的. 如果这20个常用的NtAPI还是不足以满足需求的话,可以自行按照已经写好的模版添加自己需要的NtAPI. //编写和测试环境: Microsoft Visual Studio 2015 Enterprise RC / 

第22章 DLL注入和API拦截(3)

22.6 API拦截的一个例子 22.6.1 通过覆盖代码来拦截API (1)实现过程 ①在内存中对要拦截的函数(假设是Kernel32.dll中的ExitProcess)进行定位,从而得到它的内存地址. ②把这个函数的起始的几个字节保存在我们自己的内存中. ③用CPU的一条JUMP指令来覆盖这个函数起始的几个字节,这条JUMP指令用来跳转到我们替代函数的内存地址.当然,我们的替代函数的函数签名必须与要拦截的函数的函数签名完全相同,即所有的参数必须相同,返回值必须相同,调用约定也必须相同. ④现

用游戏外挂的方式修复有道云笔记的BUG

由爱到痛 有道云笔记是个好东西,在认识它之前,我一直使用Windows记事本来保存网上摘抄的文档资料和学习心得体会.某天朋友推荐了有道云笔记,我安装后就不可收拾的爱上了它.那种感觉,就好比一夜之间手扶拖拉机换成了奥迪Q7,从此驶上了码字界的康庄大道. 可就在我对它的爱如火如荼的进行中时,一件痛心疾首的事情发生了. 宋体,是我钟爱的字体,而有道云笔记钟爱的字体则是微软雅黑.就是那么一个兴趣爱好的不同,使我们之间产生了矛盾,并不断被激化,最终影响到了工作和生活,以至于之后一度要和它分手. 问题是这样

Windows Dll Injection、Process Injection、API Hook

catalogue 1. 引言 2. 使用注册表注入DLL 3. 使用Windows挂钩来注入DLL 4. 使用远程线程来注入DLL 5. 使用木马DLL来注入DLL 6. 把DLL作为调试器来注入 7. 使用createprocess来注入代码 8. api拦截 9. Detours - Inline Hook 1.  引言 应用程序需要跨越进程边界来访问另一个进程的地址空间的情况如下 1. 我们想要从另一个进程创建的窗口派生子类窗口 2. 我们需要一些手段来辅助调试,例如我们需要确定另一个进

AntiPlug

反插件工程 1 #pragma once 2 3 #ifndef __ENHANFUNC_H__ 4 #define __ENHANFUNC_H__ 5 6 #include <iostream> 7 #include <string> 8 #include <windows.h> 9 #include <psapi.h> 10 #include <tlhelp32.h> 11 #include "CApiHook.h" 12

Process Cleaner

1 #include <cstdio> 2 #include <windows.h> 3 #include <tlhelp32.h> 4 5 using namespace std; 6 7 const int MAX = 10; 8 9 char SysProcList[MAX][MAX_PATH] = { 10 "[system process]", 11 "system", 12 "smss.exe",

DLL劫持技术例子: HijackDll

控制台程序:DllLoader Dll加载器,用于动态加载目标Dll,并动态调用目标函数 1 #include <cstdio> 2 #include <windows.h> 3 4 typedef int (*pAdd) (int a, int b); 5 6 int main() 7 { 8 HMODULE hModule = GetModuleHandleA("Dll.dll") != NULL ? GetModuleHandleA("Dll.d

如何给Skype通话录音录像

Skype是免费的语音通话软件,不但可以点对点用电脑进行免费的语音通话,而且只需花费低廉的费用就可以直接呼叫固定电话或手机,Skype以优秀的通话质量而赢得了全世界不少用户的亲睐,我就是Skype的忠实用户,下图就是我的Skype截图: 我常常使用Skype和台湾同胞还有国外的朋友进行联系,有时因为业务需要需要将语音通话录音并保留下来,在我有这个想法的那个时候(2006年)Skype官方并没有提供录音功能,咱们是做程序的嘛,没有的功能可以自己来添加啊,这也是为什么我酷爱编程的原因. 应广大网友的

Windows 程序 dump 崩溃调试

Windows 程序捕获崩溃异常 生成dump 概述 事情的起因是,有个同事开发的程序,交付的版本程序,会偶尔随机崩溃了. 悲催的是没有输出log,也没有输出dump文件. 我建议他给程序代码加个异常捕获,在崩溃时生成dump,方便找出问题点. 隔了一天之后,短暂交流,发现他没有这个开发经验,我只好披挂上阵了. 开动 查阅MSDN文档,和stackoverlfow.com的相关文章,可知 SetUnhandledExceptionFilter 可以捕获触发系统崩溃的异常 风风火火开始写代码 vo