我正在寻找一种方法来修改IDA python脚本中的内存位置。我们可以使用以下功能读取内存:

Byte(address)
Word(address)
Dword(address)


当我尝试执行以下操作时:

Byte(address) = value


IDA表示分配给函数调用无效。我尝试使用ctypes,但是IDA在网上说了未处理的异常:

谢谢。

#1 楼

Byte()Word()Dword()是idapython的函数,每次尝试在python中为函数调用分配值的操作都将以“ SyntaxError:无法分配给函数调用”结尾。提到的用于读取给定地址的值,无论是字节,字还是双字。您不能使用它们为地址设置值。


修补

要修改内存位置,可以使用以下功能之一:

先前的IDA 7.0:

PatchByte(ea, value)



更改程序字节的值
如果调试器处于活动状态,则调试的过程存储器也将被修补


PatchWord(ea, value)



更改程序字的值(2个字节)


PatchDword(ea, value)



更改双字的值


PatchDbgByte(ea, value)



仅更改调试过程存储器中的字节


如果要获取发生任何更改之前已存在的原始字节,则应使用:

GetOriginalByte(ea)



获取原始值程序字节的说明


IDA 7.0:

自从IDA 7.0到来以来,idapython进行了一些值得一提的更改。的功能已更改为patch_byte()patch_word()patch_dword()patch_dbg_byte()get_original_byte() ac诚然,但是到目前为止,您仍然可以使用旧名称,因为负责兼容性的“ IDA 7.0 / Python / idc_bc695.py”包含了这些函数的包装器。

此外,添加了另一个功能:

patch_qword(ea, value)



更改四字的值


注意,PatchQword()不会为您工作,因为它在较早的版本中不存在,因此没有理由将其创建为patch_qword()的包装,以实现兼容性。字节非常直观:

from idaapi import *

address= 0x67643021 
new_value = 0xCC

PatchByte(address, new_value)


这将编辑IDB文件,以将0x67643021的值设置为0xCC。这不会影响origianl文件。如果只想编辑内存中的地址值而不是IDB文件中的地址,则应使用PatchDbgByte()而不是PatchByte()。您需要像这样自己制作:

address= 0x67643021 
new_value = 0xCC

# Open the file
f = open("my_binary.exe", "rb+")

# Seek to the address you want to patch
f.seek(address)

# Write the new value to this address
f.write(new_value)

# Close the file
f.close()



您可以查看Alexander Hanel的fwrapper.py和Peter Kacherginsky的ida-patcher来查看一些可能对您有用的代码示例。

#2 楼

from idaapi import *
from idautils import *
print Byte(ScreenEA())
PatchByte(ScreenEA(),100) <--- this will patch the byte at current address to 0x64
print Byte(ScreenEA())