Kamred Udham Singh

33 papers Journal 29Unranked 4
YearRankTypeTitle / Venue / Authors
2026 J jnl
Int. J. Comput. Intell. Syst.
Manvi Bohra, Kamred Udham Singh, Indrajeet Kumar, Mohd Asif Shah
2025 J jnl
IEEE Trans. Consumer Electron.
Soumya Ranjan Jeyakumar, Mohammad Zia Ur Rahman, Deepak Kumar Sinha, P. Rajendra Kumar, Vrince Vimal, Kamred Udham Singh, Thalakola Syamsundararao, J. N. V. R. Swarup Kumar, Balajee Jeyakumar
2025 J jnl
Entertain. Comput.
Rajesh Kedarnath Navandar, Syed Hamid Hasan, Netaji Jadhav, Kamred Udham Singh, R. Monisha, N. Venkatram
2025 J jnl
IEEE Internet Things J.
Manvi Bohra, Kamred Udham Singh, Indrajeet Kumar, Shashank Mishra
2025 J jnl
J. Cloud Comput.
Neetesh Kumar Nema, Vivek Shukla, Rohit Miri, Praveen Chouksey, Rohit Raja, Kamred Udham Singh, Ankit Kumar, Mohd Asif Shah
2025 J jnl
Int. J. Comput. Intell. Syst.
Arun Kumar Singh, Bireshwar Dass Mazumdar, Rohit Raja, Kamred Udham Singh, Ankit Kumar, Mohd Asif Shah
2024 J jnl
Int. J. Bifurc. Chaos
Teekam Singh, Mukesh Kumar, Kamred Udham Singh, Mamta Barik, Sudipa Chauhan
2024 J jnl
Sensors
Anurag Sinha, Turki Aljrees, Saroj Kumar Pandey, Ankit Kumar, Pallab Banerjee, Biresh Kumar, Kamred Udham Singh, Teekam Singh, Pooja Jha
2023 J jnl
Big Data Min. Anal.
Ankit Kumar, Kamred Udham Singh, Manish Kumar
2023 J jnl
IEEE Access
Biresh Kumar, Sharmistha Roy, Kamred Udham Singh, Saroj Kumar Pandey, Ankit Kumar, Anurag Sinha, Shubham Shukla, Mohd Asif Shah, Adil Rasool
2023 J jnl
Innov. Syst. Softw. Eng.
Ankit Kumar, Surbhi Bhatia, Rajat Bhardwaj, Kamred Udham Singh, Neeraj Varshney, Linesh Raja
2023 J jnl
PeerJ Comput. Sci.
Shakila Basheer, Kamred Udham Singh, Vandana Sharma, Surbhi Bhatia, Nilesh Pande, Ankit Kumar
2023 conf
ISIC
Kamred Udham Singh, Ankit Kumar, Gaurav Kumar, Teekam Singh, Tanupriya Choudhury, Ketan Kotecha
2023 conf
ISIC
Kamred Udham Singh, Ankit Kumar, Gaurav Kumar, Teekam Singh, Tanupriya Choudhury, Ketan Kotecha
2023 J jnl
Sensors
Turki Aljrees, Ankit Kumar, Kamred Udham Singh, Teekam Singh
2023 J jnl
Symmetry
Shivam, Turki Aljrees, Teekam Singh, Neeraj Varshney, Mukesh Kumar, Kamred Udham Singh, Vrince Vimal
2023 conf
ISIC
Ankit Kumar, Kamred Udham Singh, Gaurav Kumar, Teekam Singh, Tanupriya Choudhury, Ketan Kotecha
2023 J jnl
Big Data Min. Anal.
Ankit Kumar, Neeraj Varshney, Surbhi Bhatiya, Kamred Udham Singh
2022 J jnl
IEEE Access
Kamred Udham Singh, Surbhi Bhatia, Ankit Kumar, Sandeep Kautish, Adarsh Kumar, Shakila Basheer, Alaa Ali Hameed
2022 J jnl
IEEE Access
Sanjay Chakraborty, Hrithik Paul, Sayani Ghatak, Saroj Kumar Pandey, Ankit Kumar, Kamred Udham Singh, Mohd Asif Shah
2022 J jnl
J. Univers. Comput. Sci.
Lalan Kumar, Kamred Udham Singh
2022 J jnl
Expert Syst. J. Knowl. Eng.
Abhishek Kumar, Jyoti Rawat, Indrajeet Kumar, Mamoon Rashid, Kamred Udham Singh, Yasser D. Al-Otaibi, Usman Tariq
2022 J jnl
Cogn. Comput.
Indrajeet Kumar, Abhishek Kumar, Visvam Devadoss Ambeth Kumar, Ramani Kannan, Vrince Vimal, Kamred Udham Singh, Mufti Mahmud
2022 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Indrajeet Kumar, Chandradeep Bhatt, Kamred Udham Singh
2022 J jnl
Multim. Tools Appl.
Kamred Udham Singh, Akshay Kumar, Teekam Singh, Mangey Ram
2022 J jnl
IEEE Access
Kamred Udham Singh, Lalan Kumar, Surbhi Bhatia, Ankit Kumar, Alhanof Khalid Almutairi, Mohd Asif Shah
2022 J jnl
ACM Journal on Computing and Cultural Heritage
Abhishek Kumar, Ankit Kumar, Linesh Raja, Kamred Udham Singh
2022 J jnl
J. Univers. Comput. Sci.
Vijay Krishna Pallaw, Kamred Udham Singh
2021 J jnl
Comput. Intell.
Vrince Vimal, Teekam Singh, Shamimul Qamar, Bhaskar Nautiyal, Kamred Udham Singh, Abhishek Kumar
2021 J jnl
IEEE Syst. J.
Vrince Vimal, Kamred Udham Singh, Abhishek Kumar, Sachin Kumar Gupta, Mamoon Rashid, R. K. Saket, Sanjeevikumar Padmanaban
2021 J jnl
Traitement du Signal
Ankit Kumar, Kamred Udham Singh, Linesh Raja, Teekam Singh, Chetan Swarup, Abhishek Kumar
2021 conf
SocialSec
Ankit Kumar, Kamred Udham Singh, Sun-Yuan Hsieh, Visvam Devadoss Ambeth Kumar, Abhishek Kumar
2021 J jnl
Multim. Syst.
Chandradeep Bhatt, Indrajeet Kumar, V. Vijayakumar, Kamred Udham Singh, Abhishek Kumar
redb/extractors/decompiler/apk/smali_normalization.py
← Index redb/extractors/decompiler/apk/smali_normalization.py python
"""Semantic normalization of Dalvik/smali instructions.

Analogous to Binary Ninja's LLIL normalization: strips register allocation
noise and instruction encoding variants while preserving semantic operations.

Three normalization levels (most aggressive to most detailed):
  - 'category':    semantic category only (MOV, ALU, CALL, ...)
  - 'opcode':      base opcode, width-invariant (add, sub, invoke, ...)
  - 'opcode_api':  opcode category + API method/field references for
                   invoke/field/alloc instructions (default for MinHash)

References:
  - Smali+ 12-category reduction (Canfora et al.)
  - MOSDroid opcode family grouping
  - DroidSIFT/DroidSim API-sensitive similarity
"""

import re
from typing import List

# ---------------------------------------------------------------------------
# Dalvik opcode -> semantic category mapping
# ---------------------------------------------------------------------------
# Prefix-matched against instruction opcodes. Order matters for overlapping
# prefixes (longer/more-specific prefixes should come first in iteration,
# but since we use startswith and break on first match, we order by
# specificity within the list).

OPCODE_CATEGORIES = {
    # Arithmetic/logic
    "add": "ALU", "sub": "ALU", "mul": "ALU", "div": "ALU",
    "rem": "ALU", "and": "ALU", "or": "ALU", "xor": "ALU",
    "shl": "ALU", "shr": "ALU", "ushr": "ALU", "neg": "ALU",
    "not": "ALU",
    # Data movement
    "move": "MOV", "const": "CONST",
    # Memory access (field/array)
    "iget": "LOAD", "sget": "LOAD", "aget": "LOAD",
    "iput": "STORE", "sput": "STORE", "aput": "STORE",
    # Invocations
    "invoke": "CALL",
    # Control flow
    "if": "BRANCH", "goto": "JMP",
    "switch": "SWITCH",
    "return": "RET",
    # Object/type
    "new": "ALLOC", "check": "TYPE", "instance": "TYPE",
    # Array
    "fill": "ARR", "array": "ARR",
    # Comparison
    "cmpl": "CMP", "cmpg": "CMP", "cmp": "CMP",
    # Exception / synchronization
    "throw": "EXC", "monitor": "SYNC",
    # Conversion (int-to-long, float-to-int, etc.)
    "int-to": "CONV", "long-to": "CONV", "float-to": "CONV",
    "double-to": "CONV",
}

# Pre-compiled regexes for operand extraction
_METHOD_REF_RE = re.compile(r"(L[\w/$]+;->[\w<>]+\(.*?\)[\w/$;\[]*)")
_FIELD_REF_RE = re.compile(r"(L[\w/$]+;->[\w]+:[\w/$;\[]+)")
_CLASS_REF_RE = re.compile(r"(L[\w/$]+;)")
_CONST_STRING_RE = re.compile(r'^const-string(?:/jumbo)?\s')


def categorize_opcode(opcode: str) -> str:
    """Map a Dalvik opcode to its semantic category.

    Prefix-matched: 'add-int/2addr' matches 'add' -> 'ALU'.
    Returns 'OTHER' for unrecognized opcodes.
    """
    for prefix, cat in OPCODE_CATEGORIES.items():
        if opcode.startswith(prefix):
            return cat
    return "OTHER"


# Mapping from semantic categories to the ACFG feature vector indices
# used by Binary Ninja's build_block_features (cfg_features.py).
# This enables cross-platform ACFG feature comparison.
CATEGORY_TO_ACFG_INDEX = {
    "ALU": 0,       # CAT_ARITHMETIC
    "CONV": 0,      # arithmetic-adjacent
    "CMP": 4,       # CAT_COMPARISON
    "MOV": 2,       # CAT_TRANSFER
    "CONST": 2,     # transfer-adjacent (loading constants)
    "LOAD": 5,      # CAT_MEMORY
    "STORE": 5,     # CAT_MEMORY
    "CALL": 3,      # CAT_CALL
    "BRANCH": 1,    # CAT_LOGIC (conditional logic)
    "JMP": 1,       # CAT_LOGIC
    "SWITCH": 1,    # CAT_LOGIC
    "RET": 2,       # CAT_TRANSFER
    "ALLOC": 5,     # CAT_MEMORY (heap allocation)
    "TYPE": 6,      # CAT_OTHER
    "ARR": 5,       # CAT_MEMORY
    "EXC": 6,       # CAT_OTHER
    "SYNC": 6,      # CAT_OTHER
    "OTHER": 6,     # CAT_OTHER
}


def normalize_instruction(line: str, level: str = "opcode_api") -> str:
    """Normalize a single smali instruction line.

    Args:
        line: A single smali instruction (whitespace-stripped).
        level: Normalization level:
            'category'   - most aggressive: just semantic category
            'opcode'     - base opcode only, width/addressing-mode invariant
            'opcode_api' - category + API references for invoke/field/alloc
                          (default, best for MinHash similarity)

    Returns:
        Normalized instruction string, or empty string for non-instructions.
    """
    stripped = line.strip()
    if not stripped:
        return ""

    parts = stripped.split(None, 1)
    opcode = parts[0]
    operands = parts[1] if len(parts) > 1 else ""

    if level == "category":
        return categorize_opcode(opcode)

    if level == "opcode":
        # Strip type/width suffixes for invariance:
        # add-int, add-long, add-float -> 'add'
        # add-int/2addr -> 'add'
        base = re.split(r"[-/]", opcode)[0]
        return base

    if level == "opcode_api":
        # const-string: preserve string content (encrypted strings are a
        # key malware indicator)
        if _CONST_STRING_RE.match(stripped):
            # Extract the string literal
            str_match = re.search(r'"(.*)"', operands)
            if str_match:
                return f"CONST_STR \"{str_match.group(1)}\""
            return "CONST_STR"

        # invoke-*: preserve method reference
        if opcode.startswith("invoke"):
            ref = _METHOD_REF_RE.search(operands)
            if ref:
                return f"CALL {ref.group(1)}"
            return "CALL"

        # Field access: preserve field reference
        if opcode.startswith(("iget", "iput", "sget", "sput")):
            ref = _FIELD_REF_RE.search(operands)
            if ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {ref.group(1)}"
            # Fallback: try space-separated format from androguard
            # e.g. "iget v0, p0, Lcom/Foo;->field Ljava/lang/String;"
            space_ref = re.search(
                r"(L[\w/$]+;->[\w]+)\s+([\w/$;\[]+)", operands
            )
            if space_ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {space_ref.group(1)}:{space_ref.group(2)}"
            cat = "LOAD" if "get" in opcode else "STORE"
            return cat

        # new-instance: preserve allocated type
        if opcode.startswith("new-instance") or opcode == "new-array":
            ref = _CLASS_REF_RE.search(operands)
            if ref:
                return f"ALLOC {ref.group(1)}"
            return "ALLOC"

        # Everything else: just the category
        return categorize_opcode(opcode)

    # Unknown level: return raw opcode
    return opcode


def normalize_method_body(
    body: str, level: str = "opcode_api"
) -> List[str]:
    """Normalize all instructions in a smali method body.

    Filters out directives (.), labels (:), comments (#), and blank lines.
    Returns a list of normalized instruction strings.

    Args:
        body: Raw smali method body text.
        level: Normalization level (see normalize_instruction).

    Returns:
        List of normalized instruction strings (no empty strings).
    """
    normalized = []
    for line in body.split("\n"):
        stripped = line.strip()
        # Skip non-instructions
        if not stripped:
            continue
        if stripped.startswith((".",":", "#")):
            continue
        result = normalize_instruction(stripped, level)
        if result:
            normalized.append(result)
    return normalized