我正在尝试找出我接手的一个旧C++项目的调试版本生成的一些汇编代码。Windows-10 Visual Studio 2019。
我有一个方法调用,看起来像这样:
P2PRespMsg::P2PRespMsg(int port, const char * address, L3Obj* rcv_pro,
fn_process fnprocess)
: NEDSMsg(port, address, rcv_pro, fnprocess)
这是生成的汇编代码
00007FF68DE89ACB lea rax,[rsp+30h]
00007FF68DE89AD0 mov rdi,rax
00007FF68DE89AD3 mov rsi,qword ptr [&fnprocess] <=== move the fnprocess pointer into register rsi
00007FF68DE89ADB mov ecx,18h
00007FF68DE89AE0 rep movs byte ptr [rdi],byte ptr [rsi] <=== what is this moving. This is the line that overwrites memory
00007FF68DE89AE2 mov dword ptr [rsp+28h],0
00007FF68DE89AEA lea rax,[rsp+30h]
00007FF68DE89AEF mov qword ptr [rsp+20h],rax <=== fnprocess
00007FF68DE89AF4 mov r9,qword ptr [rcv_pro] <=== move rcv_pro pointer to register r9
00007FF68DE89AFC mov r8,qword ptr [address] <=== move [address] pointer to register r9
00007FF68DE89B04 mov edx,dword ptr [port] <=== move port to register edx
00007FF68DE89B08 mov rcx,qword ptr [this]
00007FF68DE89B0D call NEDSMsg::NEDSMsg (07FF68CD53F60h)
注解是我的。问题是"movs rep"行正在覆盖内存--来自不同类的本地数据成员。我可以看出它正在将18hex(24十进制)字节从一个位置移动到另一个位置,但它到底在移动什么?我假设它正在移动与函数指针fnprocess相关的东西,但移动什么?移动到哪里?
任何帮助都将不胜感激。谢谢。
更新:NEDSMsg定义为
NEDSMsg类:公共消息,虚拟公共NEDSMsgGroup
NEDSMsg的构造函数被声明为NEDSMsg(int端口,常量字符 * 地址= 0,L3Obj * rcv_pro = 0,fn_process fnprocess = 0);
1条答案
按热度按时间fbcarpbf1#
玛格丽特·布鲁姆的回答确实帮了大忙,但我不知道如何将其视为答案。
原来这是一个转移注意力的方法,我的覆盖发生在其他地方,我以为它在这段代码中,因为这段代码重用了被覆盖变量的另一个示例所使用的内存。