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以获取普通注释作为第二个参数。请注意,函数
CommentEx
是GetCommentEx
的包装器。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)