James M. Drake

52 papers A* 4A 12Journal 15Unranked 21
YearRankTypeTitle / Venue / Authors
2025 A conf
IROS
Haley Mayer, Eran Shlomovitz, James M. Drake, Thomas Looi, Eric D. Diller
2025 A conf
IROS
Nillan Nimal, Arion Law, Connor Lee, Radian Gondokaryono, James M. Drake, Tim Van Mieghem, Adnan Munawar, Thomas Looi
2025 conf
ISMR
Paul H. Kang, Radian Gondokaryono, Majid Roshanfar, Robert H. Nguyen, Thomas Looi, James M. Drake, Dale Podolsky
2025 A* conf
ICRA
Majid Roshanfar, Pedram Fekri, Robert H. Nguyen, Changyan He, Paul H. Kang, James M. Drake, Eric D. Diller, Thomas Looi
2025 J jnl
Sci. Robotics
Changyan He, Robert H. Nguyen, Haley Mayer, Lingbo Cheng, Paul H. Kang, D. Anastasia Aubeeluck, Grace M. Thiong'o, Erik Fredin, James M. Drake, Thomas Looi, Eric D. Diller
2025 conf
RoboSoft
Majid Roshanfar, Alex Zhang, Changyan He, Amir Hooshiar, James M. Drake, Thomas Looi, Eric D. Diller
2024 A conf
IROS
Arion Law, Nillan Nimal, Paul H. Kang, Radian Gondokaryono, James M. Drake, Tim Van Mieghem, Thomas Looi
2024 conf
BioRob
Yuanzhe Deng, Majid Roshanfar, Haley Mayer, Changyan He, James M. Drake, Thomas Looi, Eric D. Diller
2023 A* conf
ICRA
Changyan He, Robert H. Nguyen, Cameron Forbrigger, James M. Drake, Thomas Looi, Eric D. Diller
2023 conf
ISMR
Zhiling Zou, Jessica Burgner-Kahrs, Thomas Looi, James M. Drake
2023 J jnl
CoRR
Adam Schonewille, Changyan He, Cameron Forbrigger, Nancy Wu, James M. Drake, Thomas Looi, Eric D. Diller
2023 J jnl
Sci. Robotics
Karl Price, Joseph Peine, Margherita Mencattelli, Yash Chitalia, David Pu, Thomas Looi, Scellig S. Stone, James M. Drake, Pierre E. Dupont
2022 A conf
IROS
Mustafa Haiderbhai, Radian Gondokaryono, Thomas Looi, James M. Drake, Lüder A. Kahrs
2021 conf
EMBC
Grace M. Thiong'o, Thomas Looi, James M. Drake
2021 J jnl
IEEE Robotics Autom. Lett.
Kevin Ai Xin Jue Luo, Jongwoo Kim, Thomas Looi, James M. Drake
2021 J jnl
IEEE Trans. Biomed. Eng.
Andrew Lim, Adam Schonewille, Cameron Forbrigger, Thomas Looi, James M. Drake, Eric D. Diller
2021 J jnl
IEEE Trans. Ind. Electron.
Tianhao Chen, Zia Saadatnia, Jongwoo Kim, Thomas Looi, James M. Drake, Eric D. Diller, Hani E. Naguib
2020 conf
EMBC
Claudia Lutfallah, Thomas Looi, James M. Drake
2020 A conf
IROS
Zhaoshuo Li, Alex Gordon, Thomas Looi, James M. Drake, Christopher R. Forrest, Russell H. Taylor
2020 J jnl
CoRR
Zhaoshuo Li, Alex Gordon, Thomas Looi, James M. Drake, Christopher R. Forrest, Russell H. Taylor
2020 A conf
IROS
Jongwoo Kim, Thomas Looi, Allen Newman, James M. Drake
2019 conf
EMBC
Marko Mikic, Peter Francis, Thomas Looi, J. Ted Gerstle, James M. Drake
2019 J jnl
IEEE Robotics Autom. Lett.
Cameron Forbrigger, Andrew Lim, Onaizah Onaizah, Sajad Salmanipour, Thomas Looi, James M. Drake, Eric D. Diller
2018 A* conf
ICRA
Alex Gordon, Thomas Looi, James M. Drake, Christopher R. Forrest
2018 A conf
IROS
Kevin Ai Xin Jue Luo, Thomas Looi, Saba Sabetian, James M. Drake
2018 A conf
IROS
Alexander N. Alvara, Thomas Looi, Rami Saab, Amanda L. Shorter, Andrew A. Goldenberg, James M. Drake
2018 J jnl
Medical Biol. Eng. Comput.
Peyman Shokrollahi, James M. Drake, Andrew A. Goldenberg
2017 conf
EMBC
Elnaz Shokrollahi, Andrew A. Goldenberg, James M. Drake, Kyle W. Eastwood, Matthew Kang
2017 J jnl
Sci. Robotics
James Cambias, Kevin Cleary, Eric Daimler, James M. Drake, Pierre E. Dupont, Nobuhiko Hata, Peter Kazanzides, Sylvain Martel, Rajni V. Patel, Veronica J. Santos, Russell H. Taylor
2017 J jnl
IEEE Robotics Autom. Mag.
Peter Francis, Kyle W. Eastwood, Vivek Bodani, Karl Price, Kunj Upadhyaya, Dale Podolsky, Hamidreza Azimian, Thomas Looi, James M. Drake
2017 conf
EMBC
Justin Wee, Matthew Kang, Peter Francis, Robert J. Brooks, Leigh Masotti, Daniel Villavicencio, Thomas Looi, Georges Azzie, James M. Drake, J. Ted Gerstle
2016 J jnl
Presence Teleoperators Virtual Environ.
Faezeh Heydari Khabbaz, Andrew A. Goldenberg, James M. Drake
2016 A conf
IROS
Kyle W. Eastwood, Hamidreza Azimian, Brian Carrillo, Thomas Looi, Hani E. Naguib, James M. Drake
2016 conf
Image-Guided Procedures
Maggie Hess, Kyle W. Eastwood, Bence Linder, Vivek Bodani, Andras Lasso, Thomas Looi, Gabor Fichtinger, James M. Drake
2015 conf
EMBC
Elnaz Shokrollahi, Karl Price, James M. Drake, Andrew A. Goldenberg
2015 conf
EMBC
Kyle W. Eastwood, Thomas Looi, Hani E. Naguib, James M. Drake
2015 conf
EMBC
Robert J. Brooks, Thomas Looi, James M. Drake
2015 conf
Image-Guided Procedures
Maggie Hess, Thomas Looi, Andras Lasso, Gabor Fichtinger, James M. Drake
2014 conf
RiiSS
Faezeh Heydari Khabbaz, Andrew A. Goldenberg, James M. Drake
2014 A conf
IROS
Hamidreza Azimian, Thomas Looi, James M. Drake
2014 conf
MMVR
Nikoo R. Saber, Vinay Menon, Jean C. St-Pierre, Thomas Looi, James M. Drake, Xavier Cyril
2014 A conf
IROS
Hamidreza Azimian, Peter Francis, Thomas Looi, James M. Drake
2013 A* conf
ICRA
Santosh Iyer, Thomas Looi, James M. Drake
2013 conf
Image-Guided Procedures
Xishi Huang, Anwar Abdalbari, Sameer Zaheer, Thomas Looi, Jing Ren, James M. Drake
2013 A conf
IROS
Thomas Looi, Benny Yeung, Manickham Umasthan, James M. Drake
2013 conf
EMBC
Robert J. Brooks, Hannah Piper, Thomas Looi, James M. Drake
2012 conf
EMBC
Xishi Huang, Anwar Bari, Sameer Zaheer, Thomas Looi, Jing Ren, James M. Drake
2012 conf
EMBC
Xishi Huang, Sameer Zaheer, Anwar Abdalbari, Thomas Looi, Jing Ren, James M. Drake
2012 conf
Image-Guided Procedures
Carling L. Cheung, Thomas Looi, James M. Drake, Peter C. W. Kim
2005 J jnl
Appl. Math. Comput.
Sivabal Sivaloganathan, M. Stastna, Giuseppe Tenti, James M. Drake
2005 J jnl
Appl. Math. Comput.
Sivabal Sivaloganathan, M. Stastna, Giuseppe Tenti, James M. Drake
1998 J jnl
Appl. Math. Comput.
Sivabal Sivaloganathan, Giuseppe Tenti, James M. Drake
redb/extractors/detectiteasy.py
← Index redb/extractors/detectiteasy.py python
import inspect
from pprint import pprint
import subprocess
import json
from typing import Any
from datetime import datetime, timezone
import os
from dotenv import load_dotenv

from redb.extractors.enum import Tag
from redb.models.dataclasses import DIEinfo
from redb.extractors.extractor import Extractor

load_dotenv(override=True)

class DIEExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        precomputed_hashes=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix, elastic_index, known_benign, known_malicious,
            precomputed_hashes=precomputed_hashes
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.die_info = None
        self.die_info_dict = {}
        self.elastic_index = self.index_prefix + "-die"

    def _recursive_entry(self, die_dict, master_key):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if master_key:
            self.die_info_dict[master_key] = {}
        else:
            self.die_info_dict = {}
        for value in die_dict:
            if "type" in value:
                type_key = value["type"].lower().replace(" ", "_")
                name = value.get("name", "")
                version = f"({value.get('version')})" if value.get("version") else ""
                info = f"[{value.get('info')}]" if value.get("info") else ""

                if master_key:
                    self.die_info_dict[master_key][type_key] = f"{name}"
                    self.die_info_dict[master_key][f'{type_key}(full)'] = f"{name}{version}{info}"
                else:
                    self.die_info_dict[type_key] = f"{name}"
                    self.die_info_dict[f'{type_key}(full)'] = f"{name}{version}{info}"

            elif "parentfilepart" in value:
                child_key = (
                    value["parentfilepart"].lower().replace(" ", "_")
                    + "."
                    + value["filetype"].lower().replace(" ", "_")
                )
                if master_key:
                    self._recursive_entry(value["values"], f"{master_key}.{child_key}")
                else:
                    self._recursive_entry(value["values"], f"{child_key}")

    def _extract_dieinfo(self):
        """
        Execute a command-line binary with arguments and parse its JSON output.

        :param command: The command or path to the binary to execute
        :param args: Additional arguments to pass to the command
        :return: Parsed JSON output as a Python object
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Construct the full command
        # command = "nfdc" # UNCOMMENT FOR PROD
        # command = "/Users/p4c0/_tools/NFD.app/Contents/MacOS/nfdc" # COMMENT FOR TESTING ON MAC
        command = os.getenv("DIE_PATH")
        args = ["-durj", self.filepath]
        full_command = [command] + list(args)
        TIMEOUT = int(os.getenv("DIE_TIMEOUT", "180"))

        try:
            # Execute the command and capture its output
            result = subprocess.run(
                full_command,
                capture_output=True,
                text=True,
                check=True,
                timeout=TIMEOUT,
            )

            # Parse the JSON output
            nfdc_output = json.loads(result.stdout)

            # Extract the DIE information from the json output
            for die_entry in nfdc_output["detects"]:
                if die_entry["parentfilepart"] == "Header":
                    master_key = (
                        die_entry["parentfilepart"].lower().replace(" ", "_")
                        + "."
                        + die_entry["filetype"].lower().replace(" ", "_")
                    )
                    self._recursive_entry(die_entry["values"], None)

            # pprint(json.dumps(self.die_info_dict, indent=2)) #debug
            self.die_info = DIEinfo(result.stdout, self.die_info_dict)
            self.log.debug(f"NFDC-DIE JSON dump: todo")
        except subprocess.TimeoutExpired:
            self.log.error(f"The DIE command timed out after {TIMEOUT} seconds")
            return None
        except subprocess.CalledProcessError as e:
            self.log.error(f"Error executing DIE command: {e}")
            self.log.error(f"Command output (stderr): {e.stderr}")
            return None
        except json.JSONDecodeError as e:
            self.log.error(f"Error parsing DIE JSON output: {e}")
            self.log.error(f"Raw output: {result.stdout}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.die_info
        elif exporter_type == "ClickHouseExporter":
            # Convert DIE info to JSON string
            die_info_json = json.dumps(self.die_info_dict)
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                die_info_json,
                datetime.now(timezone.utc)
            ]]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'die_info', 'analysis_date'
            ]
            
            column_type_names = [
                'String', 'String', 'String', 'JSON', 'DateTime64(3, \'UTC\')'
            ]
            
            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_die"

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_dieinfo()
            
            # Check if there's a packer in the DIE results
            is_packed = False
            if self.die_info_dict:
                # Check if 'packer' exists in the DIE results
                is_packed = bool(self.die_info_dict.get('packer'))
            
            return self.die_info  # Return the extracted data instead of exporting directly
        except Exception as e:
            self.log.error(f"Error extracting DIE information: {e}")
            return None

    def tag(self):
        return Tag.DIEC.value