吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2122|回复: 12
收起左侧

[原创] 调试IDAPython插件(简略版)

[复制链接]
scz 发表于 2025-7-3 10:10
创建: 2025-06-26 17:18
更新: 2025-07-02 16:18

目录:

    ☆ 背景介绍
    ☆ VSCode
        1) 安装Python Debugger扩展
        2) launch.json
    ☆ debugpy模块
    ☆ 远程调试IDAPython插件
        1) debugpy_test_2.py
        2) debugpy_test_3.py
    ☆ VSCode IDACode扩展
        1) 在IDA中安装IDACode插件
        2) 在VSCode中安装、配置IDACode扩展
        3) 用VSCode IDACode扩展远程调试IDAPython脚本
            3.1) debugpy_test_4.py
            3.2) IDAPython脚本测试记录
        4) 用VSCode IDACode扩展远程调试IDAPython插件
            4.1) debugpy_test_5.py
            4.2) IDAPython插件测试记录

☆ 背景介绍

约定一下本文中的术语,IDA中Alt-F7加载的some.py称之为「IDAPython脚本」,"Edit->Plugins"加载的some.py称之为「IDAPython插件」,后者有PLUGIN_ENTRY()。

IDA有大量IDAPython插件,某些插件非常复杂,靠print理解代码逻辑并不方便,若能在某种IDE中调试IDAPython插件,对学习、编写插件非常有益。

编写本文时相关组件版本信息如下

x64/Win10
IDA 8.4.1
Python 3.12.4
debugpy 1.8.14
VSCode 1.101.1

严格按本文所给示例复现时,一般不会遭遇debugpy模块的MyCode判定问题(表象是断点不生效),简略起见,本文未解释此问题的技术原理。

☆ VSCode

参看

Visual Studio Code Portable mode
https://code.visualstudio.com/docs/editor/portable

1) 安装Python Debugger扩展

File
  Preferences
    Extensions (Ctrl+Shift+X)
      Python
      Python Debugger

2) launch.json

File
  Open Folder (Ctrl+K O)
    X:\work\VSCode\IDAPython (假设用这个目录存放Project相关内容)

假设已在UI中打开IDAPython目录,再做后续操作

Run
  Add Configuration
    More Python Debugger options
      Python Debugger: Python File IDAPython (与前面的IDAPython目录名一致)
        编辑IDAPython相关的launch.json

launch.json内容如下

{
    "configurations": [
        {
            "name": "Python Debugger: Attach",
            "type": "debugpy",
            "request": "attach",
            "connect": {
                "host": "127.0.0.1",
                "port": 5678
            },
            "justMyCode": true,
            "rules": [
                {
                    "path": "X:\\Green\\IDA\\plugins\\**",
                    "include": true
                }
            ]
        }
    ]
}

☆ debugpy模块

参看

debugpy - a debugger for Python
https://github.com/microsoft/debugpy/

过去有个支持"Debug Adapter Protocol (DAP)"的Python模块ptvsd,现已废弃,官方不建议继续使用,转用debugpy模块。

向IDA安装debugpy模块

python.exe -m pip install debugpy

☆ 远程调试IDAPython插件

本节演示用debugpy调试plugins目录下的IDAPython插件。

1) debugpy_test_2.py

import idaapi
import debugpy
import os
os.environ["IDE_PROJECT_ROOTS"] = r"X:\Green\IDA\plugins"

def foo () :
    print( "scz is here" )
    print( "ok" )

class TestPlugin ( idaapi.plugin_t ) :
    flags           = idaapi.PLUGIN_UNL
    comment         = "IDAPython TestPlugin"
    help            = "IDAPython TestPlugin"
    wanted_name     = "IDAPython TestPlugin"
    wanted_hotkey   = ""

    def init ( self ) :
        return idaapi.PLUGIN_KEEP

    def term ( self ) :
        pass

    def run ( self, arg ) :
        if not debugpy.is_client_connected() :
            debugpy.listen( ("127.0.0.1", 5678), in_process_debug_adapter=True )
            debugpy.wait_for_client()

        idaapi.msg( 'Hit breakpoint\n' )
        debugpy.breakpoint()
        foo()

def PLUGIN_ENTRY () :
    return TestPlugin()

先在IDA中"Edit->Plugins"加载插件,"netstat -na | findstr :5678"检查侦听端口,再在VSCode中用launch.json发起调试,会断在foo()处。插件执行完,不要在VSCode中选"Disconnect (Shift+F5)",在IDA中再次"Edit->Plugins"加载,可重新调试,仍断在foo()处。

2) debugpy_test_3.py

import idaapi
import debugpy
import os
os.environ["IDE_PROJECT_ROOTS"] = r"X:\Green\IDA\plugins"

def foo () :
    print( "scz is here" )
    print( "ok" )

class TestPlugin ( idaapi.plugin_t ) :
    flags           = idaapi.PLUGIN_UNL
    comment         = "IDAPython TestPlugin"
    help            = "IDAPython TestPlugin"
    wanted_name     = "IDAPython TestPlugin"
    wanted_hotkey   = ""

    def init ( self ) :
        return idaapi.PLUGIN_KEEP

    def term ( self ) :
        pass

    def run ( self, arg ) :
        if not debugpy.is_client_connected() :
            debugpy.configure( python=r"X:\Green\IDA\python.exe" )
            debugpy.listen( ("127.0.0.1", 5678) )
            debugpy.wait_for_client()

        idaapi.msg( 'Hit breakpoint\n' )
        debugpy.breakpoint()
        foo()

def PLUGIN_ENTRY () :
    return TestPlugin()

debugpy_test_3.py未显式设置in_process_debug_adapter为True,但用debugpy.configure()显式指定python.exe的路径。

☆ VSCode IDACode扩展

参看

VSCode IDACode扩展
https://marketplace.visualstudio.com/items?itemName=Layle.idacode
https://github.com/ioncodes/idacode
https://github.com/ioncodes/idacode/releases/download/0.3.0/ida.zip

"VSCode IDACode扩展"主要用于调试IDAPython脚本(Alt-F7加载的那种),也可调试IDAPython插件(plugins目录的那种)。涉及两部分组件;一部分是C端的VSCode扩展,在VSCode中安装、使用;另一部分是S端的IDA插件,上面那个ida.zip即是,需放到plugins目录。底层依赖debugpy、tornado模块,需配套安装。

整体框架有些复杂,调试IDAPython脚本比较方便,调试IDAPython插件时没有优势。

感谢「0x指纹」提供IDACode测试记录,否则入门有些困难。

1) 在IDA中安装IDACode插件

IDAPython环境中需安装两个模块

python.exe -m pip install debugpy tornado

从github下载ida.zip,展开到plugins目录

根据实际情况修改"idacode_utils\settings.py",主要是改python.exe的路径。

2) 在VSCode中安装、配置IDACode扩展

启动VSCode,Ctrl+Shift+X,安装IDACode扩展,检查配置。

Ctrl+Shift+P,有四个与IDACode扩展相关的命令

IDACode: Connect to IDA
IDACode: Attach a debugger to IDA
IDACode: Connect and attach a debugger to IDA
IDACode: Execute script in IDA

3) 用VSCode IDACode扩展远程调试IDAPython脚本

3.1) debugpy_test_4.py

#!/usr/bin/env python
# -*- coding: cp936 -*-

#
# 测试两种加载方式
#
# 1. 在IDA中Alt-F7加载
# 2. 用VSCode IDACode扩展远程加载
#

import idaapi

def foo () :
    print( "scz is here" )
    print( "ok" )

def main () :
    foo()

if "__main__" == __name__ :
    #
    # 可用debugpy.breakpoint(),此处刻意演示dbg.bp()。
    #
    # 虽然没有"import dbg",但IDAPython_ExecScript()第二形参env提供了dbg、
    # __idacode__、__name__
    #
    if '__idacode__' in globals() and __idacode__ :
        #
        # 不同于debugpy.breakpoint(),dbg.bp()将断在自身,而非后一条语句
        #
        dbg.bp( __idacode__, 'Hit breakpoint' )
    main()

3.2) IDAPython脚本测试记录

初学者欲复现时,请严格遵循下述步骤,勿自作聪明。

IDA打开some.i64,"Edit->Plugins->IDACode"

在VSCode中打开待调试IDAPython脚本所在目录

File
  Open Folder (Ctrl+K O)
    X:\work\VSCode\other (debugpy_test_4.py位于其中)

打开debugpy_test_4.py

Ctrl+Shift+P,选择或输入"IDACode: Connect and attach a debugger to IDA",UI正上方有个输入框,检查输入框中路径,回车确认。注意set_workspace时回车确认,此步易忽略,造成后续出错。

Ctrl+Shift+P,选择或输入"IDACode: Execute script in IDA",断在dbg.bp()处,之后可用常规调试动作。

假设修改了debugpy_test_4.py,保存后,再次"IDACode: Execute script in IDA",相当于远程Alt-F7,可立即开始新的调试。不要选"Disconnect (Shift+F5)",断开后重连,不是你想要的效果,IDA报端口占用,只能重启IDA恢复。

4) 用VSCode IDACode扩展远程调试IDAPython插件

4.1) debugpy_test_5.py

#!/usr/bin/env python
# -*- coding: cp936 -*-

import idaapi
import debugpy
import os
os.environ["IDE_PROJECT_ROOTS"] = r"X:\Green\IDA\plugins"

def foo () :
    print( "scz is here" )
    print( "ok" )

class TestPlugin ( idaapi.plugin_t ) :
    flags           = idaapi.PLUGIN_UNL
    comment         = "IDAPython TestPlugin"
    help            = "IDAPython TestPlugin"
    wanted_name     = "IDAPython TestPlugin"
    wanted_hotkey   = ""

    def init ( self ) :
        return idaapi.PLUGIN_KEEP

    def term ( self ) :
        pass

    def run ( self, arg ) :
        #
        # dbg.bp()只能用于IDAPython脚本,不能用于IDAPython插件
        #
        debugpy.breakpoint()
        foo()

def PLUGIN_ENTRY () :
    return TestPlugin()

若遭遇断点不生效,可设置IDE_PROJECT_ROOTS环境变量。

4.2) IDAPython插件测试记录

初学者欲复现时,请严格遵循下述步骤,勿自作聪明。

IDA打开some.i64,"Edit->Plugins->IDACode"

在VSCode中打开任意目录

File
  Open Folder (Ctrl+K O)
    X:\anywhere (不要求是"X:\Green\IDA\plugins")

打开dummy.py,名字无所谓,内容为空无所谓,但必须打开一个。

Ctrl+Shift+P,选择或输入"IDACode: Connect and attach a debugger to IDA",同样有个set_workspace回车确认。

这次不要用"IDACode: Execute script in IDA",此操作用于调试IDAPython脚本,不用于调试plugins目录的IDAPython插件。

在IDA中"Edit->Plugins"加载debugpy_test_5.py。

一切正常的话,VSCode中将自动打开debugpy_test_5.py,断在foo()处,之后可用常规调试动作。

在IDA中再次"Edit->Plugins"加载插件,可重新调试;不要选"Disconnect",不是你想要的效果。

免费评分

参与人数 7吾爱币 +8 热心值 +7 收起 理由
mdf3192078 + 1 + 1 谢谢@Thanks!
HUAJIEN + 1 + 1 谢谢@Thanks!
snatch2null + 1 + 1 感谢分享
MFC + 1 + 1 谢谢@Thanks!
zhuxiangyu1024 + 2 + 1 我很赞同!
evea + 1 + 1 谢谢@Thanks!
飘零未忍 + 1 + 1 感谢分享!用pycharm的远程调试也可以。

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

飘零未忍 发表于 2025-7-3 12:23
感谢分享!用pycharm的远程调试也可以。
xuegeng 发表于 2025-7-3 20:37
头像被屏蔽
fanliansuo1 发表于 2025-7-3 22:13
rank1987 发表于 2025-7-3 23:18
正好需要这个插件,谢谢楼主
agas 发表于 2025-7-4 09:03
小白前来,感谢背景介绍。
ijack2001 发表于 2025-7-4 11:45
正好需要这个插件,谢谢楼主
zhukun1980 发表于 2025-7-4 12:44
感谢分享谢谢大神
yujianlixi 发表于 2025-7-4 13:58
今日又学到啦
NoSugarLatte 发表于 2025-7-8 16:51
这个要调试一下看看是否可用了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-7-20 21:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表