序号 | 命令及描述 |
1 | quickbmsver VERSION
检查QuickBMS的当前版本是否可以支持解包脚本,这个命令很少使用。
参数:VERSION QuickBMS的版本号 |
2 | clog NAME OFFSET ZSIZE SIZE [FILENUM]
提取文件并实时解压,本操作不影响输入文件的当前位置计数器,解压算法由ComType命令指定,提取的文件内容能够自动使用Encryption命令进行解密。
参数: NAME 输出文件的名称
OFFSET 定位文件在资源中的位置
ZSIZE 资源中压缩的数据大小
SIZE 解压后的文件大小
FILENUM 与资源关联的文件号 |
3 | findloc VAR TYPE STRING [FILENUM] [ERR_VALUE]
从资源的当前位置查找首次出现的字符串或数值,这个命令通常用于未知资源格式或特殊文本文件,很少使用
参数: VAR 存储找到的位置
TYPE 能够是字符串、统一码或数值
STRING C语言的字符串标记法,依赖于TYPE参数
FILENUM与资源关联的文件号
ERR_VALUE 如果没有找到字符串,默认时FindLoc将终止解包脚本,但是若ERR_VALUE指定了值,那么这个值将被分配给VAR参数,从而不会终止解包脚本 |
4 | for [VAR1] [OP] [VALUE] [COND] [VAR2]
...
next [VAR]
经典的带有初始化、条件和步进的"for"循环。在任何时候可使用break指令中断循环 (注意:break指令在多个for循环中并不直观,因为某些情况下会产生问题),next用来界定循环,同时进行步进。实际步骤是:将VALUE赋值给VAR1 (或执行一个数学操作);执行循环直到VAR1大于VAR1的限定条件;执行for和next之间的全部操作;增量VAR1
参数: VAR1 初始化变量
OP 操作符
VALUE 赋给初始化变量的值
COND 退出循环条件
VAR2 条件的第二部分 |
5 | get VAR TYPE [FILENUM]
从打开的文件读取字符串或数值,这是经常使用的命令
参数: VAR 存储读取数据的变量
TYPE 请查看前面解释的类型描述
FILENUM 与资源关联的文件号 |
6 | getdstring VAR LENGTH [FILENUM]
从文件或变量中读取定长数据,用于指定长度的文件名或其它字符串
参数: VAR 存储读取数据的变量
LENGTH 读取的字节数
FILENUM 与资源关联的文件号 |
7 | goto OFFSET [FILENUM] [TYPE]
转到文件的绝对位置
参数: OFFSET 到达的位置,如果是负数则从文件末尾向前推,能够处理的范围是(0到 0xffffffff)
FILENUM 与资源关联的文件号
TYPE SEEK_SET (默认),SEEK_CUR,SEEK_END |
8 | idstring [FILENUM] STRING
如果文件当前位置处的签名与提供的字符串不符则终止解包脚本。
参数: FILENUM与资源关联的文件号
STRING C语言的字符串标记法 |
9 | log NAME OFFSET SIZE [FILENUM]
提取文件,本操作不影响输入文件的当前位置计数器,提取的文件内容能够自动使用Encryption命令进行解密。
参数: NAME 输出文件名称
OFFSET 定位文件在资源中的位置
SIZE 提取的数据大小
FILENUM 与资源关联的文件号 |
10 | math VAR1 OP VAR2
执行两个变量的数学操作,并将结果放置在第一个变量里,注意:为了兼容性考虑,全部的操作都默认使用有符号32位数值
参数: VAR1 担当输入和输出变量
OP + 相加
* 相乘
/ 相除
- 相减
^ 异或
& 与
| 或
% 取模
! 非(0成为1,其他值成为0)
~ 补码(类似于异或0xffffffff)
< 左移
> 右移
l 左转
r 右转
s 字节交换
w 位交换
= 将VAR2赋值给VAR1
n 负数
a 绝对值
v 根
p 乘方
x 对齐,例如:var1=1, var2=16, result=16
var1=16, var2=16, result=16
var1=17, var2=16, result=32
z 公共位交换:var1=0xab, var2=4, result=0xba
var1=0xabcd, var2=4, result=0xdc
var1=0xabcd, var2=8, result=0xcdab
在OP的前面或后面添加u可以强制使用无符号操作
VAR2 其它的输入变量 |
11 | open FOLDER NAME [FILENUM] [EXISTS]
打开文件以便进行读取
参数: FOLDER 文件夹名称,FDDE表示NAME参数是输入文件夹里要打开的文件的扩展名,FDSE将认为NAME参数就是输入文件夹里要打开的文件名,"."表示当前输出文件夹
NAME 请看上面解释,NAME能够是?,这样QuickBMS将告之用户插入文件并手动打开,若NAME是"",将执行清空操作
FILENUM 与资源关联的文件号
EXISTS 若文件不存在,此变量将设置为0,否则为1,若文件不存在,QuickBMS默认使用一个错误进行终止 |
12 | savepos VAR [FILENUM]
返回文件的当前位置
参数: VAR 存储位置的变量
FILENUM 与资源关联的文件号 |
13 | set VAR1 [TYPE] VAR2
将常量或变量赋值给其它变量,也可以在赋值时改变类型
参数: VAR1 输出变量或内存文件
TYPE 没什么作用
VAR2 等待赋值的变量或常量 |
14 | do
...
while VAR1 COND VAR2
一个不经常使用的循环类型,在循环的末尾执行条件检查,实际上很少使用。
参数: VAR1 条件的第一部分
COND 条件
VAR2 条件的第二部分 |
15 | string VAR1 OP VAR2
相当于math命令的字符串形式
参数: VAR1 输入和输出变量
OP = 直接复制,如果VAR2是数值,则作为原始字符串,例子:var2="0x44434241", result="ABCD"
+ 将VAR2附加到VAR1的末尾
- 如果VAR2是正数,那么VAR1将从末尾截断指定的字节数;如果VAR2是负数,那么VAR1将从开头截断指定的字节数,否则将从VAR1中移除全部的VAR2
^ 使用VAR2异或VAR1(若较短则循环异或)
< 从VAR1的前面截断VAR2指定的字符数量,var1="thisisastring",var2="4", result="isastring"
% 截断头尾字符
& var1="thisisastring", var2="isa", result="isastring"
| var1="thisisastring", var2="isa", result="string"
$
!
> var1="thisisastring", var2="4", result="thisisast";var1="thisisastring", var2="isa", result="this"
b 字节转16进制数,var2="abc", result="616263"
B 字节转16进制数,但VAR2是一个空结尾字符串
h 16进制数转字节,var2="616263", result="abc"
e 基于Encryption命令的加密
E 基于Encryption命令的加密,但VAR2是一个空结尾字符串
c 基于ComType命令的压缩
C基于ComType命令的压缩,但VAR2是一个空结尾字符串
u var2="hello", result="HELLO"
l var2="HELLO", result="hello"
p
s
r 反转字符串
R 替换字符
VAR2 第二个变量或字符串 |
16 | cleanexit
终止解包脚本 |
17 | if VAR1 COND VAR2
...
[elif VAR1 COND VAR2]
...
[else]
...
endif
检查条件并当条件满足时执行必要的操作:
- If 是第一个条件
- Elif 是其它条件,能够是多个
- Else 没有条件匹配时执行的操作,一般放在最后
- EndIf 定界标记
参数: VAR1 条件的第一部分
COND 可以是字符串和数值
< 小于
> 大于
!= 不等
== 相等
>= 大于等于
<= 小于等于
& 字符串:VAR1包含VAR2;数值:与
^ 字符串:等于;数值:异或
| 或
% 取模
/ 相除
<< 左移
>> 右移
! 取反
!! 若VAR2为非零值则为真
~ 补码
VAR2 条件的第二部分 |
18 | getct VAR TYPE CHAR [FILENUM]
读取字符串直到CHAR表示的定界符
参数: VAR 输出变量
TYPE 忽略了
CHAR 8位数值的定界字符
FILENUM 与资源关联的文件号 |
19 | comtype ALGO [DICT]
指定clog命令使用的压缩算法
参数: ALGO 各种压缩算法名称
DICT 可选的字典或与算法相关的参数 |
20 | reverselong VAR
交换32位变量,例如:0x44332211交换为0x11223344
参数: VAR 交换的变量 |
21 | reverseshort VAR
交换16位变量,例如:0x2211交换为0x1122
参数: VAR 交换的变量 |
22 | endian TYPE
改变读写数据的全局大小序,默认为小序
参数: TYPE 小序的0x11223344存储为44 33 22 11;大序的0x11223344存储为11 22 33 44 |
23 | filexor SEQ
任何读取操作(get, *log 等等)都将执行异或
参数: SEQ 8位数值序列,可以是:如0x12或由空格分开的字节序列如"0x12 0x34 0x56"或16进制字符串如"\x12\x34\x56";设置为0或""将禁止异或 |
24 | filerot SEQ
与filexor命令类似,但执行的是求和操作,若SEQ为0x01且文件包含"hello",则变成 "ifmmp" |
25 | strlen VAR1 VAR2
计算VAR2的长度并存储在VAR1中
参数: VAR1 存储长度的变量
VAR2 需要计算长度的变量 |
26 | getvarchr VAR1 VAR2 OFFSET [TYPE]
定制字符串以便包含不同信息
参数: VAR1 目的变量,包含读取的元素
VAR2 想要获取元素的变量或内存文件
OFFSET 指定VAR2中获取元素的位置
TYPE 默认为字节 |
27 | putvarchr VAR1 OFFSET VAR2 [TYPE]
允许使用自定义规则执行写入的复杂操作
参数: VAR1 想要放置元素的变量或内存文件
OFFSET 在指定位置放置元素
VAR2 包含想要写入的元素的变量
TYPE 默认为字节 |
28 | debug
用于调试 |
29 | padding VAR [FILENUM]
执行此命令将自动跳转到对齐后的数据位置,如果文件使用4字节对齐,当前位置是0x39,那么在使用padding 4之后,其位置将自动变为0x3c
参数: VAR 对齐大小
FILENUM 与资源关联的文件号 |
30 | append
在*log命令中使能附加模式,因此当输出文件名已经存在时将不会覆盖而是添加 |
31 | encryption ALGO KEY [IVEC] [MODE] [KEYLEN]
为文件的读取操作设置一个解密算法,此命令仅工作于log 和clog命令。
参数: ALGO 各种解密算法
KEY 类似于"\x11\x22\x33\x44"的键值
IVEC 用于增加解密算法的安全性
MODE 默认为0,表示解密,否则为1,表示加密
KEYLEN 强制键值的长度,主要是避免使用变量作为键值时出现问题(因为可能包含0) |
32 | print MESSAGE
打印字符串,若变量在两个%字符之间则打印变量的值
参数: MESSAGE 字符串 |
33、34 | getarray VAR1 ARRAY VAR2
putarray ARRAY VAR1 VAR2
使用动态数组来存储数据,类似于临时区或堆栈 |
35 | callfunction NAME [KEEP_VAR]
startfunction NAME
...
endfunction
声明一个函数,请牢记规则:若KEEP_VAR为1,则函数结束时会保存变量的值,通常在解包脚本的后面放置函数
参数: NAME 函数名称
KEEP_VAR 0 = 递归函数(默认) 1 = 正常函数,会改变变量 |
36 | scandir PATH NAME SIZE [FILTER]
扫描文件,没什么用处,可以忽略
参数: PATH 必须是".",代表当前文件夹
NAME 接收文件名称,可以是""
SIZE 接收文件大小,可以是-1
FILTER 过滤器,仅当指定-F参数时才有效 |
37 | calldll DLLNAME FUNC/OFF CONV RET [ARG1] [ARG2] ... [ARGn]
本命令允许使用QuickBMS内部的插件,可用于存储在可执行文件或动态链接库中的自定义解压或解密函数
参数: DLLNAME 动态链接库或可执行文件名称
FUNC/OFF 函数名称或相对位置偏移,请牢记相对地址不是绝对地址,而是与基地址有关
CONV 函数调用惯例:stdcall,cdecl,fastcall,borland,watcom,pascal,safecall,syscall,optlink,carion,thiscall
RET 函数返回值,""表示没有返回值
[ARGS] 函数的所有参数 |
38、39、40 | put VAR TYPE [FILENUM]
putdstring VAR LENGTH [FILENUM]
putct VAR TYPE CHAR [FILENUM]
类似于get*命令,但执行的是写入操作 |