c - 安全编程中的 Memcpy()?

标签 c security memcpy

我最近偶然发现了 an article声称 Microsoft 正在其安全编程商店中禁止 memcpy() 函数。我了解该功能固有的漏洞,但是否有必要完全禁止其使用?

我编写的程序应该完全避免使用 memcpy(),还是只确保安全使用它?有哪些替代方案可以提供类似但更安全的功能?

最佳答案

Microsoft 提供 alternatives验证其参数的 memcpy 和 wmemcpy。

memcpy_s 说,“嗯,在我从这个地址读取之前,让我自己验证它不是空指针;在我写入这个地址之前,我将再次执行该测试。我还将比较数字我被要求复制到目标的声明大小;当且仅当调用通过所有这些测试时,我才能执行复制。”

memcpy 说“将目标放入寄存器,将源放入寄存器,将计数放入寄存器,执行 MOVSB 或 MOVSW。” (地球城市的例子,这个世界不久:http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)

编辑:有关 memcpy 的 Your Wish Is My Command 方法的一个例子,请考虑 OpenSolaris,其中 memcpy 是(对于某些配置)defined in terms of bcopy , 和 bcopy (对于某些配置)是......

void
     33 bcopy(from, to, count)
     34 #ifdef vax
     35     unsigned char *from, *to;
     36     int count;
     37 {
     38 
     39     asm("   movc3   12(ap),*4(ap),*8(ap)");
     40 }
     41 #else
     42 #ifdef u3b      /* movblkb only works with register args */
     43     unsigned char *from, *to;
     44     int count;
     45 {
     46     asm("   movblkb %r6, %r8, %r7");
     47 }
     48 #else
     49     unsigned char *from, *to;
     50     int count;
     51 {
     52     while ((count--) > 0)
     53         *to++ = *from++;
     54 }
     55 #endif

编辑:谢谢,米莉·史密斯!这是我在上面链接的 geocities 页面上的内容:

动画

指令 movs 用于将源字符串复制到目标中(是的,复制,而不是移动)。该指令有两个变体:movsb 和 movsw。 movsb(“移动字符串字节”)一次移动一个字节,而 movsw 一次移动两个字节。

因为我们想一次移动几个字节,所以这些 movs 指令使用 rep 前缀分批完成。移动次数由 CX 寄存器指定。请参见下面的示例:

:
lds   si, [src]
les   di, [dest]
cld
mov   cx, 100
rep   movsb
:

此示例将从 src 复制 100 个字节到 dest。如果将 movsb 替换为 movsw,则会复制 200 个字节。如果删除 rep 前缀,则 CX 寄存器将无效。您将移动一个字节(如果是 movsb,如果是 movsw,则移动 2 个字节)。

关于c - 安全编程中的 Memcpy()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870019/

相关文章:

security - 为什么叫彩虹 table 呢?

c - Ubuntu 中的 OpenGL(C 语言)说事情未声明

c - 每种数据类型具有多个成员的结构

c - 如何在c中返回这个缓冲区值?

javascript - 如何验证来自 socket.io 的数据包?

.net - Entity Framework 插入需要选择权限

c - memcpy:第二次调用后出现段错误

c++ - ZeroMQ Pub 发送空字符串

c++ - Memcpy 导致 block 释放两次错误

c++ - 对于大型程序,使用 #define 将所有 int 类型更改为另一种类型