问题摘要
我在模块定义文件“?Add @ MyMathFuncs @ MathFuncs @@ SANNN @ Z”的exports部分放置的函数符号被导出为“?Add”。
我正在尝试做什么
我想使用DLL重定向来拦截函数调用,而且在拦截C ++函数方面遇到了一些问题。我正在使用https://dl.packetstormsecurity.net/papers/win/intercept_apis_dll_redirection.pdf中指定的方法,在那里我创建一个与我想要拦截的DLL同名的DLL,并将其放在与可执行文件相同的目录中。
对于我的具体情况,我试图拦截来自{的一个简单DLL示例的MathFuncs :: MyMathFuncs :: Add函数(从dumpbin.exe添加@MyMathFuncs @ MathFuncs @@ SANNN @ Z) {3}}。为此,我使用以下信息创建了一个模块定义文件
definitions.txt
LIBRARY dll_redirector.dll
EXPORTS
?Add@MyMathFuncs@MathFuncs@@SANNN@Z=myAdd
这里是dll_redirector.cpp(将构建将与可执行文件放在同一文件夹中的dll)。基本上,你可以看到myAdd会用我自己的替换add函数(它基本上什么都不做)
dll_redirector.cpp
#include "stdafx.h"
#pragma comment(linker, "/export:?Divide@MyMathFuncs@MathFuncs@@SANNN@Z=RealMath.?Divide@MyMathFuncs@MathFuncs@@SANNN@Z")
#pragma comment(linker, "/export:?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z=RealMath.?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z")
#pragma comment(linker, "/export:?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z=RealMath.?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z")
__declspec ( naked ) void myAdd(void)
{
__asm{
retn
}
}
当我构建DLL时,dumpbin告诉我它导出了“?Add”而不是“?Add @ MyMathFuncs @ MathFuncs @@ SANNN @ Z”。我怀疑这可能是因为@符号被解释为序数前缀(即使从我的理解,在@符号之前需要有一个空格,因为它被解释为序数)。我试过双引号整个符号名称,我也尝试在@之前加回斜杠(它会将其导出为?添加\而不是)。到目前为止没有任何帮助,我不知道该怎么做。
转储文件dll_redirector.dll
File Type: DLL
Section contains the following exports for dll_redirector.dll
00000000 characteristics
56878868 time date stamp Sat Jan 02 00:20:56 2016
0.00 version
1 ordinal base
4 number of functions
4 number of names
ordinal hint RVA name
1 0 00011113 ?Add = @ILT+270(?myAdd@@YAXXZ)
2 1 ?Divide@MyMathFuncs@MathFuncs@@SANNN@Z (forwarded to RealMath.?Divide@MyMathFuncs@MathFuncs@@SANNN@Z)
3 2 ?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z (forwarded to RealMath.?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z)
4 3 ?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z (forwarded to RealMath.?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z)
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
4000 .text
10000 .textbss
任何帮助将不胜感激。