小编Jul*_*ano的帖子

是否有必要清理堆栈内容?

我们正在获得PCI PA-DSS认证,其中一项要求是避免将干净的PAN(卡号)写入磁盘.应用程序不会将此类信息写入磁盘,但如果操作系统(在本例中为Windows)需要交换,则将内存内容写入页面文件.因此,应用程序必须清理内存以防止RAM捕获器服务读取敏感数据.

有三种情况需要处理:

  • 堆分配(malloc):在释放内存之前,可以清除该区域 memset
  • 静态或全局数据:使用后,可以使用清理区域 memset
  • 本地数据(函数成员):数据放在堆栈上,在函数完成后无法访问

例如:

void test()
{
  char card_number[17];

  strcpy(card_number, "4000000000000000");
}
Run Code Online (Sandbox Code Playgroud)

在执行测试之后,存储器仍然包含card_number信息.

一条指令可以在测试结束时将变量card_number归零,但这应该适用于程序中的所有函数.

memset(card_number, 0, sizeof(card_number));
Run Code Online (Sandbox Code Playgroud)

有没有办法在某个时刻清理堆栈,就像程序结束前一样?

c c++ pci-dss

8
推荐指数
1
解决办法
605
查看次数

Switch中不正确的多个案例不会生成编译器错误

我知道这段代码不能用作"预期".只是快速查看此代码,我们认为返回值应为1,但在执行时它返回3.

// incorrect
variable = 1;
switch (variable)
{
  case 1, 2:
    return 1;
  case 3, 4:
    return 2;
  default:
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

并且有一些正确的选项可以做到这一点:

// correct 1
variable = 1;
switch (variable)
{
  case 1: case 2:
    return 1;
  case 3: case 4:
    return 2;
  default:
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

要么

// correct 2
switch (variable)
{
  case 1:
  case 2:
    return 1;
  case 3:
  case 4:
    return 2;
  default:
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

在Switch中的多个案例中部分回答了这个问题:

我想知道为什么不正确的表单编译没有错误甚至警告(至少在Borland C++编译器中).

编译器在该代码中理解什么?

c++

5
推荐指数
1
解决办法
294
查看次数

如何检测串口嗅探器?

是否有可能检测到某些串行端口是否被Windows上运行的另一个进程嗅探?

我们有一个应用程序可以接收一些其他人无法读取的敏感数据.因此,在打开串口之前,我们需要检查端口是否受到监控.

我们可以使用CreateFileWindows API函数打开具有独占访问权限的串行端口,但如果监视器在我们的调用之前运行,它可以读取所有通信(它打开具有共享访问权限的串行端口,因此我们可以打开端口同一时间).为避免这种情况,尝试检查端口是否受到监视并引发异常,警告用户.是否有可能做到这一点?

winapi serial-port

0
推荐指数
1
解决办法
759
查看次数

标签 统计

c++ ×2

c ×1

pci-dss ×1

serial-port ×1

winapi ×1