0

我有一个问题,我的 memcpy 的 src 指针指向错误。

unsigned char* lpBuffer是一个包含我的字节的缓冲区,我用 olly 检查过。

编码:

 IMAGE_DOS_HEADER iDOSh;
 memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));

问题是lpBuffer点错了,调试器的输出是

dest = 002859E8 RIGHT
src = 000001D8 FALSE

src指向无效:(我不知道为什么

谢谢阅读

4

3 回答 3

4

为什么你检查ollydbg而不是更方便的东西?在IDE中跟踪您的步骤。当您将指针传递给函数时(因为它是按值传递的),指针的值不能更改变为无效,因此这意味着它在该调用memcpy之前就已无效。memcpy

不幸的是,您的代码仅涵盖“不会出错”memcpy的明显调用。

还要提一下,0x00000YY您的指针的奇怪值实际上表明出现了问题,并且可能您的代码中某处(或类似的东西)有无效的类型转换。

于 2010-06-03T18:10:18.280 回答
1

我认为您正在调用 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));
于 2010-06-03T22:04:19.243 回答
0

lpBuffer在您调用之前立即检查 的值,然后立即memcpy再次检查。它会改变吗?

如果它改变了,唯一可以改变值的lpBuffermemcpy,这意味着你在调用中覆盖它(即它没有做你认为它正在做的事情......仔细检查你的参数)。

不过,我的猜测是,查看您的代码可能在对memcpy. 也就是说,如果检查lpBuffer之前和之后的值显示它没有变化,那么您在调用之前无意中更改了它memcpy。您需要跟踪该更改。

于 2010-06-03T19:28:55.907 回答