BIOS Guard Script tool

November 28, 2020 ยท View on GitHub

The tool allows you to assemble and disassemble BIOS Guard script.

Assembly

To assemble a script, you need to use big-script-tool.py -a <script_file>. Assembled script will be saved to file <script_file>_assembled.bin.

Also you can use class BigScript directly:

script = BigScript(code_string=src)
script.to_bytes()

or

script = BigScript()
script.assemble(src)
script.to_bytes()

Operands

The operands are:

  • buffers
  • flash pointers
  • registers
  • immediate values
  • labels

Buffers: buffer<number_of_the_buffer> (or b<number_of_the_buffer>). Storages of the data. buffer0 points to the actual BGUP. Other buffers are temporal.

set b0 0xAA00
add b0 0x1

Flash pointers: flash<number_of_the_flash_ptr> (or f<number_of_the_flash_ptr>). Stores some linear address of the flash.

set f0 0xA00000
sub f0 0x10

Registers: r<number_of_the_register> - a little storage of the temporal data.

set r1 0x10
set r2 0x20
add r1 r2
and r1 0x30

Imm values: <number> or 0x<number> if you prefer to use hex. Please note, that hex numbers are start only with 0x prefix. If you write something like 10000h it will be interpreted as a decimal number.

Labels: _<name_of_the_label> - an arbitrary script line name. Can be used only in control flow instructions. Please note, that labels start with _ and must not end with symbols like :. If you use that symbol, you will need to refer to the label like jmp _label:.

_loop
  sub r1 r2
  cmp r1 0x0
  jne _loop

Opcodes

Opcode nameOperandsInfo
start-marks the start of the script
storeflash ptr, buffer, registerwrite data from a buffer to the flash
storeflash ptr, buffer, immediate valuewrite data from a buffer to the flash
loadbuffer, flash ptr, registerread data from the flash to the buffer
loadbuffer, flash ptr, immediate valueread data from the flash to the buffer
eraseblkflash ptrErase flash blk
eraseblk64kbflash ptrErase 64kb flash block
addregister, register
addregister, immediate value
addbuffer, register
addbuffer, immediate value
addflash ptr, register
addflash ptr, immediate value
subregister, register
subregister, immediate value
subbuffer, register
subbuffer, immediate value
subflash ptr, register
subflash ptr, immediate value
andregister, register
andregister, immediate value
orregister, register
orregister, immediate value
shrregister, immediate value
shlregister, immediate value
rorregister, immediate value
rolregister, immediate value
setregister, register
setregister, immediate value
setbuffer, registerSet an offset from the beggining of the buffer
setbuffer, immediate valueSet an offset from the beggining of the buffer
setflash ptr, registerSet a linear address of the flash
setflash ptr, immediate valueSet a linear address of the flash
loadbyteregister, buffer
loadwordregister, buffer
loaddwordregister, buffer
storebytebuffer, register
storewordbuffer, register
storedwordbuffer, register
cmpregister, register
cmpregister, immediate value
cmpbuffer, register
cmpbuffer, immediate value
cmpflash ptr, register
cmpflash ptr, immediate value
cmpbuffer, buffer, registerCompare buffers with specified length
cmpbuffer, buffer, immediate valueCompare buffers with specified length
copybuffer, buffer, registerCopy data with the specified length
copybuffer, buffer, immediate valueCopy data with the specified length
jmplabel (or imm)Uncoditional jump to the label. Also you can use a line number directly.
jelabel (or imm)Coditional jump to the label. Also you can use a line number directly.
jnelabel(or imm)Coditional jump to the label. Also you can use a line number directly.
jglabel (or imm)Coditional jump to the label. Also you can use a line number directly.
jgelabel (or imm)Coditional jump to the label. Also you can use a line number directly.
jllabel (or imm)Coditional jump to the label. Also you can use a line number directly.
jlelabel (or imm)Coditional jump to the label. Also you can use a line number directly.
jmpregisterUncoditional jump to the line number stored in register.
logimmediate value, registerWrite data from second operand to the BiG Log. The BiG log needs to be setup properly.
logimmediate value, immediate valueWrite data from second operand to the BiG Log. The BiG log needs to be setup properly.
rdstsregisterRead status of previous operation into register.
randregister
sleepimmediate value
end-

Disassembly

To disassemble a script, you need to use big-script-tool.py -d <script_file>. Disassembled script will be saved to file <script_file>_disassembled.txt.

Also you can use class BigScript directly:

script = BigScript(code_bytes=bin_script)
script.to_string()

or

script = BigScript()
script.disassemble(bin_script)
script.to_string()