From d51de6d4691eb1ae4afb7b2c31978a203201a80a Mon Sep 17 00:00:00 2001 From: Nir Izraeli Date: Wed, 24 Jan 2018 19:52:52 -0800 Subject: [PATCH 1/4] Add positional annotation base and a single comment annotation --- .../rematch/collectors/annotations/comment.py | 26 ++++++++++ .../annotations/positional_annotation.py | 47 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 idaplugin/rematch/collectors/annotations/comment.py create mode 100644 idaplugin/rematch/collectors/annotations/positional_annotation.py diff --git a/idaplugin/rematch/collectors/annotations/comment.py b/idaplugin/rematch/collectors/annotations/comment.py new file mode 100644 index 000000000..e7fbf3d1e --- /dev/null +++ b/idaplugin/rematch/collectors/annotations/comment.py @@ -0,0 +1,26 @@ +import ida_gdl +import ida_funcs +import ida_lines +import idautils + +from . import annotation + + +class CommentAnnotation(annotation.Annotation): + @staticmethod + def data(offset): + func = ida_funcs.get_func(offset) + + comments = [ea - offset: self.get_comment(ea) + for ea in idautils.Heads(func.startEA, func.endEA)] + return comments + + @staticmethod + def get_comment(self, ea): + raise NotImplementedError("get_comment method not implemented") + + +def RegularCommentAnnotation(CommentAnnotation): + @staticmethod + def get_comment(ea): + return ida_bytes.get_cmt(ea, 0) diff --git a/idaplugin/rematch/collectors/annotations/positional_annotation.py b/idaplugin/rematch/collectors/annotations/positional_annotation.py new file mode 100644 index 000000000..938513d72 --- /dev/null +++ b/idaplugin/rematch/collectors/annotations/positional_annotation.py @@ -0,0 +1,47 @@ +import ida_gdl +import ida_funcs +import ida_lines +import idautils + +from . import annotation + + +class PositionalAnnotation(annotation.Annotation): + type = 'positional' + + @staticmethod + def data(offset): + func = ida_funcs.get_func(offset) + + def clean(asm): + asm = ida_lines.tag_remove(asm) + asm = asm.split(';', 1)[0] + asm.strip() + return asm + + # make sure only nodes inside the function are accounted for + # this solves cascaded functions (when multiple functions share same ends) + def node_contained(node): + return (ida_funcs.func_contains(func, node.startEA) and + ida_funcs.func_contains(func, node.endEA - 1)) + nodes = filter(node_contained, ida_gdl.FlowChart(func)) + node_ids = map(lambda n: n.id, nodes) + + nodes_data = [] + for node in nodes: + assembly = [clean(ida_lines.generate_disasm_line(ea)) + for ea in idautils.Heads(node.startEA, node.endEA)] + successive_nodes = [succ.id + for succ in node.succs() + if succ.id in node_ids] + serialized_node = {'id': node.id, 'start': node.startEA, + 'end': node.endEA,'successive': successive_nodes, + 'assembly': assembly} + nodes_data.append(serialized_node) + + return nodes_data + + @staticmethod + def apply(offset, data): + del offset + del data From 1d5cceadd24e56b9a87f96c9d9f3c281ea688cc3 Mon Sep 17 00:00:00 2001 From: Nir Izraeli Date: Wed, 24 Jan 2018 20:43:27 -0800 Subject: [PATCH 2/4] Fix typo bug --- idaplugin/rematch/collectors/annotations/comment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idaplugin/rematch/collectors/annotations/comment.py b/idaplugin/rematch/collectors/annotations/comment.py index e7fbf3d1e..fdfd2863a 100644 --- a/idaplugin/rematch/collectors/annotations/comment.py +++ b/idaplugin/rematch/collectors/annotations/comment.py @@ -11,8 +11,8 @@ class CommentAnnotation(annotation.Annotation): def data(offset): func = ida_funcs.get_func(offset) - comments = [ea - offset: self.get_comment(ea) - for ea in idautils.Heads(func.startEA, func.endEA)] + comments = {ea - offset: self.get_comment(ea) + for ea in idautils.Heads(func.startEA, func.endEA)} return comments @staticmethod From 7b288fe6b1e6d1fc62f6104d46536397d02499ac Mon Sep 17 00:00:00 2001 From: Nir Izraeli Date: Wed, 24 Jan 2018 20:43:49 -0800 Subject: [PATCH 3/4] Expose and run Positional and RegularComment annotations --- idaplugin/rematch/collectors/annotations/__init__.py | 5 ++++- idaplugin/rematch/instances/function.py | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/idaplugin/rematch/collectors/annotations/__init__.py b/idaplugin/rematch/collectors/annotations/__init__.py index d9a50f99b..c7341786b 100644 --- a/idaplugin/rematch/collectors/annotations/__init__.py +++ b/idaplugin/rematch/collectors/annotations/__init__.py @@ -2,7 +2,10 @@ from .name import NameAnnotation from .assembly import AssemblyAnnotation from .prototype import PrototypeAnnotation +from .positional import PositionalAnnotation +from comment import RegularCommentAnnotation __all__ = ["Annotation", "NameAnnotation", "AssemblyAnnotation", - "PrototypeAnnotation"] + "PrototypeAnnotation", "PositionalAnnotation", + "RegularCommentAnnotation"] diff --git a/idaplugin/rematch/instances/function.py b/idaplugin/rematch/instances/function.py index f00603a3a..8d86b2f7c 100644 --- a/idaplugin/rematch/instances/function.py +++ b/idaplugin/rematch/instances/function.py @@ -24,6 +24,8 @@ def __init__(self, *args, **kwargs): collectors.vectors.MnemonicHistVector, collectors.vectors.BasicBlockSizeHistVector} self.annotations |= {collectors.annotations.AssemblyAnnotation} + collectors.annotations.PositionalAnnotation, + collectors.annotations.RegularCommentAnnotation} def size(self): """return the overall size of function by adding sizes of all indevidual From 144db3b6131f213a3e529e7f91f31b50c0b94d23 Mon Sep 17 00:00:00 2001 From: Nir Izraeli Date: Thu, 31 May 2018 01:55:38 -0700 Subject: [PATCH 4/4] Fix few codacy issues --- idaplugin/rematch/collectors/annotations/comment.py | 13 +++++-------- .../{positional_annotation.py => positional.py} | 2 +- idaplugin/rematch/instances/function.py | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) rename idaplugin/rematch/collectors/annotations/{positional_annotation.py => positional.py} (94%) diff --git a/idaplugin/rematch/collectors/annotations/comment.py b/idaplugin/rematch/collectors/annotations/comment.py index fdfd2863a..85063a600 100644 --- a/idaplugin/rematch/collectors/annotations/comment.py +++ b/idaplugin/rematch/collectors/annotations/comment.py @@ -1,26 +1,23 @@ -import ida_gdl import ida_funcs -import ida_lines +import ida_bytes import idautils from . import annotation class CommentAnnotation(annotation.Annotation): - @staticmethod - def data(offset): - func = ida_funcs.get_func(offset) + def data(self): + func = ida_funcs.get_func(self.offset) - comments = {ea - offset: self.get_comment(ea) + comments = {ea - self.offset: self.get_comment(ea) for ea in idautils.Heads(func.startEA, func.endEA)} return comments - @staticmethod def get_comment(self, ea): raise NotImplementedError("get_comment method not implemented") -def RegularCommentAnnotation(CommentAnnotation): +class RegularCommentAnnotation(CommentAnnotation): @staticmethod def get_comment(ea): return ida_bytes.get_cmt(ea, 0) diff --git a/idaplugin/rematch/collectors/annotations/positional_annotation.py b/idaplugin/rematch/collectors/annotations/positional.py similarity index 94% rename from idaplugin/rematch/collectors/annotations/positional_annotation.py rename to idaplugin/rematch/collectors/annotations/positional.py index 938513d72..363af96cb 100644 --- a/idaplugin/rematch/collectors/annotations/positional_annotation.py +++ b/idaplugin/rematch/collectors/annotations/positional.py @@ -35,7 +35,7 @@ def node_contained(node): for succ in node.succs() if succ.id in node_ids] serialized_node = {'id': node.id, 'start': node.startEA, - 'end': node.endEA,'successive': successive_nodes, + 'end': node.endEA, 'successive': successive_nodes, 'assembly': assembly} nodes_data.append(serialized_node) diff --git a/idaplugin/rematch/instances/function.py b/idaplugin/rematch/instances/function.py index 8d86b2f7c..336ad67b3 100644 --- a/idaplugin/rematch/instances/function.py +++ b/idaplugin/rematch/instances/function.py @@ -23,7 +23,7 @@ def __init__(self, *args, **kwargs): collectors.vectors.MnemonicHashVector, collectors.vectors.MnemonicHistVector, collectors.vectors.BasicBlockSizeHistVector} - self.annotations |= {collectors.annotations.AssemblyAnnotation} + self.annotations |= {collectors.annotations.AssemblyAnnotation, collectors.annotations.PositionalAnnotation, collectors.annotations.RegularCommentAnnotation}