IDA python,写入特定内存位置

逆向工程 艾达 蟒蛇
2021-06-20 11:09:02

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

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

当我尝试做这样的事情时:

Byte(address) = value

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

include ctypes

那么如何写入特定的内存位置呢?谢谢你。

2个回答

Byte(),Word()并且Dword()是 idapython 的函数,每次尝试在 python 中为函数调用赋值都会以“语法错误:无法分配给函数调用”告终。

您提到的这 3 个函数用于读取给定地址的值,无论是字节、字还是双字。您不能使用它们为地址设置值。


打补丁

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

之前的 IDA 7.0:

PatchByte(ea, value)

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

PatchWord(ea, value)

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

PatchDword(ea, value)

改变一个双字的值

PatchDbgByte(ea, value)

仅更改已调试进程内存中的一个字节

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

GetOriginalByte(ea)

获取程序字节的原始值

国际开发协会 7.0:

自从IDA 7.0到来以来,idapython 做了一些值得一提的变化。

的函数的名称已更改为patch_byte()patch_word()patch_dword()patch_dbg_byte()get_original_byte()相应的,但是,现在,你仍然可以从“使用旧名称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这不会影响原始文件。如果您只想编辑内存中的地址值而不是 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.pyPeter Kacherginsky 的ida- patcher 以查看一些可能对您有帮助的代码示例。

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())