免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3603 | 回复: 6
打印 上一主题 下一主题

有个简单实践编译原理知识的小想法。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-17 20:41 |只看该作者 |倒序浏览
5可用积分
不怕各位高手耻笑,我只会用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???

论坛徽章:
0
2 [报告]
发表于 2008-04-17 20:41 |只看该作者
作词法分析为什么不用yacc和lex???

论坛徽章:
0
3 [报告]
发表于 2008-04-18 10:35 |只看该作者

回复 #1 nmap 的帖子

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

论坛徽章:
0
4 [报告]
发表于 2008-04-18 10:44 |只看该作者
好的,多谢freearth兄。

论坛徽章:
0
5 [报告]
发表于 2008-04-19 15:56 |只看该作者
good,顶一下...

论坛徽章:
0
6 [报告]
发表于 2008-04-21 13:32 |只看该作者
原帖由 robinmu 于 2008-4-21 13:06 发表
作词法分析为什么不用yacc和lex???

lex&yacc设计的时候是以自己为中心,所以使用起来有的时候不够方便、灵活,另外诊断信息不太好。
Clang好象是递归下降,gcc也改成递归下降了吧?

论坛徽章:
0
7 [报告]
发表于 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:李伟
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP