Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
:type endian: Character
:param endian: (Optional, def=LITTLE_ENDIAN) Endianess of the bit field (LITTLE_ENDIAN: <, BIG_ENDIAN: >)
:type output_format: str
:param output_format: (Optional, def=binary) Output format, "binary" or "ascii"
:type signed: bool
:param signed: (Optional, def=False) Make size signed vs. unsigned (applicable only with format="ascii")
:type full_range: bool
:param full_range: (Optional, def=False) If enabled the field mutates through *all* possible values.
:type fuzzable: bool
:param fuzzable: (Optional, def=True) Enable/disable fuzzing of this primitive
:type name: str
:param name: (Optional, def=None) Specifying a name gives you direct access to a primitive
"""
dword = primitives.DWord(value, endian, output_format, signed, full_range, fuzzable, name)
blocks.CURRENT.push(dword)
:type endian: chr
:param endian: (Optional, def=LITTLE_ENDIAN) Endianess of the bit field (LITTLE_ENDIAN: <, BIG_ENDIAN: >)
:type output_format: str
:param output_format: (Optional, def=binary) Output format, "binary" or "ascii"
:type signed: bool
:param signed: (Optional, def=False) Make size signed vs. unsigned (applicable only with format="ascii")
:type full_range: bool
:param full_range: (Optional, def=False) If enabled the field mutates through *all* possible values.
:type fuzzable: bool
:param fuzzable: (Optional, def=True) Enable/disable fuzzing of this primitive
:type name: str
:param name: (Optional, def=None) Specifying a name gives you direct access to a primitive
"""
word = primitives.Word(value, endian, output_format, signed, full_range, fuzzable, name)
blocks.CURRENT.push(word)
global function style request manipulation to direct object manipulation. Example::
req = s_get("HTTP BASIC")
print(req.num_mutations())
The selected request is also set as the default current. (ie: s_switch(name) is implied).
:type name: str
:param name: (Optional, def=None) Name of request to return or current request if name is None.
:rtype: blocks.request
:return: The requested request.
"""
if not name:
return blocks.CURRENT
# ensure this gotten request is the new current.
s_switch(name)
if name not in blocks.REQUESTS:
raise exception.SullyRuntimeError("blocks.REQUESTS NOT FOUND: %s" % name)
return blocks.REQUESTS[name]
global function style request manipulation to direct object manipulation. Example::
req = s_get("HTTP BASIC")
print(req.num_mutations())
The selected request is also set as the default current. (ie: s_switch(name) is implied).
:type name: str
:param name: (Optional, def=None) Name of request to return or current request if name is None.
:rtype: blocks.request
:return: The requested request.
"""
if not name:
return blocks.CURRENT
# ensure this gotten request is the new current.
s_switch(name)
if name not in blocks.REQUESTS:
raise exception.SullyRuntimeError("blocks.REQUESTS NOT FOUND: %s" % name)
return blocks.REQUESTS[name]
def s_block_end(name=None):
"""
Close the last opened block. Optionally specify the name of the block being closed (purely for aesthetic purposes).
:type name: str
:param name: (Optional, def=None) Name of block to closed.
"""
blocks.CURRENT.pop()
def s_initialize(name):
"""
Initialize a new block request. All blocks / primitives generated after this call apply to the named request.
Use s_switch() to jump between factories.
:type name: str
:param name: Name of request
"""
if name in blocks.REQUESTS:
raise exception.SullyRuntimeError("blocks.REQUESTS ALREADY EXISTS: %s" % name)
blocks.REQUESTS[name] = Request(name)
blocks.CURRENT = blocks.REQUESTS[name]
def s_block_end(name=None):
"""
Close the last opened block. Optionally specify the name of the block being closed (purely for aesthetic purposes).
:type name: str
:param name: (Optional, def=None) Name of block to closed.
"""
blocks.CURRENT.pop()
def s_switch(name):
"""
Change the current request to the one specified by "name".
:type name: str
:param name: Name of request
"""
if name not in blocks.REQUESTS:
raise exception.SullyRuntimeError("blocks.REQUESTS NOT FOUND: %s" % name)
blocks.CURRENT = blocks.REQUESTS[name]
:type signed: bool
:param signed: (Optional, def=False) Make size signed vs. unsigned (applicable only with format="ascii")
:type math: Function
:param math: (Optional, def=None) Apply the mathematical operations defined in this function to the size
:type fuzzable: bool
:param fuzzable: (Optional, def=True) Enable/disable fuzzing of this sizer
:type name: str
:param name: Name of this sizer field
"""
# you can't add a size for a block currently in the stack.
if block_name in blocks.CURRENT.block_stack:
raise exception.SullyRuntimeError("CAN NOT ADD A SIZE FOR A BLOCK CURRENTLY IN THE STACK")
size = Size(
block_name, blocks.CURRENT, offset, length, endian, output_format, inclusive, signed, math, fuzzable, name
)
blocks.CURRENT.push(size)
def s_block_start(name, *args, **kwargs):
"""
Open a new block under the current request. This routine always returns an instance so you can make your fuzzer
pretty with indenting::
if s_block_start("header"):
s_static("\\x00\\x01")
if s_block_start("body"):
...
s_block_close()
:note Prefer using s_block to this function directly
:see s_block
"""
block = Block(name, blocks.CURRENT, *args, **kwargs)
blocks.CURRENT.push(block)
return block