有个简单实践编译原理知识的小想法。
不怕各位高手耻笑,我只会用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
作词法分析为什么不用yacc和lex???
如果在linux下处理,建议试试awk,可以很方便地写一个小脚本处理,但是我不知道Win下面有没有可用的awk
好的,多谢freearth兄。
good,顶一下...
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();
}