Skip to content

Commit

Permalink
Add API Deobfuscation analysis
Browse files Browse the repository at this point in the history
  • Loading branch information
mborgerson committed Feb 4, 2025
1 parent 0f7ac4d commit 67d63a7
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
13 changes: 13 additions & 0 deletions angrmanagement/data/analysis_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,3 +344,16 @@ def get_default_workers(self) -> int:
if main_obj_size <= self.SMALL_BINARY_SIZE:
return 0
return default_workers


class APIDeobfuscationConfiguration(AnalysisConfiguration):
"""
Configuration for API deobfuscation.
"""

def __init__(self, instance: Instance) -> None:
super().__init__(instance)
self.name = "api_deobfuscation"
self.display_name = "Deobfuscate API usage"
self.description = "Search for 'obfuscated' API use and attempt to deobfuscate it."
self.enabled = False
2 changes: 2 additions & 0 deletions angrmanagement/data/jobs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from .code_tagging import CodeTaggingJob
from .ddg_generation import DDGGenerationJob
from .decompile_function import DecompileFunctionJob
from .deobfuscation import APIDeobfuscationJob
from .dependency_analysis import DependencyAnalysisJob
from .flirt_signature_recognition import FlirtSignatureRecognitionJob
from .job import Job
Expand All @@ -14,6 +15,7 @@
from .vfg_generation import VFGGenerationJob

__all__ = [
"APIDeobfuscationJob",
"CFGGenerationJob",
"CodeTaggingJob",
"DDGGenerationJob",
Expand Down
28 changes: 28 additions & 0 deletions angrmanagement/data/jobs/deobfuscation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from angr.analyses.deobfuscator import APIObfuscationFinder

from .job import InstanceJob

if TYPE_CHECKING:
from angrmanagement.data.instance import Instance
from angrmanagement.logic.jobmanager import JobContext


class APIDeobfuscationJob(InstanceJob):
"""
Job for deobfuscating API usage.
"""

def __init__(self, instance: Instance, on_finish=None) -> None:
super().__init__("API Deobfuscation", instance, on_finish=on_finish)

def run(self, ctx: JobContext) -> None:
self.instance.project.analyses[APIObfuscationFinder].prep(progress_callback=ctx.set_progress)(
variable_kb=self.instance.pseudocode_variable_kb
)

def __repr__(self) -> str:
return "APIDeobfuscationJob"
6 changes: 6 additions & 0 deletions angrmanagement/ui/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from angrmanagement.config import Conf
from angrmanagement.data.analysis_options import (
AnalysesConfiguration,
APIDeobfuscationConfiguration,
CFGAnalysisConfiguration,
CodeTaggingConfiguration,
FlirtAnalysisConfiguration,
Expand All @@ -26,6 +27,7 @@
from angrmanagement.data.breakpoint import Breakpoint, BreakpointType
from angrmanagement.data.instance import Instance, ObjectContainer
from angrmanagement.data.jobs import (
APIDeobfuscationJob,
CFGGenerationJob,
CodeTaggingJob,
FlirtSignatureRecognitionJob,
Expand Down Expand Up @@ -271,6 +273,9 @@ def on_cfg_generated(self, cfg_result) -> None:
)
)

if self.main_instance._analysis_configuration["api_deobfuscation"].enabled:
self.job_manager.add_job(APIDeobfuscationJob(self.main_instance))

if not self.main_instance.cfg.am_none:
if not self._first_cfg_generation_callback_completed:
self._first_cfg_generation_callback_completed = True
Expand Down Expand Up @@ -524,6 +529,7 @@ def run_analysis(self, prompt_for_configuration: bool = True) -> None:
a(self.main_instance)
for a in [
CFGAnalysisConfiguration,
APIDeobfuscationConfiguration,
FlirtAnalysisConfiguration,
CodeTaggingConfiguration,
VariableRecoveryConfiguration,
Expand Down

0 comments on commit 67d63a7

Please sign in to comment.