VS2017编译Detours1.5

前言

Detours1.5 适合于低版本的VS编译,比如2003等低版本。

如果想用VS2017/VS2019高版本开发的话,就需要  Detours4.0.1版本  了。参考编译链接 

也就是低版本库+低版本编译器, 高版本库+高版本编译器。

需求:实现Detours1.5+vs2017的编译。路线一:此时需要改Detours1.5的源码,因为有些语法结构,被更新迭代了。

路线二:将Detours1.5 版本和 Detours4.0.1 版本 的函数对应上,这样,就可以看着高版本开发了。

1.5版本编译:

打开VS2017的命令窗口,以管理员身份运行。切换到src目录下,输入:nmake, 回车。

1.编译,问题一:

E:\practice\Detours1.5\Detours1.5\src\detours.cpp(92): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(96): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(104): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(112): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(117): error C2065: “cbCopy”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(117): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(120): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(120): error C2660: “detour_insert_jump”: 函数不接受 2 个参数
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(48): note: 参见“detour_insert_jump”的声明
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(123): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(125): error C2065: “cbTarget”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(176): error C2065: “cbCopy”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(404): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(133): note: 参见“strcpy”的声明
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(405): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(90): note: 参见“strcat”的声明
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(406): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(90): note: 参见“strcat”的声明
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\cl.EXE"”: 返回代码“0x2”
Stop.

1. cbTarget 改为全局变量,就可以了。原代码,仅在for循环中定义了,导致后面的使用出了问题。cbCopy的修改方法,同cbTarget

2. “detour_insert_jump”: 函数不接受 2 个参数, 这个函数中,我把两个相加的变量 用 ( ) 包起来了。

2. 编译,问题二:

E:\practice\Detours1.5\Detours1.5\src\detours.cpp(407): error C2220: 警告被视为错误 - 没有生成“object”文件
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(407): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(133): note: 参见“strcpy”的声明
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(408): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(90): note: 参见“strcat”的声明
E:\practice\Detours1.5\Detours1.5\src\detours.cpp(409): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(90): note: 参见“strcat”的声明
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\cl.EXE"”: 返回代码“0x2”
Stop.

E:\practice\Detours1.5\Detours1.5\src>_CRT_SECURE_NO_WARNINGS nmake
'_CRT_SECURE_NO_WARNINGS' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

E:\practice\Detours1.5\Detours1.5\src>nmake _CRT_SECURE_NO_WARNINGS

Microsoft (R) 程序维护实用工具 14.16.27027.1 版
版权所有 (C) Microsoft Corporation。  保留所有权利。

NMAKE : fatal error U1073: 不知道如何生成“_CRT_SECURE_NO_WARNINGS”
Stop.

1. 【detours.cpp(407): error C2220: 警告被视为错误 - 没有生成“object”文件】,这个错误,网上说:用VS打开,再保存,就能解决。 参考链接

2. 其他警告,就改为了: strcpy_s, strcat_s

 

3. 编译,问题三:

E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(263): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(273): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(283): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(293): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(317): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(344): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(345): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(346): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(347): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(348): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(349): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(350): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(351): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(352): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(353): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(354): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(355): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(356): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(357): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(358): error C3867: “CDetourDis::CopyBytes”: 非标准语法;请使用 "&" 来创建指向成员的指针
E:\practice\Detours1.5\Detours1.5\src\disasm.cpp(359): error C3867: “CDetourDis::Copy0F”: 非标准语法;请使用 "&" 来创建指向成员的指针

这个问题比较难,对源码得进行比较大的改动。原理可以参看这几个链接:

https://blog.youkuaiyun.com/qq_44664843/article/details/112908247

https://blog.youkuaiyun.com/sysleo/article/details/96320261

https://www.cnblogs.com/blog-vincent-0x1F7/p/9668533.html

实操更改(不保证对,反正这个错误已经不显示了),一共更改2处:添加&和类作用域;对成员添加static

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------

4. 编译,问题四:

E:\practice\Detours1.5\Detours1.5\src\image.cpp(1644): error C2065: “n”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1645): error C2065: “n”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1646): error C2065: “n”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1647): error C2065: “n”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1648): error C2065: “n”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1649): error C2065: “n”: 未声明的标识符
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1650): error C2065: “n”: 未声明的标识符

还是因为定义的问题,更改一下变量的作用范围。

5, 编译,问题五:

E:\practice\Detours1.5\Detours1.5\src\image.cpp(585): error C2220: 警告被视为错误 - 没有生成“object”文件

又绕回到了这个问题,是编译环境【将警告变为了错误】,所以编译不错去。继续修改makefile, 添加 /WX-, 取消【将警告变为错误】即可。原理链接

 

经过5步骤的修改,最终编译结果提示如下:

E:\practice\Detours1.5\Detours1.5\src>nmake -f makefile

Microsoft (R) 程序维护实用工具 14.16.27027.1 版
版权所有 (C) Microsoft Corporation。  保留所有权利。

        if not exist "..\include" mkdir "..\include"
        if not exist "..\lib" mkdir "..\lib"
cl: 命令行 warning D9025 :正在重写“/WX”(用“/WX-”)
cl: 命令行 warning D9035 :“Gi-”选项已否决,并将在将来的版本中移除
cl: 命令行 warning D9035 :“O”选项已否决,并将在将来的版本中移除
image.cpp
E:\practice\Detours1.5\Detours1.5\src\image.cpp(585): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(133): note: 参见“strcpy”的声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(608): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(133): note: 参见“strcpy”的声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1070): warning C4456: “rvaName”的声明隐藏了上一个本地声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(994): note: 参见“rvaName”的声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1582): warning C4456: “n”的声明隐藏了上一个本地声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1432): note: 参见“n”的声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1679): warning C4456: “n”的声明隐藏了上一个本地声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1432): note: 参见“n”的声明
E:\practice\Detours1.5\Detours1.5\src\image.cpp(1498): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\string.h(133): note: 参见“strcpy”的声明
cl: 命令行 warning D9025 :正在重写“/WX”(用“/WX-”)
cl: 命令行 warning D9035 :“Gi-”选项已否决,并将在将来的版本中移除
cl: 命令行 warning D9035 :“O”选项已否决,并将在将来的版本中移除
firstexc.cpp
e:\practice\detours1.5\detours1.5\src\firstexc.cpp(60) : warning C4733: 内联 asm 分配到“FS:0”: 处理程序未注册为安全处理程序
cl: 命令行 warning D9025 :正在重写“/WX”(用“/WX-”)
cl: 命令行 warning D9035 :“Gi-”选项已否决,并将在将来的版本中移除
cl: 命令行 warning D9035 :“O”选项已否决,并将在将来的版本中移除
creatwth.cpp
        lib /debugtype:cv /nologo /out:"..\lib\detours.lib" detours.obj  disasm.obj      image.obj        firstexc.obj   creatwth.obj
Microsoft (R) Library Manager Version 14.16.27027.1
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : warning LNK4044: 无法识别的选项“/debugtype:cv”;已忽略
        copy detours.h "..\include\detours.h"
已复制         1 个文件。
        bscmake /v /n /o detours.bsc detours.sbr         disasm.sbr      image.sbr        firstexc.sbr   creatwth.sbr
Microsoft(R) 浏览信息维护实用工具 Version 14.16.27027
Copyright (C) Microsoft Corporation. All rights reserved.

Processing: detours.sbr ..
Processing: disasm.sbr ..
Processing: image.sbr ..
Processing: firstexc.sbr ..
Processing: creatwth.sbr ..
Processing: SBR files all processed -- building .bsc ..

E:\practice\Detours1.5\Detours1.5\src>

最终文件编译出:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值