ducky.debugging module

Virtual machine debugging tools - break points, watch points, etc.

Create “point” that’s triggered when a condition is satisfied (e.g. processor executes instruction on specified address, memory at specified address was modified, etc. Then, create “action” (e.g. suspend core), and bind both pieces together - when point gets triggered, execute list of actions.

class ducky.debugging.Action(logger)[source]

Bases: object

Base class of all debugging actions.

Parameters:logger (logging.Logger) – logger instance used for logging.
act(core, point)[source]

This method is called when “action” is executed. Implement it in child classes to give child actions a functionality.

Parameters:
class ducky.debugging.BreakPoint(debugging_set, ip, *args, **kwargs)[source]

Bases: ducky.debugging.Point

static create_from_config(debugging_set, config, section)[source]
is_triggered(core)[source]
class ducky.debugging.DebuggingSet(core)[source]

Bases: object

_DebuggingSet__check_chain(stage, chain, clean_triggered=False, *args, **kwargs)
add_point(p, chain)[source]
post_memory(address=None, read=None)[source]
post_step()[source]
pre_memory(address=None, read=None)[source]
pre_step()[source]
remove_point(p, chain)[source]
class ducky.debugging.LogMemoryContentAction(logger, address, size)[source]

Bases: ducky.debugging.LogValueAction

When triggered, logs content of a specified location in memory.

Parameters:
  • logger (logging.Logger) – logger instance used for logging.
  • address (u32_t) – memory location.
  • size (int) – size of logged number, in bytes.
static create_from_config(debugging_set, config, section)[source]
get_message(core, point)[source]
get_values(core, point)[source]
class ducky.debugging.LogRegisterContentAction(logger, registers)[source]

Bases: ducky.debugging.LogValueAction

When triggered, logs content of a specified register.

Parameters:
  • logger (logging.Logger) – logger instance used for logging.
  • registers (list) – list of register names.
static create_from_config(debugging_set, config, section)[source]
get_message(core, point)[source]
get_values(core, point)[source]
class ducky.debugging.LogValueAction(logger, size)[source]

Bases: ducky.debugging.Action

This is the base class for actions that log a numerical values.

Parameters:
  • logger (logging.Logger) – logger instance used for logging.
  • size (int) – size of logged number, in bytes.
act(core, point)[source]
get_message(core, point)[source]

Return message that, formatted with output of get_values(), will be shown to user.

Parameters:
Return type:

string

Returns:

information message.

get_values(core, point)[source]

Prepare dictionary with values for message that will be shown to the user.

Parameters:
Return type:

dict

Returns:

dictionary that will be passed to message format() method.

class ducky.debugging.MemoryWatchPoint(debugging_set, address, read, *args, **kwargs)[source]

Bases: ducky.debugging.Point

static create_from_config(debugging_set, config, section)[source]
is_triggered(core, address=None, read=None)[source]
class ducky.debugging.Point(debugging_set, active=True, countdown=0)[source]

Bases: object

Base class of all debugging points.

Parameters:
  • debugging_set (ducky.debugging.DebuggingSet) – debugging set this point belongs to.
  • active (bool) – if not True, point is not active and will not trigger.
  • countdown (int) – if greater than zero, point has to trigger countdown times before its actions are executed for the first time.
is_triggered(core, *args, **kwargs)[source]

Test point’s condition.

Parameters:core (ducky.cpu.CPUCore) – core requesting the test.
Return type:bool
Returns:True if condition is satisfied.
class ducky.debugging.SuspendCoreAction(logger)[source]

Bases: ducky.debugging.Action

If executed, this action will suspend the CPU core that triggered its parent point.

act(core, point)[source]
static create_from_config(debugging_set, config, section)[source]
ducky.debugging.cmd_bp_active(console, cmd)[source]

Toggle “active” flag for a breakpoint: bp-active <id>

ducky.debugging.cmd_bp_add_breakpoint(console, cmd)[source]

Create new breakpoint: bp-break <#cpuid:#coreid> <address> [active] [countdown]

ducky.debugging.cmd_bp_add_memory_watchpoint(console, cmd)[source]

Create new memory watchpoint: bp-mwatch <#cpuid:#coreid> <address> [rw] [active] [countdown]’

ducky.debugging.cmd_bp_list(console, cmd)[source]

List existing breakpoints

ducky.debugging.cmd_bp_remove(console, cmd)[source]

Remove breakpoint: bp-remove <id>