mirror of
https://github.com/mandiant/capa.git
synced 2025-12-21 14:50:33 -08:00
some more changes
This commit is contained in:
@@ -114,7 +114,7 @@ class FilenameDoesntMatchRuleName(Lint):
|
||||
expected = expected.replace(".", "")
|
||||
expected = expected + ".yml"
|
||||
|
||||
found = os.path.basename(rule.meta["capa/path"])
|
||||
found = Path(rule.meta["capa/path"]).name
|
||||
|
||||
self.recommendation = self.recommendation_template.format(expected, found)
|
||||
|
||||
@@ -249,7 +249,8 @@ class InvalidAttckOrMbcTechnique(Lint):
|
||||
super().__init__()
|
||||
|
||||
try:
|
||||
with open(f"{os.path.dirname(__file__)}/linter-data.json", "rb") as fd:
|
||||
data_path = Path(__file__).resolve().parent / "linter-data.json"
|
||||
with data_path.open("rb") as fd:
|
||||
self.data = json.load(fd)
|
||||
self.enabled_frameworks = self.data.keys()
|
||||
except BaseException:
|
||||
@@ -295,7 +296,7 @@ DEFAULT_SIGNATURES = capa.main.get_default_signatures()
|
||||
|
||||
|
||||
def get_sample_capabilities(ctx: Context, path: Path) -> Set[str]:
|
||||
nice_path = os.path.abspath(str(path))
|
||||
nice_path = path.resolve().absolute().as_posix()
|
||||
if path in ctx.capabilities_by_sample:
|
||||
logger.debug("found cached results: %s: %d capabilities", nice_path, len(ctx.capabilities_by_sample[path]))
|
||||
return ctx.capabilities_by_sample[path]
|
||||
@@ -883,43 +884,31 @@ def lint(ctx: Context):
|
||||
return ret
|
||||
|
||||
|
||||
def collect_samples(path) -> Dict[str, Path]:
|
||||
def collect_samples(path: Path) -> Dict[str, Path]:
|
||||
"""
|
||||
recurse through the given path, collecting all file paths, indexed by their content sha256, md5, and filename.
|
||||
Recurse through the given path, collecting all file paths, indexed by their content sha256, md5, and filename.
|
||||
"""
|
||||
samples = {}
|
||||
for root, dirs, files in os.walk(path):
|
||||
for name in files:
|
||||
if name.endswith(".viv"):
|
||||
continue
|
||||
if name.endswith(".idb"):
|
||||
continue
|
||||
if name.endswith(".i64"):
|
||||
continue
|
||||
if name.endswith(".frz"):
|
||||
continue
|
||||
if name.endswith(".fnames"):
|
||||
continue
|
||||
for path in path.rglob("*"):
|
||||
if path.suffix in [".viv", ".idb", ".i64", ".frz", ".fnames"]:
|
||||
continue
|
||||
|
||||
path = pathlib.Path(os.path.join(root, name))
|
||||
try:
|
||||
buf = path.read_bytes()
|
||||
except IOError:
|
||||
continue
|
||||
|
||||
try:
|
||||
with path.open("rb") as f:
|
||||
buf = f.read()
|
||||
except IOError:
|
||||
continue
|
||||
sha256 = hashlib.sha256()
|
||||
sha256.update(buf)
|
||||
|
||||
sha256 = hashlib.sha256()
|
||||
sha256.update(buf)
|
||||
md5 = hashlib.md5()
|
||||
md5.update(buf)
|
||||
|
||||
md5 = hashlib.md5()
|
||||
md5.update(buf)
|
||||
|
||||
samples[sha256.hexdigest().lower()] = path
|
||||
samples[sha256.hexdigest().upper()] = path
|
||||
samples[md5.hexdigest().lower()] = path
|
||||
samples[md5.hexdigest().upper()] = path
|
||||
samples[name] = path
|
||||
samples[sha256.hexdigest().lower()] = path
|
||||
samples[sha256.hexdigest().upper()] = path
|
||||
samples[md5.hexdigest().lower()] = path
|
||||
samples[md5.hexdigest().upper()] = path
|
||||
samples[path.name] = path
|
||||
|
||||
return samples
|
||||
|
||||
@@ -928,7 +917,7 @@ def main(argv=None):
|
||||
if argv is None:
|
||||
argv = sys.argv[1:]
|
||||
|
||||
samples_path = os.path.join(os.path.dirname(__file__), "..", "tests", "data")
|
||||
samples_path = str(Path(__file__).resolve().parent.parent / "tests" / "data")
|
||||
|
||||
parser = argparse.ArgumentParser(description="Lint capa rules.")
|
||||
capa.main.install_common_args(parser, wanted={"tag"})
|
||||
@@ -964,11 +953,12 @@ def main(argv=None):
|
||||
return -1
|
||||
|
||||
logger.info("collecting potentially referenced samples")
|
||||
if not os.path.exists(args.samples):
|
||||
logger.error("samples path %s does not exist", args.samples)
|
||||
samplePath = Path(args.samples)
|
||||
if not samplePath.exists():
|
||||
logger.error("samples path %s does not exist", samplePath)
|
||||
return -1
|
||||
|
||||
samples = collect_samples(args.samples)
|
||||
samples = collect_samples(samplePath)
|
||||
|
||||
ctx = Context(samples=samples, rules=rules, is_thorough=args.thorough)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user