我有一个问题,我的memcpy的src指针指向错误。
unsigned char* lpBuffer
是一个包含我的字节的缓冲区,我用olly检查。
代码:
IMAGE_DOS_HEADER iDOSh;
memcpy(&iDOSh,lpBuffer,sizeof(iDOSh));
问题是lpBuffer
指出错误,调试器的输出是
dest = 002859E8 RIGHT
src = 000001D8 FALSE
src
指向无效:(我不知道为什么
感谢您阅读
答案 0 :(得分:4)
为什么要检查 ollydbg 但不是更方便?跟踪 IDE 中的步骤。将指针的值传递给memcpy
函数时,它无法更改变为无效(因为它是按值传递的),因此它意味着它在memcpy
调用之前一直无效。
不幸的是,您的代码只涵盖了明显的memcpy
来电,其中 “没有任何问题可以解决”。
另外要指出的是,指针的奇怪0x00000YY
值实际上表明出现了问题,并且可能在代码(或类似的东西)中的某处存在无效的类型转换。 < / p>
答案 1 :(得分: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));
答案 2 :(得分:0)
在您致电lpBuffer
之前立即检查memcpy
的值,然后立即再次检查lpBuffer
。它改变了吗?
如果它发生了变化,唯一可以改变memcpy
中值的是memcpy
,这意味着你在调用中覆盖了它(即它没有做你认为它正在做的事情...仔细检查你的参数。)
我的猜测是,看看你的代码可能在调用lpBuffer
时没有改变。也就是说,如果在显示它之前和之后立即检查memcpy
的值,则会在调用{{1}}之前无意中更改它。您需要跟踪该更改。