- Assembly code
memcpy: push ebp mov ebp, esp push esi push edi push ecx mov edi, [ebp + 8] mov esi, [ebp + 12] mov ecx, [ebp + 16] .1: cmp ecx, 0 jz .2 mov al, [ds:esi] inc esi mov byte [es:edi], al inc edi dec ecx jmp .1 .2: mov eax, [ebp + 8] pop ecx pop edi pop esi mov esp, ebp pop ebp ret
我在C语言中调用
- C/C++ code
memcpy((void *)child_base,(void *)(text_base),text_size);
执行的时候出现了GF:general protection异常
这个一般是什么原因造成的呢?
请高手指点一下
------解决方案--------------------------------------------------------
帮你顶。。。
------解决方案--------------------------------------------------------
为什么总不愿意调试呢?
你的memcpy实现为裸函数吗?
那么memcpy((void *)child_base,(void *)(text_base),text_size);
中的memcpy调用约定又是什么?
传进的各个指针都是有效地么?
如果你调试了,不难得出结论。
------解决方案--------------------------------------------------------
1. 既然结尾ret,而不是ret 12,说明是cdecl调用约定(或者你自定义的某种方式),那么你在调用了memcpy之后是否做了栈平衡?
2. cmp ecx, 0
jz .2
可以用一句jecxz .2替代。
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
用C语言写一个memcpy的hello world然后内联一个int 3
然后用od打开你编译好的程序,就会顺利找到memcpy,然后F7跟进去应该是个jmp跳转,再跟应该就能找到系统自带的memcpy了,对照着看,对照着写。
------解决方案--------------------------------------------------------
还有一点:
楼主的memcpy没有处理源地址和目标地址部分重叠的问题。