Rameshwar Dubey

41 papers Journal 39Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
Ann. Oper. Res.
Rameshwar Dubey, Pierre-Luc Fournier, Daniel Jugend, David J. Bryde, Gary Graham, Cyril Foropon
2024 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, Anand Jeyaraj, Laurie Hughes, Gareth H. Davies, Manju Ahuja, Mousa Ahmed Albashrawi, Adil S. Al-Busaidi, Salah A. Al-Sharhan, Khalid Ibrahim Al-Sulaiti, Levent Altinay, Shem Amalaya, Sunil Archak, María Teresa Ballestar, Shonil A. Bhagwat, Anandhi Bharadwaj, Amit Bhushan, Indranil Bose, Pawan Budhwar, Deborah Bunker, Alexandru Capatina, Lemuria D. Carter, Ioanna D. Constantiou, Crispin R. Coombs, Tom Crick, Csaba Csáki, Yves Darnige, Rahul Dé, Rick Delbridge, Rameshwar Dubey, Robin Gauld, Ravikumar Gutti, Marié Hattingh, Arve Haug, Leeya Hendricks, Airo Hino, Cathy H. C. Hsu, Netta Iivari, Marijn Janssen, Ikram Jebabli, Paul Jones, Iris A. Junglas, Abhishek Kaushik, Deepak Khazanchi, Mitsuru Kodama, Sascha Kraus, Vikram Kumar, Christian Maier, F. Tegwen Malik, Machdel Matthee, Ian P. McCarthy, Marco Meier, Bhimaraya A. Metri, Adrian Micu, Angela-Eliza Micu, Santosh K. Misra, Anubhav Mishra, Tonja Molin-Juustila, Leif Oppermann, Nicholas O'Regan, Abhipsa Pal, Neeraj Pandey, Ilias O. Pappas, Andrew Parker, Kavita Pathak, Daniel A. Pienta, Ariana Polyviou, Ramakrishnan Raman, Samuel Ribeiro-Navarrete, Paavo Ritala, Michael Rosemann, Suprateek Sarker, Pallavi Saxena, Daniel Schlagwein, Hergen Schultze, Chitra Sharma, Sujeet Kumar Sharma, Antonis C. Simintiras, Vinay Kumar Singh, Hanlie Smuts, John Soldatos, Manoj Kumar Tiwari, Jason Bennett Thatcher, Cristina Vanberghen, Ákos Varga, Polyxeni Vassilakopoulou, Viswanath Venkatesh, Giampaolo Viglia, Tim Vorley, Michael R. Wade, Paul Walton
2024 J jnl
Ann. Oper. Res.
Rameshwar Dubey, David J. Bryde, Cyril Foropon
2024 J jnl
J. Enterp. Inf. Manag.
Rameshwar Dubey, Angappa Gunasekaran, Cyril R. H. Foropon
2024 J jnl
Ann. Oper. Res.
Rameshwar Dubey, David J. Bryde, Gary Graham, Cyril Foropon, Sushma Kumari, Omprakash K. Gupta
2023 J jnl
Int. J. Inf. Manag.
Rameshwar Dubey, Manjul Gupta, Patrick Mikalef, Shahriar Akter
2023 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, Nir Kshetri, Laurie Hughes, Emma L. Slade, Anand Jeyaraj, Arpan Kumar Kar, Abdullah M. Baabdullah, Alex Koohang, Vishnupriya Raghavan, Manju Ahuja, Hanaa Albanna, Mousa Ahmad Albashrawi, Adil S. Al-Busaidi, Janarthanan Balakrishnan, Yves Barlette, Sriparna Basu, Indranil Bose, Laurence D. Brooks, Dimitrios Buhalis, Lemuria D. Carter, Soumyadeb Chowdhury, Tom Crick, Scott W. Cunningham, Gareth H. Davies, Robert M. Davison, Rahul De', Denis Dennehy, Yanqing Duan, Rameshwar Dubey, Rohita Dwivedi, John S. Edwards, Carlos Flavián, Robin Gauld, Varun Grover, Mei-Chih Hu, Marijn Janssen, Paul Jones, Iris A. Junglas, Sangeeta Khorana, Sascha Kraus, Kai R. Larsen, Paul Latreille, Sven Laumer, F. Tegwen Malik, Abbas Mardani, Marcello Mariani, Sunil Mithas, Emmanuel Mogaji, Jeretta Horn Nord, Siobhán O'Connor, Fevzi Okumus, Margherita Pagani, Neeraj Pandey, Savvas Papagiannidis, Ilias O. Pappas, Nishith Pathak, Jan Pries-Heje, Ramakrishnan Raman, Nripendra P. Rana, Sven-Volker Rehm, Samuel Ribeiro-Navarrete, Alexander Richter, Frantz Rowe, Suprateek Sarker, Bernd Carsten Stahl, Manoj Kumar Tiwari, Wil M. P. van der Aalst, Viswanath Venkatesh, Giampaolo Viglia, Michael R. Wade, Paul Walton, Jochen Wirtz, Ryan T. Wright
2023 J jnl
Ind. Manag. Data Syst.
Rameshwar Dubey
2022 J jnl
Ann. Oper. Res.
Rameshwar Dubey, David J. Bryde, Cyril R. H. Foropon, Gary Graham, Mihalis Giannakis, Deepa Mishra
2022 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, David Laurie Hughes, Arpan Kumar Kar, Abdullah M. Baabdullah, Purva Grover, Roba Abbas, Daniela Andreini, Iyad Abumoghli, Yves Barlette, Deborah Bunker, Leona Chandra Kruse, Ioanna D. Constantiou, Robert M. Davison, Rahul De', Rameshwar Dubey, Henry Fenby-Taylor, Babita Gupta, Wu He, Mitsuru Kodama, Matti Mäntymäki, Bhimaraya A. Metri, Katina Michael, Johan Olaisen, Niki Panteli, Samuli Pekkola, Rohit Nishant, Ramakrishnan Raman, Nripendra P. Rana, Frantz Rowe, Suprateek Sarker, Brenda Scholtz, Maung Sein, Jeel Dharmeshkumar Shah, Thompson S. H. Teo, Manoj Kumar Tiwari, Morten Thanning Vendelø, Michael R. Wade
2022 J jnl
Ann. Oper. Res.
Rameshwar Dubey
2022 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, David Laurie Hughes, Christy M. K. Cheung, Kieran Conboy, Yanqing Duan, Rameshwar Dubey, Marijn Janssen, Paul Jones, Marianna Sigala, Giampaolo Viglia
2022 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, David Laurie Hughes, Abdullah M. Baabdullah, Samuel Ribeiro-Navarrete, Mihalis Giannakis, Mutaz M. Al-Debei, Denis Dennehy, Bhimaraya A. Metri, Dimitrios Buhalis, Christy M. K. Cheung, Kieran Conboy, Ronan Doyle, Rameshwar Dubey, Vincent Dutot, Reto Felix, D. P. Goyal, Anders Gustafsson, Chris Hinsch, Ikram Jebabli, Marijn Janssen, Young-Gab Kim, Jooyoung Kim, Stefan Koos, David Kreps, Nir Kshetri, Vikram Kumar, Keng-Boon Ooi, Savvas Papagiannidis, Ilias O. Pappas, Ariana Polyviou, Sang-Min Park, Neeraj Pandey, Maciel Manoel Queiroz, Ramakrishnan Raman, Philipp A. Rauschnabel, Anuragini Shirish, Marianna Sigala, Konstantina Spanaki, Garry Wei-Han Tan, Manoj Kumar Tiwari, Giampaolo Viglia, Samuel Fosso Wamba
2022 J jnl
Ann. Oper. Res.
Mihalis Giannakis, Rameshwar Dubey, Shishi Yan, Konstantina Spanaki, Thanos Papadopoulos
2021 J jnl
Int. J. Prod. Res.
Rameshwar Dubey, David J. Bryde, Cyril R. H. Foropon, Manisha Tiwari, Yogesh Dwivedi, Sarah Schiffling
2021 J jnl
Int. J. Prod. Res.
Rameshwar Dubey, Angappa Gunasekaran, Stephen J. Childe, Samuel Fosso Wamba, David Roubaud, Cyril R. H. Foropon
2020 J jnl
Int. J. Prod. Res.
Rameshwar Dubey, Angappa Gunasekaran, David J. Bryde, Yogesh K. Dwivedi, Thanos Papadopoulos
2020 J jnl
Ann. Oper. Res.
K. T. Shibin, Rameshwar Dubey, Angappa Gunasekaran, Benjamin T. Hazen, David Roubaud, Shivam Gupta, Cyril R. H. Foropon
2020 J jnl
Ann. Oper. Res.
Rameshwar Dubey, Angappa Gunasekaran, Stephen J. Childe, Thanos Papadopoulos, Zongwei Luo, David Roubaud
2019 J jnl
J. Enterp. Inf. Manag.
Mihalis Giannakis, Konstantina Spanaki, Rameshwar Dubey
2019 J jnl
IEEE Trans. Engineering Management
Rameshwar Dubey, Angappa Gunasekaran, Stephen J. Childe, Thanos Papadopoulos, Constantin Blome, Zongwei Luo
2019 J jnl
Ann. Oper. Res.
Rameshwar Dubey, Angappa Gunasekaran, Thanos Papadopoulos
2019 J jnl
Ann. Oper. Res.
Rameshwar Dubey, Nezih Altay, Constantin Blome
2018 J jnl
Ann. Oper. Res.
Samuel Fosso Wamba, Angappa Gunasekaran, Rameshwar Dubey, Eric W. T. Ngai
2018 J jnl
Int. J. Prod. Res.
Angappa Gunasekaran, Rameshwar Dubey, Samuel Fosso Wamba, Thanos Papadopoulos, Benjamin T. Hazen, Eric W. T. Ngai
2018 J jnl
Int. J. Prod. Res.
Rameshwar Dubey, Angappa Gunasekaran, Stephen J. Childe, Thanos Papadopoulos, Benjamin T. Hazen, David Roubaud
2018 J jnl
Int. J. Prod. Res.
Mihalis Giannakis, Desmond Doran, Darren Mee, Thanos Papadopoulos, Rameshwar Dubey
2017 J jnl
Bus. Process. Manag. J.
Deepa Mishra, Zongwei Luo, Shan Jiang, Thanos Papadopoulos, Rameshwar Dubey
2017 J jnl
Bus. Process. Manag. J.
Anindya Chakrabarty, Zongwei Luo, Rameshwar Dubey, Shan Jiang
2017 J jnl
Electron. Mark.
Eric W. T. Ngai, Angappa Gunasekaran, Samuel Fosso Wamba, Shahriar Akter, Rameshwar Dubey
2017 J jnl
Int. J. Bus. Inf. Syst.
Vinay Singh, R. R. K. Sharma, Thanos Papadopoulos, Rameshwar Dubey
2017 J jnl
Ann. Oper. Res.
Akash Tayal, Angappa Gunasekaran, Surya Prakash Singh, Rameshwar Dubey, Thanos Papadopoulos
2017 J jnl
Int. J. Prod. Res.
Steven Ji-Fan Ren, Samuel Fosso Wamba, Shahriar Akter, Rameshwar Dubey, Stephen J. Childe
2017 J jnl
Int. J. Comput. Integr. Manuf.
Rameshwar Dubey, Angappa Gunasekaran, Anindya Chakrabarty
2016 J jnl
Comput. Ind. Eng.
Angappa Gunasekaran, Manoj Kumar Tiwari, Rameshwar Dubey, Samuel Fosso Wamba
2016 J jnl
Ind. Manag. Data Syst.
Deepa Mishra, Angappa Gunasekaran, Stephen J. Childe, Thanos Papadopoulos, Rameshwar Dubey, Samuel Fosso Wamba
2015 J jnl
Bus. Process. Manag. J.
Rameshwar Dubey
2015 conf
DSDIS
Rameshwar Dubey, Zongwei Luo, Meiling Xu, Samuel Fosso Wamba
2013 conf
SocProS (2)
V. G. Venkatesh, Rameshwar Dubey, Sadia Samar Ali
2012 J jnl
Int. J. Adv. Oper. Manag.
Rameshwar Dubey, Tripti Singh
2011 J jnl
Int. J. Strateg. Decis. Sci.
Omprakash K. Gupta, Sadia Samar Ali, Rameshwar Dubey
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..utils.hashes import calculate_md5, calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_md5, calculate_sha256


class CFGAnalysis:
    def __init__(self, function):
        self.function = function

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"