OllyDbg可以对像printf()这样参数个数可变的函数进行参数解码:
PUSH EAX ; / <%.*s>
PUSH E8 ; | <*> = E8 (232.)
PUSH EBX ; | <%08X>
PUSH Mymodule.004801D2 ;| format = "Size %08X (%.*s) bytes"
PUSH ESI ; | s
CALL Mymodule.sprintf ;\sprintf
你可以定义自己的函数。每次你打开某个应用程序时,OllyDbg都会重新设置函数参数表并用内嵌描述添充这个表。然后尝试打开文件“< OllyDbg目录>\common.arg”和“<OllyDbg目录>\<应用程序名>.arg”,这里<应用程序名>使用8.3式(DOS)被调试程序文件名(不带路径和扩展名)。
下面看一个简单的.arg文件实例:
INFO Simple .ARG file that decodesCreateHatchBrush
TYPE HS_X
IF 0 "HS_HORIZONTAL"
IF 1 "HS_VERTICAL"
IF 2 "HS_FDIAGONAL"
IF 3 "HS_BDIAGONAL"
IF 4 "HS_CROSS"
IF 5 "HS_DIAGCROSS"
ELSEINT
END
TYPE COLORREF
IF 0 "<BLACK>"
IF 00FFFFFF "<WHITE>"
OTHERWISE
TEXT "RGB("
FIELD 000000FF
UINT
TEXT ","
FIELD 0000FF00
UINT
TEXT ","
FIELD 00FF0000
UINT
TEXT ")"
END
STDFUNC CreateHatchBrush
"style" HS_X
"colorref" COLORREF
END
标准Windos API函数CreateHatchBrush(int style,int colorref) 有两个参数。第一个必须是阴影风[hatch style],第二个是常量由红色、绿色、蓝色组成,并用一个32位整数的低三字节表示。为了解码这些参数,文件定义了两个新的参数类型:HS_X和 COLORREF。
阴影风是一个简单的枚举类型,如0表示HS_HORIZONTAL(水平风)、1表示HS_VERTICAL(垂直风)。IF关键字比较参数与第一个操作数(注意:其总是十六进制的),如果相同则显示第二个操作数里的文本。但万一匹配失败会如何?关键字ELSEINT 会然OllyDbg会将参数解释为一个整数。
COLORREF 更复杂一些。首先尝试解码两个广泛使用的颜色:黑(全0组成)与白(全0xFF组成)。如果匹配失败,COLORREF尝试解码颜色为一个结构包含红、绿、蓝的亮度。FIELD会用第一个操作数与参数进行逻辑与操作。然后转换结果为整数,并同时按位右移第一个操作及该整数,直到第一个操作数的二进制个位数字为1,这时整数按位右移的结果以无符号10进制显示出来。这个例子做了三次这样的操作,以分离出每个颜色成份。TEXT关键字用于无条件显示文本。如果参数为00030201,那么COLORREF将其解码为RGB(1.,2.,3.)。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-41789-29.html
全在否定有蛆
瞧你自己那点出息
造谣