如何在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
相关产品推荐
相关产品推荐

