rendering: several fixes and added types/classes

This commit is contained in:
Yacine Elhamer
2023-10-11 11:52:16 +02:00
parent 8b287c1704
commit 953b2e82d2
6 changed files with 20 additions and 15 deletions

View File

@@ -12,14 +12,12 @@ from typing import Tuple, Iterator
from capa.features.common import (
OS,
OS_ANY,
ARCH_ANY,
OS_LINUX,
ARCH_I386,
FORMAT_PE,
ARCH_AMD64,
FORMAT_ELF,
OS_WINDOWS,
FORMAT_UNKNOWN,
Arch,
Format,
Feature,

View File

@@ -1007,13 +1007,13 @@ def collect_metadata(
os_ = get_os(sample_path) if os_ == OS_AUTO else os_
if isinstance(extractor, StaticFeatureExtractor):
flavor = rdoc.Flavor.STATIC
meta_class: type = rdoc.StaticMetadata
elif isinstance(extractor, DynamicFeatureExtractor):
flavor = rdoc.Flavor.DYNAMIC
meta_class = rdoc.DynamicMetadata
else:
assert_never(extractor)
return rdoc.Metadata(
return meta_class(
timestamp=datetime.datetime.now(),
version=capa.version.__version__,
argv=tuple(argv) if argv else None,
@@ -1023,7 +1023,6 @@ def collect_metadata(
sha256=sha256,
path=Path(sample_path).resolve().as_posix(),
),
flavor=flavor,
analysis=get_sample_analysis(
format_,
arch,

View File

@@ -136,6 +136,16 @@ class Metadata(Model):
analysis: Analysis
class StaticMetadata(Metadata):
flavor: Flavor = Flavor.STATIC
analysis: StaticAnalysis
class DynamicMetadata(Metadata):
flavor: Flavor = Flavor.DYNAMIC
analysis: DynamicAnalysis
class CompoundStatementType:
AND = "and"
OR = "or"

View File

@@ -23,6 +23,7 @@ Unless required by applicable law or agreed to in writing, software distributed
See the License for the specific language governing permissions and limitations under the License.
"""
import enum
from typing import cast
import tabulate
@@ -75,7 +76,7 @@ def format_address(address: frz.Address) -> str:
raise ValueError("unexpected address type")
def render_static_meta(ostream, meta: rd.Metadata):
def render_static_meta(ostream, meta: rd.StaticMetadata):
"""
like:
@@ -96,7 +97,6 @@ def render_static_meta(ostream, meta: rd.Metadata):
total feature count 1918
"""
assert isinstance(meta.analysis, rd.StaticAnalysis)
rows = [
("md5", meta.sample.md5),
("sha1", meta.sample.sha1),
@@ -122,7 +122,7 @@ def render_static_meta(ostream, meta: rd.Metadata):
ostream.writeln(tabulate.tabulate(rows, tablefmt="plain"))
def render_dynamic_meta(ostream, meta: rd.Metadata):
def render_dynamic_meta(ostream, meta: rd.DynamicMetadata):
"""
like:
@@ -141,7 +141,6 @@ def render_dynamic_meta(ostream, meta: rd.Metadata):
total feature count 1918
"""
assert isinstance(meta.analysis, rd.DynamicAnalysis)
rows = [
("md5", meta.sample.md5),
("sha1", meta.sample.sha1),
@@ -166,10 +165,10 @@ def render_dynamic_meta(ostream, meta: rd.Metadata):
def render_meta(osstream, doc: rd.ResultDocument):
if isinstance(doc.meta.analysis, rd.StaticAnalysis):
render_static_meta(osstream, doc.meta)
elif isinstance(doc.meta.analysis, rd.DynamicAnalysis):
render_dynamic_meta(osstream, doc.meta)
if doc.meta.flavor is rd.Flavor.STATIC:
render_static_meta(osstream, cast(rd.StaticMetadata, doc.meta))
elif doc.meta.flavor is rd.Flavor.DYNAMIC:
render_dynamic_meta(osstream, cast(rd.DynamicMetadata, doc.meta))
else:
raise ValueError("invalid meta analysis")

View File

@@ -54,7 +54,6 @@ import capa.helpers
import capa.features
import capa.features.common
import capa.features.freeze
from capa.features.extractors.base_extractor import FeatureExtractor, StaticFeatureExtractor
logger = logging.getLogger("capa.profile")

View File