有个简单实践编译原理知识的小想法。
不怕各位高手耻笑,我只会用Win,事情的起因是,06年的时候,学习Win的结构化
异常处理,读了一些书籍和文档,才知道有一个TEB的
结构,WinDBG调试器能打印出该结构。
我的小想法是,可否用词法分析,来逐一分析TEB
结构的一些单词,并定义一个文法,用来描述这种结构
的语法,然后做语法分析。
得到相应的分析结果后,再做进一步处理,比如
编写一个IDA pro的插件,让插件可以读取这样的TEB
结构中的元素。
下面是WinDBG给出的TEB结构的开头的一些成员。
ntdll!_TEB
+0x000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID
+0x028 ActiveRpcHandle: Ptr32 Void
+0x02c ThreadLocalStoragePointer : Ptr32 Void
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
+0x034 LastErrorValue : Uint4B
+0x038 CountOfOwnedCriticalSections : Uint4B
+0x03c CsrClientThread: Ptr32 Void
+0x040 Win32ThreadInfo: Ptr32 Void
+0x044 User32Reserved : [26] Uint4B
其中_TEB是结构名,+0x000是成员的相对偏移,NtTib
是成员名,“:”冒号是一个分隔符, _NT_TIB是成员类型。 作词法分析为什么不用yacc和lex???
回复 #1 nmap 的帖子
如果在linux下处理,建议试试awk,可以很方便地写一个小脚本处理,但是我不知道Win下面有没有可用的awk 好的,多谢freearth兄。:smile: good,顶一下... 原帖由 robinmu 于 2008-4-21 13:06 发表 http://linux.chinaunix.net/bbs/images/common/back.gif作词法分析为什么不用yacc和lex???
lex&yacc设计的时候是以自己为中心,所以使用起来有的时候不够方便、灵活,另外诊断信息不太好。
Clang好象是递归下降,gcc也改成递归下降了吧? 感谢各位朋友的悉心指导,今天晚上很想开始做
一下,用的是lex,可能有更好的方法和工具,
因为个人的知识很有限,所以只能用些简单的
工具。
写了一个很蹩脚的lex程序,请各位高手批评,
程序如下,
%{
/****************************************************************************
mylexer.l
ParserWizard generated Lex file.
作用:分析WinDbg给出的TEB结构的词法
Date: 2008年4月20日
****************************************************************************/
#include <stdio.h>
#include "myparser.h"
%}
/////////////////////////////////////////////////////////////////////////////
// declarations section
// place any declarations here
// ws为空格
ws [\t ]+
// digit 为个位数
digit[0-9]
// prefix 为偏移的头部符号+0x
prefix "+0x"
// offset 为十六进制的偏移量
offset [0-9a-f]{3}
// 单个字母
letter [a-zA-Z]
// 成员名称
member {letter}({letter}|{digit})*
// 下划线
under_sign "_"
// 冒号为分隔符
separate_sign ":"
// 结构类型
struc_type {under_sign}{member}({under_sign}|{member})*
%%
/////////////////////////////////////////////////////////////////////////////
// rules section
// place your Lex rules here
{ws} ;
{prefix} {}
{offset} {printf("offset is %s\n", yytext);}
{member} {printf("member is %s\n", yytext);}
{separate_sign} {}
{struc_type} {printf("structure is %s\n", yytext);}
%%
/////////////////////////////////////////////////////////////////////////////
// programs section
main ()
{
yylex();
}
提供给该分析程序的数据结构很少,因为想开始简单验证一下,
可能要不断改进,测试的结果(不十分合理正确):
+0x000 NtTib : _NT_TIB
offset is 000
member is NtTib
structure is _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
offset is 01c
member is EnvironmentPointer
member is Ptr32
member is Void
+0x020 ClientId : _CLIENT_ID
offset is 020
member is ClientId
structure is _CLIENT_ID
+0x028 ActiveRpcHandle: Ptr32 Void
offset is 028
member is ActiveRpcHandle
member is Ptr32
member is Void
+0x02c ThreadLocalStoragePointer : Ptr32 Void
offset is 02c
member is ThreadLocalStoragePointer
member is Ptr32
member is Void
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
offset is 030
member is ProcessEnvironmentBlock
member is Ptr32
structure is _PEB
参考的文章:
URL:http://blog.csdn.net/liwei_cmg/archive/2007/03/15/1530492.aspx
Til:《Lex和Yacc应用方法(二).再识Lex与Yacc》
Aut:李伟
页:
[1]