You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GDB中批量修改find命令找到的所有地址的值?

如何在GDB中批量修改find命令找到的所有地址的值?

嘿,这个需求太懂了!Cheat Engine里一键批量改值的爽感,在GDB里也能实现,不用手动逐个修改地址。给你分享两种实用的方法,按需选择:

方法一:用GDB原生命令循环处理

如果不想写脚本,用GDB自带的命令就能搞定。核心思路是循环执行find命令,找到一个地址就修改它,然后把搜索起点移到下一个位置,直到覆盖整个搜索范围:

# 初始化搜索起始地址
set $addr = 0x00100000
# 循环搜索直到超出范围
while $addr < 0x00900000
    # 从当前地址开始搜索目标值
    set $found = find $addr, 0x00900000, 0x190
    # 如果找到有效地址
    if $found != 0
        # 修改该地址的值为0x140,注意{int}是数据类型,根据实际情况调整
        set {int} $found = 0x140
        # 把下一次搜索的起始地址移到当前地址+数据类型大小(这里int是4字节)
        set $addr = $found + 4
    else
        # 没找到就结束循环
        set $addr = 0x00900000
    end
end

注意:这里的{int}要匹配你搜索的数据类型——如果找的是单字节值就用{char},双字节用{short},8字节用{long long},不然会导致地址偏移错误哦。

方法二:用GDB Python脚本更灵活

如果你的find结果特别多,或者需要更复杂的逻辑,用Python脚本会更可靠。它能直接捕获find命令的所有输出,然后批量处理:

python
import gdb

# 配置参数:搜索范围、目标值、要改成的新值
start_addr = 0x00100000
end_addr = 0x00900000
target_val = 0x190
new_val = 0x140

# 执行find命令并获取输出结果
find_output = gdb.execute(f"find {hex(start_addr)}, {hex(end_addr)}, {hex(target_val)}", to_string=True)
# 解析输出里的所有地址
address_list = [int(addr_str.strip(), 16) for addr_str in find_output.split('\n') if addr_str.strip()]

# 遍历所有地址,逐个修改值
for addr in address_list:
    # 同样注意调整{int}为对应的数据类型
    gdb.execute(f"set {{int}} {hex(addr)} = {hex(new_val)}")
end

这个方法的好处是不用手动处理地址偏移,直接一次性拿到所有匹配的地址,修改起来更省心。

备注:内容来源于stack exchange,提问作者Nathan Moyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:22:57