编译64位Detours(其他vs版本同理)



fatal error C1083: 无法打开包括文件:“excpt.h”

在编译Detours4.0的时候,nmake提示错误:
Windows Kits\8.0\include\um\windows.h fatal error C1083: 无法打开包括文件:“excpt.h”,找不到相关头文件。

解决方法1:设置头文件搜索路径(少啥添啥)

在这里插入图片描述
该方法最实用,少INCLUDE文件你搜到后,就将该文件所在的目录添加到系统环境变量INCLUDE里面,少LIB文件你就将它的目录添加到系统环境变量LIB里面,少了添啥。


解决方法2(如果头文件不在VC目录下面的话,就以上面的方法1为主):

打开cmd命令控制台,找到vcvars32.bat所在路径,例如:D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin,运行该批处理文件;

或者运行vcvarsall.bat文件:

cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC
vcvarsall.bat

参考链接:
Windows环境下用nmake编译libevent

nmake编译libraw


vs2012编译64位Detours(其他vs版本同理)

1、下载地址
https://github.com/Microsoft/Detours
2、解压后,将system.mak和src目录拷贝到Visual Studio 11目录的VC目录下,并将src目录下的Makefile文件的只读属性去掉,然后打开Makefile文件进行如下修改:

扫描二维码关注公众号,回复: 15506104 查看本文章
CFLAGS=/nologo /W4 /WX- /we4777 /we4800 /Zi /MT /Gy /Gm- /Zl /Od /DDETOUR_DEBUG=$(DETOURS_DEBUG)

将上述选项中的/WX修改为/WX-,/WX 是警告被视为错误,而 /WX- 是警告不被视为错误。

3、右键以管理员模式运行VS2012 x64 Native Tools Command Prompt:

在这里插入图片描述

cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC
d:
cd src
nmake

在这里插入图片描述
在这里插入图片描述
detours.lib生成成功,并会自动将detours.h、detver.h拷贝到D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC目录中的include目录中,这样就可以在你项目.cpp中直接引用detours.h头文件。


vs项目设置选项

D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC目录下编译生成的库目录lib.X64拷贝粘贴到你的项目目录中,并设置你的项目属性:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
detours4.0.1x64.lb是我将编译生成的.lib文件改了个名字。

使用例子

#include <windows.h>
#include "detours.h"
#include "detoursHookApi.h"

BOOL HookApi(PVOID *oldApi/*要HOOK的地址 变量*/, PVOID newApi/*新的函数地址*/)
{
    
    
	BOOL br = FALSE;
	DetourRestoreAfterWith();	//恢复原来状态
	DetourTransactionBegin();	//拦截开始
	DetourUpdateThread(GetCurrentThread());	//刷新当前线程

	//这里可以连续多次调用DetourAttach,表示HOOK多个函数
	//DetourAttach(&(PVOID&)OldCreateMutexA, NewCreateMutexA);
	DetourAttach(oldApi, newApi);
	//br返回NO_ERROR 表示成功
	br=DetourTransactionCommit();	//让拦截生效
	if(br == NO_ERROR)
	{
    
    
		br = TRUE;
	}
	else
	{
    
    
		br = FALSE;
	}

	return br;
}

BOOL UnHookApi(PVOID *oldApi, PVOID newApi)
{
    
    
	BOOL br = FALSE;
	DetourTransactionBegin();	//拦截开始
	DetourUpdateThread(GetCurrentThread());	//刷新当前线程

	//这里可以连续多次调用DetourAttach,表示撤销多个函数HOOK
	//DetourAttach(&(PVOID&)OldCreateMutexA, NewCreateMutexA);
	DetourDetach(oldApi, newApi);	//卸载HOOK
	//br返回NO_ERROR 表示成功
	br=DetourTransactionCommit();	//HOOK生效
	if(br == NO_ERROR)
	{
    
    
		br = TRUE;
	}
	else
	{
    
    
		br = FALSE;
	}

	return br;
}

编译使用了Detours库的项目报错fatal error C1189

fatal error C1189: #error : Unknown architecture (x86, amd64, ia64, arm, arm64)
在vs中编译使用了Detours库的项目时,报上述错误。
解决方法:
在include "detours.h"之前要先包含windows.h头文件,即:

#include <windows.h>
#include "detours.h"
#include "detoursHookApi.h"

猜你喜欢

转载自blog.csdn.net/zhaopeng01zp/article/details/129755171