-
-
OllyScript源代码阅读笔记
-
发表于:
2005-6-19 10:18
8223
-
简介
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;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课