首页
社区
课程
招聘
OllyScript源代码阅读笔记
发表于: 2005-6-19 10:18 8235

OllyScript源代码阅读笔记

2005-6-19 10:18
8235

简介

OllyScript是外国的SHaG写的一个极好用的脚本语言解释器!通过它,咱们可以写出类汇编的脚本来完成一些自动化的功能,这样就不用写插件了。它最大的特点就是基本上封装了常用的OD插件命令,另外还提供了不少好用的功能!小弟斗胆写一写对它的代码阅读笔记,请各位大哥大姐们指导!!

在官方网站上能下到的最后的源代码是它的0.52版。OllyScript的作者也不知是怎么想的,每一次的更新似乎都对架构改动挺大的,而且脚本还不能兼容前面的版本!这有点像Borland的作风呀!每次Delphi/BCB升级都造成以前版本的源代码很难再使用……哈哈,不灌水了!!!

一、词法分析篇

作为一个脚本解释器,第一步当然就是解释出脚本语言中的一个个token啦!!正所谓“巧妇难为无米之炊”嘛!!

首先是在LoadScript()函数中过滤掉所有的注释字符串,并且解析出Label来!代码:

bool LoadScript(LPSTR file)
{
	ResetScript();

	ifstream fin(file, ios::in);
	string scriptline;
	bool is_comment = false;
	while(getline(fin, scriptline))
	{
		scriptline = trim(scriptline);
		if(scriptline == "/*")
			is_comment = true;
		else if(scriptline == "*/")
		{
			is_comment = false;
			continue;
		}

		if(scriptline != "" && !is_comment)
		{
			if(scriptline.find("//") == -1)
				script.push_back(scriptline);
			else if(scriptline.find("//") > 0)
			{
				script.push_back(trim(scriptline.substr(0, scriptline.find("//"))));
			}
		}
	}
	fin.close();

	ParseLabels();

	scriptIsRunning = true;

	return true;
}
bool ParseLabels()
{
	vector<string>::iterator iter;
	iter = script.begin();
	string s;
	int loc = 0;

	while(iter != script.end())
	{
		s = *iter;
		if(s.at(s.length() - 1) == ':')
			labels.insert(pair<string, int>(s.substr(0, s.length() - 1), loc));
		iter++;
		loc++;
	}

	return false;
}
bool split(vector<string> &vec, const string &str, const char delim)  
{
	vector<int> pos;
	bool inQuotes = false;

	for(uint i = 0; i < str.size(); i++)
	{
		if(str[i] == '"')
			inQuotes = !inQuotes;

		if(str[i] == delim && !inQuotes)
			pos.push_back(i);
	}

	vector<int>::iterator iter = pos.begin();

	if(iter == pos.end())
	{
		vec.push_back(str);
		return false;
	}

	uint start = 0, end = 0;

	while(iter != pos.end())
	{
		end = *iter;
		vec.push_back(trim(str.substr(start, end - start)));
		start = end + 1;
		iter++;
	} 

	if(start != str.size())
		vec.push_back(trim(str.substr(start)));

	return true;
}
bool is_hex(string& s)
{
	for(uint i = 0; i < s.length(); i++)
	{
		if( (s[i] < '0' || s[i] > '9') && (s[i] < 'a' || s[i] > 'f') && (s[i] < 'A' || s[i] > 'F'))
			return false;
	}

	return true;
}
int GetRegNr(string& name)
{
	if(name == "eax")
		return REG_EAX;
	else if(name == "ecx")
		return REG_ECX;
	else if(name == "edx")
		return REG_EDX;
	else if(name == "ebx")
		return REG_EBX;
	else if(name == "esp")
		return REG_ESP;
	else if(name == "ebp")
		return REG_EBP;
	else if(name == "esi")
		return REG_ESI;
	else if(name == "edi")
		return REG_EDI;
	return -1;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
2
编译原理还是很有用的呀.
虽然不太懂OD,还是支持一下.
2005-6-19 10:29
0
雪    币: 207
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
谢谢斑竹哈!俺们还没开编译原理的课程,好像要到大三才开,小弟以前自己看龙书一知半解的,请斑竹多指教!听师兄师姐们说编译原理中的形式语言与自动机理论比较重要,最近在看Ullman大牛的书!
2005-6-19 10:39
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
学习!
2005-6-19 20:24
0
雪    币: 100
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习中
有些看不懂!~!~
2005-6-21 08:40
0
游客
登录 | 注册 方可回帖
返回
//