如何从IDAPython API调用user_cmts_*函数?我对SDK和IDAPython还是很陌生,所以对于应该传递给这些函数的内容我有些迷茫,因为它不是用户友好的docs imo。我曾尝试通过user_cmts_begin这样的映射:

import idaapi

def print_cmt(cmt):
   print cmt

cumap = map(print_cmt, [some address here to test])

idaapi.user_cmts_begin(cumap)


但是它引发类型错误,所以显然我一定做错了...

现在我不得不采取这种方式:

import idaapi
import re

addr = 0x80000000

while addr < 0x80200000:
    cmt = idaapi.get_cmt(addr, 0) # get non-repeatable comment at current address/line

    if cmt is not None: # skip if the line has no comment
        if re.search("insert regex for non-auto-generated comments here", cmt) is not None:
            print "%08X: %s" % (addr, cmt)

    addr = idaapi.next_not_tail(addr)


IDAPython文档可以在这里找到:

https: //www.hex-rays.com/products/ida/support/idapython_docs/

有人可以举个例子吗?

#1 楼

您可能要使用IDAPython包装函数。正如您所提到的,IDA API的文档非常少。真正理解它的最好但并非最简单的方法之一是检查IDA / Python / idc.py文件夹中的IDAPython包装器库。

根据我在idc.py文件中看到的内容,可能需要检查一些功能以帮助您。

在当前行中创建注释:

MakeComm(ScreenEA(), "Comment Test")


在当前行中创建重复的注释:

MakeRptCmt(ScreenEA(), "Repeatable Comment")


从当前行中检索注释:

指定1以获取可重复的注释,或指定0以获取普通注释作为第二个参数。请注意,函数CommentExGetCommentEx的包装器。

c = GetCommentEx(ScreenEA(), 1)
print(c)


或更简单的方法是使用Comment(ea)RptCmt(ea),它们是GetCommentEx()的包装器:

def Comment(ea):                return GetCommentEx(ea, 0)
"""Returns the regular comment or None"""

def RptCmt(ea):                 return GetCommentEx(ea, 1)
"""Returns the repeatable comment or None"""


然后您就拥有了所有特殊功能,可从特定结构(例如Enums,Functions,Constants)中检索注释...我不相信我见过特定的函数来检索所有注释,但它像您所做的那样很容易构建:评论/可重复评论。不是最好的代码(缓慢),但是它说明了IDA Python注释函数的用法。

def get_comments(_startea, _endea, _filter):
    matches = []
    ea = _startea
    for ea in range(_startea, _endea):
        cmt1 = Comment(ea)
        cmt2 = RptCmt(ea)
        cmt = ""
        if cmt1:
            cmt += cmt1
        if cmt2:
            cmt += cmt2
        if (cmt):
            re_match = re.match(_filter, cmt, re.I)
            if (re_match and len(re_match.groups()) > 0):
                matches.append(re_match.group(3))
    return matches

MakeComm(ScreenEA(), 'jump: 0xBADC0DE')
filter = r'(.*)(jump: 0x)([0-9a-fA-F]+)(.*)'
addrs = get_comments(MinEA(), MaxEA(), filter)