Viet Nguyen

66 papers A* 9A 5C 2Misc 9Journal 24Unranked 15
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Viet Nguyen, Tuan Minh Pham, Thinh Cao, Tan Dinh, Huy Nguyen, Nhat Ho, Alessandro Rinaldo
2026 J jnl
CoRR
Tuan Minh Pham, Thinh Cao, Viet Nguyen, Huy Nguyen, Nhat Ho, Alessandro Rinaldo
2025 conf
ICECS
Peng Chen, Viet Nguyen, Hongtao Huang, Xiongchuan Huang, Feifan Hong, Pingda Guan, Robert Bogdan Staszewski
2025 C conf
ISCAS
Viet Nguyen, Robert Bogdan Staszewski
2025 J jnl
CoRR
Viet Nguyen, Vishal M. Patel
2025 A* conf
ICML
Minh Nguyen Nhat To, Paul F. R. Wilson, Viet Nguyen, Mohamed Harmanani, Michael Cooper, Fahimeh Fooladgar, Purang Abolmaesumi, Parvin Mousavi, Rahul G. Krishnan
2025 J jnl
CoRR
Minh Nguyen Nhat To, Paul F. R. Wilson, Viet Nguyen, Mohamed Harmanani, Michael Cooper, Fahimeh Fooladgar, Purang Abolmaesumi, Parvin Mousavi, Rahul G. Krishnan
2025 J jnl
CoRR
Anh Nguyen, Viet Nguyen, Duc Vu, Trung Dao, Chi Tran, Toan Tran, Anh Tran
2025 J jnl
CoRR
Viet Nguyen, Changjian Shui, Vijay Giri, Siddarth Arya, Amol Verma, Fahad Razak, Rahul G. Krishnan
2024 conf
KMIS
Viet Nguyen, Vu Bui, Thu Nguyen
2024 J jnl
CoRR
Bao Q. Tran, Viet Nguyen, Anh Tran, Toan Tran
2024 conf
ICCAIS
Tran Thien Dat Nguyen, Hoa Van Nguyen, Changbeom Shim, Viet Nguyen, Hyunjin Choi
2024 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Jonathan Ventura, Camille Pawlak, Milo Honsberger, Cameron Gonsalves, Julian Rice, Natalie L. R. Love, Skyler Han, Viet Nguyen, Keilana Sugano, Jacqueline Doremus, G. Andrew Fricker, Jenn Yost, Matt Ritter
2024 A* conf
AAAI
Viet Nguyen, Giang Vu, Tung Nguyen Thanh, Khoat Than, Toan Tran
2024 J jnl
CoRR
Viet Nguyen, Anh Nguyen, Trung Tuan Dao, Khoi Nguyen, Cuong Pham, Toan Tran, Anh Tran
2024 A* conf
NeurIPS
Vahid Balazadeh Meresht, Keertana Chidambaram, Viet Nguyen, Rahul G. Krishnan, Vasilis Syrgkanis
2024 J jnl
CoRR
Vahid Balazadeh Meresht, Keertana Chidambaram, Viet Nguyen, Rahul G. Krishnan, Vasilis Syrgkanis
2023 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Viet Nguyen, Filippo Schembari, Robert Bogdan Staszewski
2023 J jnl
CoRR
Viet Nguyen, Giang Vu, Tung Nguyen Thanh, Khoat Than, Toan Tran
2022 J jnl
IEEE J. Solid State Circuits
Viet Nguyen, Filippo Schembari, Robert Bogdan Staszewski
2022 Misc conf
AMIA
Ashley C. Griffin, Lu He, Anthony Sunjaya, Andrew King, Zubin Khan, Brian J. Douthit, Martin Nwadiugwu, Vignesh Subbian, Mark Braunstein, Viet Nguyen, Charles Jaffe, Titus Schleyer
2022 J jnl
J. Am. Medical Informatics Assoc.
Stephany Duda, Nan Kennedy, Douglas Conway, Alex C. Cheng, Viet Nguyen, Teresa Zayas-Cabán, Paul A. Harris
2022 Misc conf
AMIA
Teresa Zayas-Cabán, Belinda Seto, Robert J. Carroll, Jon Duke, Viet Nguyen
2022 J jnl
CoRR
Jonathan Ventura, Milo Honsberger, Cameron Gonsalves, Julian Rice, Camille Pawlak, Natalie L. R. Love, Skyler Han, Viet Nguyen, Keilana Sugano, Jacqueline Doremus, G. Andrew Fricker, Jenn Yost, Matt Ritter
2022 J jnl
Field Robotics
Joshua Vander Hook, William Seto, Viet Nguyen, Zaki Hasnain, Carlyn-Ann Lee, Liam Gallagher, Tyler Halpin-Chan, Varun Varahamurthy, Moises Angulo
2021 Misc conf
AMIA
Teresa Zayas-Cabán, Belinda Seto, Paul A. Harris, Allison P. Heath, Viet Nguyen
2021 conf
COMPLEX NETWORKS
Viet Nguyen, Paul Anderson, Alexis Pasulka, Theresa Migler
2021 J jnl
CoRR
Xinru Hua, Huanzhong Xu, Jose H. Blanchet, Viet Nguyen
2021 J jnl
CoRR
Jay Ahn, Hari Madhu, Viet Nguyen
2021 Misc conf
AMIA
Charles Jaffe, Steven Z. Kassakian, Viet Nguyen, Anna Taylor
2021 J jnl
CoRR
Haque Ishfaq, Qiwen Cui, Viet Nguyen, Alex Ayoub, Zhuoran Yang, Zhaoran Wang, Doina Precup, Lin F. Yang
2021 A* conf
ICML
Haque Ishfaq, Qiwen Cui, Viet Nguyen, Alex Ayoub, Zhuoran Yang, Zhaoran Wang, Doina Precup, Lin Yang
2020 J jnl
IEEE Trans. Circuits Syst.
Hongying Wang, Viet Nguyen, Filippo Schembari, Robert Bogdan Staszewski
2020 Misc conf
AMIA
Javier Silva Valencia, Stefan Escobar, Benjamin Viernes, Michael T. Watkins, Leonardo Rojas Mezarina, Viet Nguyen, Héctor Espinoza-Herrera, Damian A. Borbolla
2020 Misc conf
AMIA
Damian A. Borbolla, Catherine J. Staes, Laura K. Heermann Langford, Viet Nguyen
2020 Misc conf
AMIA
Stephanie Garcia, Thomas George Kannampallil, James L. Hellewell, Viet Nguyen, Casey Thompson
2020 conf
MIE
Michael T. Watkins, Benjamin Viernes, Viet Nguyen, Leonardo Rojas Mezarina, Javier Silva Valencia, Damian Borbolla
2020 A conf
MobiSys
Mohamed Ibrahim, Ali Rostami, Bo Yu, Hansi Liu, Minitha Jawahar, Viet Nguyen, Marco Gruteser, Fan Bai, Richard E. Howard
2019 conf
EBCCSP
Jakub Szyduczynski, Viet Nguyen, Filippo Schembari, Robert Bogdan Staszewski, Dariusz Koscielnik, Marek Miskowicz
2019 Misc conf
AMIA
Anne Smith, Lisa Anderson, Robert Samples, Viet Nguyen
2019 Misc conf
SenSys
Viet Nguyen, Siddharth Rupavatharam, Luyang Liu, Richard E. Howard, Marco Gruteser
2018 A* conf
MobiCom
Viet Nguyen, Mohamed Ibrahim, Hoang Truong, Phuc Nguyen, Marco Gruteser, Richard E. Howard, Tam Vu
2018 A* conf
INFOCOM
Viet Nguyen, Mohamed Ibrahim, Siddharth Rupavatharam, Minitha Jawahar, Marco Gruteser, Richard E. Howard
2018 A* conf
MobiCom
Mohamed Ibrahim, Hansi Liu, Minitha Jawahar, Viet Nguyen, Marco Gruteser, Richard E. Howard, Bo Yu, Fan Bai
2017 conf
EBCCSP
Viet Nguyen, Filippo Schembari, Robert Bogdan Staszewski
2017 conf
IPSN
Shubham Jain, Viet Nguyen, Marco Gruteser, Paramvir Bahl
2017 ed.
VLCS@MobiCom
Marco Gruteser, Wenjun Hu, Viet Nguyen
2017 conf
SWCN@EMNLP
Viet Nguyen, Julian Brooke, Timothy Baldwin
2017 conf
S3@MobiCom
Hoang Truong, Phuc Nguyen, Viet Nguyen, Mohamed Ibrahim, Richard E. Howard, Marco Gruteser, Tam Vu
2016 A* conf
INFOCOM
Viet Nguyen, Yaqin Tang, Ashwin Ashok, Marco Gruteser, Kristin J. Dana, Wenjun Hu, Eric Wengrowski, Narayan B. Mandayam
2016 conf
VLCS@MobiCom
Mohamed Ibrahim, Viet Nguyen, Siddharth Rupavatharam, Minitha Jawahar, Marco Gruteser, Richard E. Howard
2014 conf
VLCS@MobiCom
Ashwin Ashok, Viet Nguyen, Marco Gruteser, Narayan B. Mandayam, Wenjia Yuan, Kristin J. Dana
2014 J jnl
GetMobile Mob. Comput. Commun.
Viet Nguyen, Marco Gruteser
2014 conf
GI-Jahrestagung
Mandy Keck, Martin Herrmann, Dana Henkens, Severin Taranko, Viet Nguyen, Fred Funke, Steffi Schattenberg, Andreas Both, Rainer Groh
2008
Viet Nguyen
2008 conf
EUROS
Viet Nguyen, Roland Siegwart
2007 J jnl
Auton. Robots
Viet Nguyen, Stefan Gächter, Agostino Martinelli, Nicola Tomatis, Roland Siegwart
2007 A conf
IROS
Viet Nguyen, Ahad Harati, Roland Siegwart
2007 J jnl
Robotics Auton. Syst.
Agostino Martinelli, Viet Nguyen, Nicola Tomatis, Roland Siegwart
2007 J jnl
Robotics Auton. Syst.
Shrihari Vasudevan, Stefan Gächter, Viet Nguyen, Roland Siegwart
2006 A conf
IROS
Viet Nguyen, Agostino Martinelli, Roland Siegwart
2006 A conf
IROS
Viet Nguyen, Ahad Harati, Agostino Martinelli, Roland Siegwart, Nicola Tomatis
2006 C conf
ICVS
Stefan Gächter, Viet Nguyen, Roland Siegwart
2005 A conf
IROS
Viet Nguyen, Agostino Martinelli, Nicola Tomatis, Roland Siegwart
2005 A* conf
ICRA
Viet Nguyen, Agostino Martinelli, Roland Siegwart
2004 conf
CSCLP
Viet Nguyen, Djamila Sam-Haroud, Boi Faltings
redb/extractors/elf_extractors/elf_notes.py
← Index redb/extractors/elf_extractors/elf_notes.py python
import inspect
import binascii
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFNote


class ELFNotesExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_notes = []
        self.elastic_index = self.index_prefix + "-elf_notes"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _get_note_type_string(self, note_type: int, note_name: str) -> str:
        """Convert note type number to human-readable string."""

        # GNU-specific note types
        if note_name == "GNU":
            gnu_types = {
                1: "NT_GNU_ABI_TAG",
                2: "NT_GNU_HWCAP",
                3: "NT_GNU_BUILD_ID",
                4: "NT_GNU_GOLD_VERSION",
                5: "NT_GNU_PROPERTY_TYPE_0"
            }
            return gnu_types.get(note_type, f"NT_GNU_UNKNOWN_{note_type}")

        # Generic note types
        generic_types = {
            1: "NT_PRSTATUS",
            2: "NT_FPREGSET",
            3: "NT_PRPSINFO",
            4: "NT_TASKSTRUCT",
            5: "NT_AUXV",
            6: "NT_PSTATUS",
            7: "NT_FPREGS",
            8: "NT_PSINFO",
            9: "NT_PRCRED",
            10: "NT_UTSNAME",
            11: "NT_LWPSTATUS",
            12: "NT_LWPSINFO",
            13: "NT_PRFPXREG"
        }

        return generic_types.get(note_type, f"NT_UNKNOWN_{note_type}")

    def _format_note_description(self, note_desc, note_type: int, note_name: str) -> str:
        """Format note description based on type for human readability."""
        try:
            if not note_desc:
                return ""

            # Handle build ID specifically (common case)
            if note_name == "GNU" and note_type == 3:  # NT_GNU_BUILD_ID
                if isinstance(note_desc, bytes):
                    return binascii.hexlify(note_desc).decode('ascii')
                return str(note_desc)

            # Handle ABI tag
            if note_name == "GNU" and note_type == 1:  # NT_GNU_ABI_TAG
                if isinstance(note_desc, bytes) and len(note_desc) >= 16:
                    # ABI tag contains OS, major, minor, subminor
                    import struct
                    try:
                        os_val, major, minor, subminor = struct.unpack('<IIII', note_desc[:16])
                        os_names = {0: "Linux", 1: "GNU", 2: "Solaris", 3: "FreeBSD"}
                        os_name = os_names.get(os_val, f"OS_{os_val}")
                        return f"{os_name} {major}.{minor}.{subminor}"
                    except:
                        pass

            # For binary data, convert to hex
            if isinstance(note_desc, bytes):
                # Limit size for very large descriptions
                if len(note_desc) > 256:
                    return binascii.hexlify(note_desc[:256]).decode('ascii') + "..."
                return binascii.hexlify(note_desc).decode('ascii')

            # For string data
            if isinstance(note_desc, str):
                return note_desc

            # Fallback
            return str(note_desc)

        except Exception as e:
            self.log.error(f"Error formatting note description: {e}")
            return str(note_desc) if note_desc else ""

    def _extract_note_data(self, note, section_name: str) -> ELFNote:
        """Extract data from a single note entry."""
        try:
            # Get note properties
            note_name = note.get('n_name', '').rstrip('\x00') if note.get('n_name') else ""
            note_type_raw = note.get('n_type', 0)
            note_desc_raw = note.get('n_desc', b'')

            # Handle note_type - pyelftools may return string or int
            if isinstance(note_type_raw, str):
                # pyelftools returned the type as a string like 'NT_GNU_BUILD_ID'
                note_type_str = note_type_raw
                # Map known string types to integers
                note_type_map = {
                    'NT_GNU_ABI_TAG': 1,
                    'NT_GNU_HWCAP': 2,
                    'NT_GNU_BUILD_ID': 3,
                    'NT_GNU_GOLD_VERSION': 4,
                    'NT_GNU_PROPERTY_TYPE_0': 5,
                    'NT_PRSTATUS': 1,
                    'NT_FPREGSET': 2,
                    'NT_PRPSINFO': 3,
                    'NT_TASKSTRUCT': 4,
                    'NT_AUXV': 5,
                    'NT_PSTATUS': 6,
                    'NT_FPREGS': 7,
                    'NT_PSINFO': 8,
                    'NT_PRCRED': 9,
                    'NT_UTSNAME': 10,
                    'NT_LWPSTATUS': 11,
                    'NT_LWPSINFO': 12,
                    'NT_PRFPXREG': 13,
                }
                note_type = note_type_map.get(note_type_raw, 0)
            else:
                note_type = note_type_raw
                # Get human-readable type string
                note_type_str = self._get_note_type_string(note_type, note_name)

            # Format description
            note_desc = self._format_note_description(note_desc_raw, note_type, note_name)

            return ELFNote(
                note_name=note_name,
                note_type=note_type,
                note_type_str=note_type_str,
                note_desc=note_desc,
                note_section=section_name
            )

        except Exception as e:
            self.log.error(f"Error extracting note data: {e}")
            return None

    def _extract_notes_from_sections(self, elf) -> List[Dict]:
        """Extract notes from note sections."""
        notes = []

        try:
            # Look for note sections
            for section in elf.iter_sections():
                if (section.name and
                    section.name.startswith('.note') and
                    hasattr(section, 'iter_notes')):

                    section_name = section.name
                    try:
                        for note in section.iter_notes():
                            note_data = self._extract_note_data(note, section_name)
                            if note_data:
                                notes.append(note_data)
                    except Exception as e:
                        self.log.debug(f"Could not process notes in section {section_name}: {e}")

        except Exception as e:
            self.log.error(f"Error extracting notes from sections: {e}")

        return notes

    def _extract_notes_from_segments(self, elf) -> List[Dict]:
        """Extract notes from PT_NOTE segments."""
        notes = []

        try:
            # Look for PT_NOTE segments
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_NOTE':
                    segment_name = f"PT_NOTE_segment_{segment.header.get('p_offset', 0)}"

                    try:
                        if hasattr(segment, 'iter_notes'):
                            for note in segment.iter_notes():
                                note_data = self._extract_note_data(note, segment_name)
                                if note_data:
                                    notes.append(note_data)
                    except Exception as e:
                        self.log.debug(f"Could not process notes in segment: {e}")

        except Exception as e:
            self.log.error(f"Error extracting notes from segments: {e}")

        return notes

    def tag(self):
        return Tag.ELF_NOTES.value if hasattr(Tag, 'ELF_NOTES') else "elf_notes"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_notes = []

                # Extract notes from note sections
                section_notes = self._extract_notes_from_sections(elf)
                all_notes.extend(section_notes)

                # Extract notes from PT_NOTE segments
                segment_notes = self._extract_notes_from_segments(elf)
                all_notes.extend(segment_notes)

                # Remove duplicates (same note might appear in section and segment)
                unique_notes = []
                seen_notes = set()
                for note in all_notes:
                    note_key = (note.note_name, note.note_type, note.note_desc)
                    if note_key not in seen_notes:
                        seen_notes.add(note_key)
                        unique_notes.append(note)

                return unique_notes

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_notes = result
            return self.elf_notes

        except Exception as e:
            self.log.error(f"Error extracting ELF notes {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_notes
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no notes found
                # None is reserved for actual errors

                # Prepare data arrays for all notes
                data = []
                current_time = datetime.now(timezone.utc)
                for note in self.elf_notes:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        note.note_name,
                        note.note_type,
                        note.note_type_str,
                        note.note_desc,
                        note.note_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'note_name', 'note_type', 'note_type_str',
                    'note_desc', 'note_section',
                    'analysis_date'
                ]

                if not data:
                    return None

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt32', 'LowCardinality(String)',
                    'String CODEC(ZSTD(3))', 'LowCardinality(String)',
                    'DateTime64(3, \'UTC\')'
                ]

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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