PeDoll - 如何编写PeDoll脚本
API hook
在常用脚本的脚本编写手册中,包含了PeDoll所有支持 hook 的API,如果想要监视某一个API函数,只需要编写:
hook + 该API的函数名 //大小写敏感
例如:我们想知道这个程序是否对文件进行的操作(假设不考虑更底层API调用),只需要对CreateFileA
、CreateFileW
进行监视就可以了,脚本代码如下:
hook CreateFileA
hook CreateFileW
binary hook
PeDoll 支持对二进制代码的直接hook,这对于一些自定义函数的hook尤为有效。 注意:在进行 binary hook
时你必须使用其他工具知晓该处代码的栈结构并且你需要在脚本中去平衡堆栈,其代码格式为:
binary 需要hook的二进制代码16进制序列
执行完成后出栈字节数 ESP
或 EBP
的解释方式执行结束后 EAX
的值 例如:我们知道易语言字符串比较函数的特征为 8B5424048B4C240885D2750D
,因为是调用者清理堆栈(cdecl call
),所以其出栈字节数为 0
,在 ESP+4
和 ESP+8
偏移处是字符串指针。当执行结束后 EAX
为 0
是表示比对匹配,因此其代码可以写为:
binary 8B5424048B4C240885D2750D 0 S4S8 0
其中:
S4
表示String at ESP+4
S8
表示String at ESP+8
当然,假如要解释为数字,就可以写为 D4D8
,表示 Decimal at ESP+4
,其中 S8
表示 Decimal at ESP+8
。
同理:
B4
表示String at EBP+4
B8
表示String at EBP+8
E4
表示Decimal at EBP+4
E8
表示Decimal at EBP+8
API过滤及断点
以 CreateFileA
为例,查看脚本编写手册如下说明:
API |
CreateFileA |
---|---|
Regular |
|
1 | CREATEFILEA |
2 | <UNKNOW\|CREATE\|OPEN\|RESET> |
3 | <var lpFileName> |
其中: - 1 表示这个函数名,注意它是大写的
- 2 表示它的三个参数,
UNKNOW
表示未知操作,CREATE
表示创建,OPEN
表示打开,RESET
表示复位 - 3 表示这个函数将操作的文件
如果我们需要对这个函数进行监视,当他 打开一个
名叫 123.txt
时进行断点,那么代码可以这样写:
hook CreateFileA
FILTER_START //过滤器开始,如果需要设置断点,这个代码一定要先写
CREATEFILEA <OPEN> <123.txt> QUERY SHOW
其中,QUERY
表示断点询问,当然 QUERY
还可以写成 REJECT
表示直接拒绝该函数操作,或者 TERMINATE
表示直接结束程序,如果不写或写为 PASS
表示默认放行。 另外,参数中还支持其它比较运算符,包括(+
包含、=
全等、>
大于、<
小于、&
与、!
非),例如:
CREATEFILEA <OPEN> <*> QUERY SHOW //表示打开任意文件时下断点
CREATEFILEA <OPEN> <*123> QUERY SHOW //表示打开的文件包含123字符时断点
CONNECT <192.168.1.1> <>1000> QUERY SHOW //表示当客户端连接192.168.1.1的端口大于1000时断点
CONNECT <192.168.1.1> <!1000> QUERY SHOW //表示当客户端连接192.168.1.1的端口不等于1000时断点
//...以此类推