nmap 发表于 2008-04-17 20:41

有个简单实践编译原理知识的小想法。

不怕各位高手耻笑,我只会用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是成员类型。

robinmu 发表于 2008-04-17 20:41

作词法分析为什么不用yacc和lex???

freearth 发表于 2008-04-18 10:35

回复 #1 nmap 的帖子

如果在linux下处理,建议试试awk,可以很方便地写一个小脚本处理,但是我不知道Win下面有没有可用的awk

nmap 发表于 2008-04-18 10:44

好的,多谢freearth兄。:smile:

system888net 发表于 2008-04-19 15:56

good,顶一下...

prolj 发表于 2008-04-21 13:32

原帖由 robinmu 于 2008-4-21 13:06 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
作词法分析为什么不用yacc和lex???
lex&yacc设计的时候是以自己为中心,所以使用起来有的时候不够方便、灵活,另外诊断信息不太好。
Clang好象是递归下降,gcc也改成递归下降了吧?

nmap 发表于 2008-04-23 23:08

感谢各位朋友的悉心指导,今天晚上很想开始做
一下,用的是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]
查看完整版本: 有个简单实践编译原理知识的小想法。