IDApython 和 IDA 反编译器注释

逆向工程 艾达 蟒蛇 idapro插件 六线谱 idapro-sdk
2021-06-28 00:06:18

看一下暴露的函数,发现暴露idaapi了如下的函数。

get_user_cmt
set_user_cmt
save_user_cmts

当这些函数公开时,我希望我有办法使用脚本向十六进制射线反编译器添加注释。我环顾四周,找不到使用这些函数的示例。

[编辑]

set_user_cmt 似乎有 2 个参数,其中第二个是注释,第一个是treeloc_t. 但是,我不太确定如何使用它。使用以下会导致孤儿评论。

idaapi.set_user_cmt(idaapi.treeloc_t(5), "asdf")
3个回答

treeloc_t构造函数不接受EA,你需要指定注释更加精密:

ea = idaapi.get_screen_ea()
cfunc = idaapi.decompile(ea)
tl = idaapi.treeloc_t()
tl.ea = ea
tl.itp = idaapi.ITP_SEMI
cfunc.set_user_cmt(tl, "Test comment")
cfunc.save_user_cmts()

您可以在hexrays.hpp 中找到有关精确器的更多信息并非所有的精确人员都在任何地方工作。例如,上面的代码使用ITP_SEMI, 在分号后进行注释:如果在if.

我正在尝试使用ida-batch_decompile实现类似的功能基本思想是从命令行注释和反编译目标(但它也带有菜单项;充当插件或 idascript)

它目前使用猜测的堆栈变量大小和外部参照的文本描述来注释函数。为此,它添加了一个带有SetFunctionCmt(addr, txtcomment, 0)见代码的函数注释块,一旦所有函数都被注释,它将目标二进制文件反编译为伪代码(也可以选择反编译可解析的导入)。请注意,atm 无法注释反编译行,但我正在考虑将来使用它。

这是一个例子 dbghelp.c

//----- (03052800) --------------------------------------------------------
// **** Variables ****
// * stack size: 20
// {"diff_size": 4, "offset_text": "[bp+0h]", "size": 4, "name": " s", "offset": 0}
// {"diff_size": 4, "offset_text": "[bp+4h]", "size": 4, "name": " r", "offset": 4}
// {"diff_size": 4, "offset_text": "[bp+8h]", "size": 4, "name": "arg_0", "offset": 8}
// {"diff_size": 4, "offset_text": "[bp+Ch]", "size": 4, "name": "dwBytes", "offset": 12}
// {"diff_size": 4, "offset_text": "[bp+10h]", "size": 4, "name": "arg_8", "offset": 16}
// *******************
// ***** XREFS *****
// * # 1
// sub_30733D0+30
// *******************
int __stdcall sub_3052800(int a1, SIZE_T dwBytes, int a3)
{
  int result; // eax@17
  HANDLE v4; // eax@21
...

您可以使用idc.MakeCommidc.MakeRptCmt函数。例如:

MakeComm(address, 'My comment')