我有一个问题,我的 memcpy 的 src 指针指向错误。
unsigned char* lpBuffer是一个包含我的字节的缓冲区,我用 olly 检查过。
编码:
IMAGE_DOS_HEADER iDOSh;
memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));
问题是lpBuffer点错了,调试器的输出是
dest = 002859E8 RIGHT
src = 000001D8 FALSE
src指向无效:(我不知道为什么
谢谢阅读
为什么你检查ollydbg而不是更方便的东西?在IDE中跟踪您的步骤。当您将指针传递给函数时(因为它是按值传递的),指针的值不能更改变为无效,因此这意味着它在该调用memcpy之前就已无效。memcpy
不幸的是,您的代码仅涵盖“不会出错”memcpy的明显调用。
还要提一下,0x00000YY您的指针的奇怪值实际上表明出现了问题,并且可能您的代码中某处(或类似的东西)有无效的类型转换。
我认为您正在调用 C 函数的汇编程序中进行调试,并尝试使用 ollydbg 来跟踪它(我只是查找了它是什么,并根据他们的功能列表进行了这个假设)。这是很难做到的。
我建议你这样做:
...
void print_ptr(void * p) {
fprintf(stderr, "%p\n", p);
}
...
IMAGE_DOS_HEADER iDOSh;
print_ptr(lpBuffer);
memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));
print_ptr(lpBuffer);
如果您实际上无法打印就可以了。只需将函数extern添加到有问题的文件memcpy中,它就会强制编译器将值加载到保存第一个参数的位置。您应该能够在调试器中观察到这一点。
memcpy(来自任何合理的 C 库)实际上做错事的可能性非常低。
如果我不得不猜测出了什么问题,那lpBuffer实际上不应该是void *一个内存位置的链接器标签。在这种情况下,您可能应该尝试将其声明为:
extern char lpBuffer[];
把你的 memcpy 做为
memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));
或者
extern IMAGE_DOS_HEADER lpBuffer;
把你的 memcpy 做为
memcpy(&iDOSh,&lpBuffer,sizeof(iDOSh));
lpBuffer在您调用之前立即检查 的值,然后立即memcpy再次检查。它会改变吗?
如果它改变了,唯一可以改变值的lpBuffer是memcpy,这意味着你在调用中覆盖它(即它没有做你认为它正在做的事情......仔细检查你的参数)。
不过,我的猜测是,查看您的代码可能在对memcpy. 也就是说,如果检查lpBuffer之前和之后的值显示它没有变化,那么您在调用之前无意中更改了它memcpy。您需要跟踪该更改。