菜鸟IDA python调试脚本

本文介绍了一个用于IDA动态调试的Python脚本示例。该脚本通过设置断点、跟踪函数调用并读取内存内容来辅助调试过程。具体实现了文件创建和读取时的内存内容捕获,并将这些内容保存到指定文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IDA动态调试下断点 还是比较费劲的,写个脚本可能更好一些
import idc
import idaapi
import struct

#idaapi.dbg_write_memory(ea,buf)
idaapi.enable_extlang_python(1)
md={}
add=0
size=0
index=0
cross_refs=0
findname=["MZ","PE"]
for func in findname:
         addr=LocByName(func)
         if addr!=BADADDR:
             cross_refs=CodeRefsTo(addr,0)
             print "got it"
         for ref in range(cross_refs):
             print "%08x"% ref
             SetColor(ref,CiC_ITEM,0x0000ff)
def createfile():
         global md
     #print "code %d  \ninput %d" % (GetRegValue("eax") ,GetRegValue("edi"))
     ea1=GetRegValue("esp")+4
         buf=""
        
     a=idc.Dword(ea1)
         
     #print "s%x\n" % a
         for i in range(50):
          k=idc.Byte(a+i)
          buf=buf+chr(k)
         print "filename  ___%s_____\n" % buf
     #SetRegValue(0x11113333,"edx")
         md[ea1]=buf
         
     return 1
print "start"
def readfile():
  global add, size,index
  index=index+1
  if GetRegValue("eip")==0x20095280:
     add=Dword(GetRegValue("esp")+8)
     size=Dword(GetRegValue("esp")+12)
  if GetRegValue("eip")==0x20095338:
     b=""
     for i in range(size) :
         b=b+chr(Byte(add+i))
     v="%d" %index
     file0=r"c:\hk"+v+"dat"
     file1=r"c:\hk"+v+"dat"
     f1=open(file0,"wb")
     f1.write(b)
     f1.close()
     f1=open(file1,"w")
     f1.write(b)
     f1.close()
  return 1
ea=0x7c00 #fopen
idc.AddBpt(ea)
idc.SetBptAttr(ea,  BPTATTR_FLAGS, GetBptAttr(ea, BPTATTR_FLAGS)&0xfffe)
idc.SetBptCnd(ea, 'createfile()')

ea=0x20001000 #fopen
idc.AddBpt(ea)
idc.SetBptAttr(ea,  BPTATTR_FLAGS, GetBptAttr(ea, BPTATTR_FLAGS)&0xfffe)
idc.SetBptCnd(ea, 'createfile()')  

ea=0x20095960 #fopen
idc.AddBpt(ea)
idc.SetBptAttr(ea,  BPTATTR_FLAGS, GetBptAttr(ea, BPTATTR_FLAGS)&0xfffe)
idc.SetBptCnd(ea, 'createfile()')

ea=0x20095280 #fopen
idc.AddBpt(ea)
idc.SetBptAttr(ea,  BPTATTR_FLAGS, GetBptAttr(ea, BPTATTR_FLAGS)&0xfffe)
idc.SetBptCnd(ea, 'readfile()')


ea=0x20095338 #fopen
idc.AddBpt(ea)
idc.SetBptAttr(ea,  BPTATTR_FLAGS, GetBptAttr(ea, BPTATTR_FLAGS)&0xfffe)
idc.SetBptCnd(ea, 'readfile()')


print "end"
### 如何在 PyCharm 中设置和调试 IDA Pro 的 Python 脚本 #### 设置解释器 为了使 PyCharm 支持 IDAPython 开发环境,需配置特定的 Python 解释器。通过运行安装目录下的 `idapyswitch.exe` 来指定要使用的 Python 版本[^1]。 对于更详细的集过程,在 PyCharm 的 **设置 → 项目 → Python 解释器** 页面中点击齿轮图标并选择“添加”,然后浏览至 IDA Pro 安装路径中的相应子文件夹(通常是 `\python\3` 对应于 Python 3.x),以此来注册新的外部解释器[^2]。 针对具体版本如 IDA Pro 7.7,默认集Python 3.8,则应该指向 `<IDA路径>\IDAPro77\python38\python.exe` 文件作为目标解释器,并且复制相关库文件到项目的适当位置以便导入必要的模块[^3]。 #### 配置项目结构 创建一个新的 PyCharm 项目用于存放所有的 IDAPython 工作文件。按照上述方法设定好合适的解释器后,还需确保能够访问 IDA 提供的各种 API 函数。这通常涉及到将 IDAPython 库拷贝到项目内某个易于管理的位置,并在此基础上建立包初始化文件 (`__init__.py`) 让这些资源可以被正常加载。 #### 编写与测试代码 一旦完了前期准备工作,便可以直接利用 PyCharm 内建的功能特性来进行高效编码了。得益于之前精心挑选过的解释器以及正确构建起来的工作空间,开发者现在能够在享受诸如语法高亮、自动完等功能的同时着手开发实用性强的 IDAPython 插件或辅助工具。 下面给出一段简单的示例代码片段展示如何操作: ```python import ida_bytes import idaapi import idautils def patch_first_instruction(): text_segment = idaapi.get_segm_by_name('.text') first_address = text_segment.start_ea # 修改第一个指令为 nop (0x90) ida_bytes.patch_byte(first_address, int('0x90', 16)) patch_first_instruction() print(list(idautils.Names())) ``` 这段程序会到 `.text` 段的第一个地址并将那里的字节改无操作数(`nop`)命令,最后打印出所有已命名符号列表。 #### 进一步学习资料 除了官方文档外,网络上也有许多关于此主题的学习资源可供参考,例如北理 CTFer 笔记里有关于使用 Visual Studio Code 调试 IDAPython 脚本的内容介绍以及其他一些实践经验分享[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值