大多断API函数都会从栈中移除参数并保护寄存器EBX, EBP, ESI 和 EDI。声明这样的函数为STDFUNC,以告诉分析器该函数做了这样的事情。否则请其描述为FUNCTION。
万一某个参数由多个域及比特组成,比如上面提到的fdwPitchAndFamily ,我们该怎么办?请看下面这个例子:
TYPE FF_PITCH
MASK 03
IF 00 "DEFAULT_PITCH"
IF 01 "FIXED_PITCH"
IF 02 "VARIABLE_PITCH"
ELSEHEX
TEXT "—>"
MASK 0C
BIT 04 "4—>"
BIT 08 "8—>"
MASK FFFFFFF0
IF 00 "FF_DONTCARE"
IF 10 "FF_ROMAN"
IF 20 "FF_SWISS"
IF 30 "FF_MODERN"
IF 40 "FF_SCRIPT"
IF 50 "FF_DECORATIVE"
ELSEHEX
END
前两个比特位(第0和等1位)表示倾斜度,必须一起解码。我们使用 MASK 03 来提取这两个比特并通过IF序列来解码。增加了连接符“—>”,分别提取第2和第3个比特位,并分别单独解码。最后提取剩余部分并进行解码。
OllyDbg 会移除生成串尾部的连接符“—>”、空、冒号、逗号、分号和等号。
目前版本的分析仅能够解码32位参数。如你不能解码双精度浮点或长双精度浮点的函数参数。
2、式描述
自定义解码信息由函数描述和类型描述两部分组成。函数描述部分非常的简单:
FUNCTION|STDFUNC [模块名]函数名
<第一个参数的名称> <第一个参数的类型>
……
<最后一个参数的名称> <最后一个参数的类型>
END
如果函数从栈中移除参数并保护寄存器EBX, EBP, ESI 和 EDI,请使用关键字STDFUNC。大多少函数都遵循这样的规则。其他情况则声明为FUNCTION。模块(EXE 或 DLL)名是可选的。如果模块名被忽略,OllyDbg会对尝试匹配任何模块。模块名不区分大小写。
函数名称总是区分大小写的。有针对UNICODE的函数必须使用后缀 A 或 W 加以区分,比如SetWindowTextA.。
参数的顺序又C风的参数使用惯例一致。而16位Windows和32位API函数也是按惯例使用。如果参数名由多个字组成,或者包含特殊字符,那么请将其用两个单引号引起来。与在C语言中一样,省略号()是一个特殊的记录用于表示参数数目可变。它必须在函数描述的最后。OllyDbg不会尝试解码这样的参数。如果函数的参数为空,则按functionname(void)对待。
OllyDbg 仅支持32位的参数。某些参数已经预定义好了:
INT 以十六进制和带符号整数两种式显示
UINT 以十六进制和无符号整数两种式显示
HEX 以十六进制式显示
BOOL TRUE或 FALSE
CHAR ASCII字符
WCHAR UNICODE字符
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-41789-30.html
不同的人标准就不同
我也想得奖啊