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

发布于 2022-09-19 15:37:10 字数 1951 浏览 17 评论 0

不怕各位高手耻笑,我只会用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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

吻安 2022-09-26 15:37:10

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

蓝礼 2022-09-26 15:37:10

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

小瓶盖 2022-09-26 15:37:10

好的,多谢freearth兄。

萌面超妹 2022-09-26 15:37:10

good,顶一下...

娇妻 2022-09-26 15:37:10

原帖由 robinmu 于 2008-4-21 13:06 发表
作词法分析为什么不用yacc和lex???

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

终止放荡 2022-09-26 15:37:10

感谢各位朋友的悉心指导,今天晚上很想开始做
一下,用的是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();
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文