Skip to main content

Documentation Index

Fetch the complete documentation index at: https://vulhunt-docs.binarly.io/llms.txt

Use this file to discover all available pages before exploring further.

VulHunt supports reusable Lua modules that can be shared across multiple rules. Modules are standard Lua files with the .vhm (VulHunt Module) extension, placed in a dedicated modules directory.

Writing a module

A module is a .vhm file that defines a Lua table with helper functions and returns it. For example, a module providing x86 instruction helpers could be structured as follows:
-- modules/uefi/primitives/x86.vhm

local x86 = {}

function x86.find_call(pattern)
  for _, insn in ipairs(pattern.insns) do
    if insn.mnemonic == "CALL" then
      return insn.address
    end
  end
  return nil
end

return x86

Using a module in a rule

Import a module with require using its path relative to the modules directory, without the .vhm extension:
author = "Binarly"
name = "CVE-2025-7028"
platform = "efi-module"
architecture = "X86:LE:64"
conditions = {
  platform = {volume_guids = {"bc327dbd-b982-4f55-9f79-056ad7e987c5"}}
}

scopes = {scope:project{with = check}}

function check(project)
  local pattern = project:search_code(
    "40534883ec..8b51..488b05........488bd98b49..4c8b0381c1........ff104885c00f98c28853104883c4..5bc34053"
  )
  if pattern == nil then return end

  local x86 = require "uefi/primitives/x86"

  local call = x86.find_call(pattern)
  if call == nil then return end

  -- ...
end