detours介绍
[detours的wiki文档](
https://documentation.help/Detours/Ove_Interception.htm#:~:text=Control flow of invocation without Detours and with,function%2C and one function pointer%2C the target pointer.)
github下载后的代码目录结构如下,采用的是Makefile的形式来编译。
命令行编译
对应于Linux系统的make命令,在windows平台编译Makefile的命令为
nmake
;
直接打开命令行执行nmake会报错提示找不到该命令,这是因为环境变量中没有设置
nmake.exe
对应的路径。
nmake
、
cl
等命令都是visual studio工具集的一部分,这里就需要了解如何通过命令行来进行编译。
通过命令行使用 Microsoft C++ 工具集
这里摘抄官方文档的介绍,不建议自行设置环境变量,而是建议打开已经配置好的
开发人员命令提示快捷方式
MSVC 命令行工具使用 PATH、TMP、INCLUDE、LIB 和 LIBPATH 环境变量,还使用特定于已安装工具、平台和 SDK 的其他环境变量。 即使是简单 Visual Studio 安装,也可以设置二十或更多个环境变量。 这种复杂性是强烈建议使用 开发人员命令提示符快捷方式 或 自定义命令文件之一的原因。 不建议在Windows环境中自行设置这些变量。
以vs2019举例,打开开始菜单的
developer command prompt for vs 2019
,再次执行nmake命令,就可以发现命令可以找到了。
和普通命令行窗口的差别
官方文档中也有描述, 可在2个命令行界面执行
SET
命令,然后对比其差异, 可以看到在开发人员命令行界面中,环境变量新增了
INCLUDE
、
LIB
、
Windows SDK
、
.Net Framework
等变量。
x86 or x64
默认的命令行界面是基于x86的, 切换到detours目录下执行
nmake
编译后,会发现生成的exe全部位于
bin.x86
目录下,那么如何编译x64的二进制呢?
仍然以vs2019举例, 在
xxx\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build
下,执行
vcvars64.bat
或
.\vcvarsall.bat x64
, 就可以切换到x64的编译环境。
这里实际上脚本的调用关系为:
graph LR
vcvars64.bat-->vcvarsall.bat
vcvarsall.bat-->VsDevCmd.bat
VsDevCmd.bat位于
xxx\Microsoft Visual Studio\2019\Community\Common7\Tools
路径下,默认执行该脚本就类似于打开
developer command prompt for vs 2019
关于脚本之间的调用关系,这篇文档记录的比较详细深入:
记录一次在PowerShell下进入VC编译环境的探索过程
cmd or powershell
通过
developer command prompt for vs 2019
打开的cmd界面,很多命令都没有,如果能在powershell下进行命令行编译会更加方便。
通过查询其他文档,发现也是有方案的,开始菜单中打开
Developer PowerShell for VS 2019
就可以了,文档链接如下:
Visual Studio 开发人员命令提示和开发人员 PowerShell
但是这样仍然默认打开的是x86的编译环境,如何在powershell中编译x64的目标进程?文档中提到,需要升级到2022版本,就可以在powershell中打开x64的环境了。
& 'C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\Common7\Tools\Launch-VsDevShell.ps1' -Arch arm64 -HostArch amd64