我正在开发一个 QEMU 项目,涉及具有读写功能的设备模块(
dummy_read
和 dummy_write
)。有问题的内存地址是 0x916e000
,我已经使用适当的回调设置了 MemoryRegionOps
结构 (dummy_ops
)。
在GDB中使用
"x/x 0x916e000"
读取内存效果很好,但是用"set {int}0x916e000=0x1"
修改却达不到预期的效果。
设备模块代码片段如下;
static uint64_t dummy_read(void *opaque, hwaddr addr, unsigned size)
{
printf("dummy_read\n");
return 0;
}
static void dummy_write(void *opaque, hwaddr addr, uint64_t val,
unsigned size)
{
printf("dummy_write\n");
}
static const MemoryRegionOps dummy_ops = {
.read = dummy_read,
.write = dummy_write,
.valid.min_access_size = 1,
.valid.max_access_size = 8,
.valid.unaligned = true,
.endianness = DEVICE_NATIVE_ENDIAN,
};
以下是我考虑过的一些要点:
dummy_write
) 表明该区域应该是可写的。set
命令的语法似乎是正确的。其他详细信息:
dummy_write()
函数成功调用设备模块的 writeReg()
函数。这是应用程序代码的片段:void writeReg(uint32_t addr, uint32_t data)
{
uint32_t *ptr = (uint32_t *)addr;
*ptr = data;
}
int main()
{
writeReg(0x916e000, 0x1);
// Successfully invokes dummy_write() function
return 0;
}
尽管能够使用应用程序代码写入设备模块的内存区域,但在尝试使用 GDB 会话中的
set
命令实现相同目的时遇到问题。
是否有任何我可能遗漏的具体内容或我应该采取的任何其他步骤来使用 GDB 排除故障并成功修改 QEMU 环境中此地址处的内存?
我们将非常感谢您的见解和建议。谢谢!
我发现问题了!该问题似乎是由于在 $adminPasswordHashVERIFY 变量中的哈希密码周围使用双引号 (") 引起的。使用双引号时,PHP 会解释该字符串并替换其中的变量。由于没有名为 $fReIQ 的变量,PHP 会对其进行处理作为未定义的变量,导致验证的哈希值不正确。
要解决此问题,请在 $adminPasswordHashVERIFY 变量中的哈希密码周围使用单引号 (')。这确保哈希被视为纯字符串并且不会被 PHP 解释。
现在,如果您尝试以下代码,您将得到输出“密码正确!”;
<?php
$adminPassword = "test123";
$adminPasswordHash = password_hash($adminPassword, PASSWORD_BCRYPT);
$adminInputPassword = "test123";
$adminPasswordHashVERIFY = '$2y$10$o4qspRTirOSdyGtwHCxt6ee2i0BNChl3mEPazxVbmb534kw3ACHCm';
if (password_verify($adminInputPassword, $adminPasswordHashVERIFY)) {
echo "Password is correct!";
} else {
echo "Password is incorrect!";
}
?>