// Sci 父窗口过程
LRESULT WINAPI SCIParentWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if ((uMsg == WM_NOTIFY) && (lParam != NULL))
{
NMHDR * lnmhdr = (NMHDR*)lParam;
if (lnmhdr->hwndFrom == g_hSCIWnd)
{
SCNotification * lSCNmhdr = (SCNotification*)lParam;
switch (lnmhdr->code)
{
case SCN_STYLENEEDED:
case SCN_CHARADDED:
case SCN_SAVEPOINTREACHED:
case SCN_SAVEPOINTLEFT:
case SCN_MODIFYATTEMPTRO:
case SCN_DOUBLECLICK:
case SCN_UPDATEUI:
case SCN_MODIFIED:
case SCN_MACRORECORD:
break;
case SCN_MARGINCLICK: /// 旁注栏被单击
{
SendEditor(SCI_TOGGLEFOLD, SendEditor(SCI_LINEFROMPOSITION, lSCNmhdr->position));
break;
}
}
}
}
return ::CallWindowProc(g_pfnParentWndProc, hWnd, uMsg, wParam, lParam);
}[/pre]
当然这个很简单。
我脱壳 RMXP 后 用 OD 逆向 IDA 辅助 逆向出了以下代码
RGSSGetInt("$data_scripts.size") // 取脚本数量
RGSSGetStringACP (“$data_scripts ”) // 取指定脚本名称
RGSSGetStringUTF8 (“Zlib::Inflate.inflate($data_scripts )”) // 解码脚本
可以说 在内部, 脚本是用 RUBY 进行保存的。
说说自动完成吧,问题就在这里,如果这个成功了。我也不会放弃。
在我编写脚本分析器 困难重重,首先 我学到编程 脚本 太多 乱。个人能力不行,
参考了很多开源的 RUBY IDE 中,
很多人都说 RUBY 很多变量 类型 是要在运行后才能确定 所以词法 语法分析 没有一定功力是无法完成的,我这里也只写了一点点
[pre lang="c++" line="0"]
// 跳过注释
int WINAPI seek_remark(char * str, int len)
{
do
{
switch (*str++)
{
case '#':
{
char * s = str;
do
{
char chr = *s++;
switch (chr)
{
case '\r':
return (*s == '\n')?(int(s) - int(str) + 2):(int(s) - int(str) + 1);
case '\n':
case '\0':
return int(s) - int(str) + 1;
default:
{
if (isHighBitChar(chr))
s++;
break;
}
}
} while (1);
}
case '=':
{
// =begin=end
if (_PINT(str) == REMARK_BEGIN_DWORD) // 0 1 2 3
{
str += sizeof(DWORD);
if (*str++ == 'n')
{
int i = _strstr(str, "=end", len - 6, 4);
return (i != -1)?(10+i):len;
}
}
return 0;
}
}
} while (1);
return 0;
}
// 解析到下个字符串包围壳
int parsing_string_symbol(char * str, char symbol)
{
char * s = str;
do
{
char c = *s++;
if (c == symbol)
return (int)(s - str);
else if (c == '\\') // 忽略下个符号
s += isHighBitChar(*s)?2:1;
else if (isHighBitChar(c))
s++;
} while (1);
return 0;
}
// 解析数值
int parsing_num(char * str)
{
char * s = str;
do
{
switch (*s++)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
{
break;
}
default:
return (int(s - str));
}
} while (1);
return 0;
}
// 寻文本 sunday 算法
int _strstr(char * src, char * des, int len_s, int len_d)
{
// if (len_d == 0) len_d = _strlen(des);
int i = 0;
int j = 0;
int pe = len_d - 1;
int tb = i;
int te = len_s - 1;
while ((i < len_s) && (j < len_d))
{
if (src == des[j])
{
i++;
j++;
}
else
{
int k = len_d - 1;
while (k >= 0 && src[pe + 1] != des[k])
{
k--;
}
int gap = len_d - k;
i += gap;
pe = i + len_d - 1;
tb = i;
j = 0;
}
}
if (i <= len_s)
{
return tb;
}
return -1;
}[/pre]
我也想过用 ctags 生成 tag list 可惜在 ctags 在 ruby 分析中 类 实例变量 与 全局变量 都无法分析出。⊙﹏⊙!算了 说多了,都是泪。