Van-Duc Nguyen

43 papers A* 9B 2C 1Journal 12Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Netw.
Minh-Duong Nguyen, Hoang-Khoi Do, Nam-Khanh Le, Nguyen Hoang Tran, Zhaohui Yang, Van-Duc Nguyen, Trinh Van Chien
2018 J jnl
Phys. Commun.
Huy-Dung Han, Dang-An Nguyen, Van-Duc Nguyen, Tien Hoa Nguyen, Muhammad Zia
2017 conf
IMCOM
Tien Hoa Nguyen, Helio Augusto Muzamane, Van-Duc Nguyen
2016 conf
IMCOM
Bach Tran, Nga Nguyen Thu, Van-Duc Nguyen, Byeungwoo Jeon
2015 conf
IMCOM
Tung Duy Ta, Duc Anh Le, Mai Thi Le, Toan Van Tran, Tuan Trong Do, Van-Duc Nguyen, Chien Van Trinh, Byeungwoo Jeon
2014 C conf
ICMV
Van-Duc Nguyen, D. T. Nguyen, Tien Dzung Nguyen, V. A. Phan, Quang Doan Truong
2013 conf
Complex Adaptive Systems
M. P. Nguyen, Quang Doan Truong, D. T. Nguyen, Tien Dzung Nguyen, Van-Duc Nguyen
2013 conf
ICCSA (1)
Khanh Quang, Van-Duc Nguyen, Trung Dung Nguyen, Hyunseung Choo
2013 J jnl
J. Comput. Networks Commun.
Khanh Nguyen Quang, Van-Duc Nguyen, Hyunseung Choo
2013 conf
ICUIMC
Trung Dung Nguyen, Van-Duc Nguyen, Thanh Tung Nguyen, Trong Hieu Pham, Ngoc Tuan Nguyen, Koichiro Wakasugi
2013 conf
ICUIMC
Tien Hoa Nguyen, Nguyen Thanh Hieu, Van-Duc Nguyen, Guillaume Gelle, Hyunseung Choo
2012 conf
ICCASA
Trung Dung Nguyen, Van-Duc Nguyen, Thanh Tung Nguyen, Van Tien Pham, Trong Hieu Pham, Koichiro Wakasugi
2012 conf
ICUIMC
Van-Duc Nguyen, Duyen Trung Ha, Van Tien Pham, Trung Dung Nguyen, Nga Nguyen Thu, Hyunseung Choo
2012 J jnl
EURASIP J. Wirel. Commun. Netw.
Thanh Tung Nguyen, Van-Duc Nguyen
2012 conf
ISSPIT
Hieu Nguyen, Van-Duc Nguyen, Tien Hoa Nguyen, Duyen Trung Ha, Thomas Kaiser
2011 conf
ICUIMC
Van-Duc Nguyen, Quoc Khanh Dinh, Manh Hung Nguyen, Van Tien Pham, Claus Kupferschmidt, Thomas Kaiser, Truong Vu Bang Giang, Tien Hoa Nguyen
2010 J jnl
Wirel. Commun. Mob. Comput.
Haixia Zhang, Dongfeng Yuan, Matthias Pätzold, Yi Wu, Van-Duc Nguyen
2009 J jnl
IEICE Trans. Commun.
Van-Duc Nguyen, Harald Haas, Kyandoghere Kyamakya, Jean Chamberlain Chedjou, Tien Hoa Nguyen, Seokho Yoon, Hyunseung Choo
2008 J jnl
Eur. Trans. Telecommun.
Van-Duc Nguyen, Hans-Peter Kuchenbecker, Seokho Yoon, Hyunseung Choo
2007 J jnl
IEICE Trans. Commun.
Van-Duc Nguyen, Matthias Pätzold, Fumiaki Maehara, Harald Haas, Minh-Viet Pham
2007 J jnl
EURASIP J. Wirel. Commun. Netw.
Van-Duc Nguyen, Hans-Peter Kuchenbecker, Harald Haas, Kyandoghere Kyamakya, Guillaume Gelle
2006 conf
VTC Spring
Ali Aassie Ali, Van-Duc Nguyen, Kyandoghere Kyamakya, A. S. Omar
2006 conf
EUSIPCO
Ali Aassie Ali, Van-Duc Nguyen, Kyandoghere Kyamakya, A. S. Omar
2006 conf
ICC
Harald Haas, Van-Duc Nguyen, Peter Omiyi, Nedko Nedev, Gunther Auer
2004 B conf
PIMRC
Matthias Pätzold, Van-Duc Nguyen
2004 conf
ICC
Van-Duc Nguyen, Hans-Peter Kuchenbecker
2002 B conf
PIMRC
Van-Duc Nguyen, Hans-Peter Kuchenbecker
2001 conf
VTC Fall
Van-Duc Nguyen, Hans-Peter Kuchenbecker
1999 conf
3DIM
Van-Duc Nguyen, Victor Nzomigni, Charles V. Stewart
1998 A* conf
CVPR
Van-Duc Nguyen, J. Alison Noble, Joseph L. Mundy, John Janning, Joseph Ross
1992 A* conf
CVPR
Joseph L. Mundy, J. Alison Noble, Constantinos Marinos, Van-Duc Nguyen, Aaron Heller, J. Farley, A. T. Tran
1992 A* conf
ECCV
J. Alison Noble, Van-Duc Nguyen, Constantinos Marinos, A. T. Tran, J. Farley, Kristina Hedengren, Joseph L. Mundy
1991 A* conf
CVPR
Van-Duc Nguyen, Joseph L. Mundy, Deepak Kapur
1989 J jnl
Int. J. Robotics Res.
Van-Duc Nguyen
1989 conf
IEA/AIE (1)
Eckart Walther, Vivek V. Badami, James B. Comly, Paul Nielsen, Van-Duc Nguyen
1988 J jnl
Artif. Intell.
Michele Barry, David Cyrluk, Deepak Kapur, Joseph L. Mundy, Van-Duc Nguyen
1988 J jnl
Int. J. Robotics Res.
Van-Duc Nguyen
1987 A* conf
ICRA
Van-Duc Nguyen
1987 A* conf
ICRA
Van-Duc Nguyen
1987 A* conf
IJCAI
Van-Duc Nguyen
1986 A* conf
ICRA
Van-Duc Nguyen
1986 conf
FJCC
Van-Duc Nguyen
1986 A* conf
ICRA
Van-Duc Nguyen
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()