
有天因故问了hume一个问题,重新执行eh_parse.dll、eh_parse64.dll,这个动作怎么完成?hume当时的回答是:
这个插件只能用RunPlugin()之类的函数重新执行,"Edit->Plugins"里没有它。但是还得看插件的run函数怎么写的,如果是Hook到一些IDA事件上,就得看能不能想办法触发这些事件,所以得逆向插件看了才能找到办法。
本文介绍如何逆向eh_parse64.dll,找出run函数所在,进而确定手工执行方案。
参看
SDK tryblks.hpp
python\ida_tryblks.py
plugins\eh_parse.dll
plugins\eh_parse64.dll
关于run_plugin(),参看
python\ida_loader.py
load_and_run_plugin()
run_plugin()
python\idc.py
load_and_run_plugin()
python\idc_bc695.py
RunPlugin()
从未写过C版本的IDA插件。下面只是简单地记录一下我是如何在完全无知的情况下定位eh_parse64.dll的run函数的。
翻了一下SDK,找到:
plugins\hello\hello.cpp
内容很简单,两个函数,一个结构:

看过hello.cpp,假设所有的插件都有一个PLUGIN结构,其第一个4字节成员都是接口版本,就目前的测试环境,该值等于0x000002BC。
用IDA反汇编eh_parse64.dll,在"Hex View-1"中搜索"BC 02",果然只找到一处,那肯定是PLUGIN所在:

注意到该位置已有符号PLUGIN,最后确认这是导出符号,因此没有必要搜"BC 02"。其第2个成员,在loader.hpp中查到:

由于PLUGIN_HIDE置位,所以"Edit->Plugins"里没有它。

尽管init()中确有Hook动作,但从run()的流程判断,可以直接执行:
load_and_run_plugin("eh_parse64",0)
对于熟悉C版IDA插件编写的人来说,前面的都是废话,我就是讲讲一无所知的情况下我是怎么做的。




