曾梦想仗剑走天涯,看一看世界的繁华


杂记 - []

昨天晚上公司集体出去吃年夜饭,大家相互灌酒以图泄愤。老袁阴谋策划灌倒平时提交BUG最多的sunny,结果面色惨淡的跑了回来——sunny面不改色的一口气连喝了半斤白酒。看来高手都是隐匿于我们之间的(PS:sunny是女生)。老宋自爆刚到公司的时候,一时兴起,被老袁灌了N两红星二锅头。当时还不觉得怎么样,等到半夜两点一觉醒来,辗转反侧痛苦不已。以致于第二天到公司后,一整天都趴在桌子上睡觉。最后产生了严重的心理阴影——一听到二锅头就全身难受。在厕所看到一位大叔,也许是真的喝多了,连自己掉了一地百元大钞也毫无知觉。回到包间告诉他们,一群人呼啸而起,就要冲到厕所抢钱。眼见一场血战就要爆发,我补充了一句:“我已经告诉他了。”结果被一群懊丧不已、后悔没有提前去厕所的人爆K了一顿(其中包括若干女生。她们直接忽略了她们不能进男厕所的规则)。最后总共喝了六瓶啤酒和三瓶白酒,不算多。一群人都兴致很高(估计很大一部分因素是因为吃饭之前刚发了年终奖),老大也是眉飞色舞的,聊到最后,天花乱坠,无所不谈,以至于连我们自己都不知道在说些什么:)

上午跟老宋一起去中关村,他去买配件,我去看数码相机。据说他因为去年买火车票受打击了,产生了心理阴影,今年不买火车票也不回家,在北京“独自”过年。然后以此为借口去买内存和显卡升级电脑,以备“过年之需”。在电脑城溜达一圈,才发现自己的攒机知识依然处于三、四年前的状态,比如我一直认为很先进的AGP插槽被人称为“过渡的技术”,我认为依旧很遥远的64位技术满大街连小女生都在谈……显然老宋对此同样很郁闷,因为很难买到能配得上他那台两年前的使用AGP的主板。

计划买数码相机,但是又完全不懂那些复杂的参数,准备改天找个懂行的来助阵。对卡片机很感兴趣,看好柯达的V570、尼康的Coolpix S3、奥林巴斯的SP-700、Sony的T9,卡西欧的Exilim Card EX-S600。

自从Sony的短棒推出之后,就对Sony失去了好感——因为我的所有记忆棒都是长棒。奥林巴斯镜头很好,毕竟原先就是做这个起家的,但是SP-700有些一般,没有很出彩的地方。我对卡西欧的了解只限于电子琴,所以虽然Exilim Card EX-S600看起来很不错,但是依然不太放心。

排除法之后,只剩下了Coolpix S3和V570。可惜这两款完全不是同一类型的机器,很难做出横向的比较。Coolpix S3性能不错,全金属的外壳握在手里很舒服,很符合我对卡片机的概念,可惜录制的短片是无声模式。相比之下S2就好些,虽然CCD的像素比S3低了近100万。V570真的很强悍,广角、场景拼接、可调焦距的MPEG4短篇录制、五倍光学变焦、不错的微距,卡片机中显得鹤立鸡群。唯一不满意的就是外形。按照网上的评论,实在很难把它叫做卡片机,只能叫做便携机。在卡片机中显得过于“厚实”的机身、不怎么样的手感、类似游戏机的面板和难看的按键,完全不符合我对卡片机的审美观点。是外形和还是功能,这是个问题。。。。。。

晚上回住处,发现昨天好不容易才糊好的窗户,上面的报纸已经支离破碎。本来计划今天安玻璃,结果在中关村和公司待了一天,只好等明天再换。找来报纸和胶带把窗户重新糊了一遍,希望这次糊上报纸能够撑到明天。还好最近两天基本上没风,晚上不会冷。明天一定要去换玻璃~~~~~~~~~~~~~~

据悉,第一次体验大学幸福假期生活的丫头,今天睡了整整一天。以至于睡眠过度,直到午夜依然精力旺盛,在网上四处游荡不已。如果没有猜错,一定是沉溺于mop之中。丫头已经彻底堕落为了猫女,并以此为自豪。可爱的小丫头


Posted by monkeycz at 23:45 | Read more | Comments (0) | Trackback (0) | Edit |

杂记 - []

昨天晚上在公司写报告书太晚,老大请客吃饭,在楼下一家不知道是什么菜的饭馆。上的菜看起来非常不错,一个硕大无比的盘子配上一丁点的菜。只有水煮鱼还算的上正经的菜,可惜我几乎不吃辣的。吃了四碗米饭后依然没有吃饱意思,最后实在不好意思再叫那个服务员上米饭。晚上回去又忘了再买点吃的,于是饿了一个晚上……老大他们每个人只吃了一碗米饭就饱了,实在不可理解。(PS:很小很小的饭碗,只有半个拳头那么大~~~~~~)

早上准备出门的时候,一拉屋门,屋里的玻璃应声而碎。屋里窗户上的玻璃本来就安装的不是很严,开门的时候空气被压缩,就把玻璃挤掉了。急着要去公司,来不及找人安玻璃,只好自己用报纸先糊上了。不会糊,瞎糊,糊的一塌糊涂。花了半个小时,效果依然跟旧社会似的,还好已经不透风了。希望晚上不要刮风,我对糊上去的报纸一点信心也没有。明天是周末,一定要找人来大修,否则睡在摇摇欲坠的窗户下,实在是没有安全感。


Posted by monkeycz at 11:24 | Read more | Comments (0) | Trackback (0) | Edit |

BUG,又见BUG - []

一整天都在做速度、质量评价测试。速度上获得了相当不错的成绩,是参照程序的3倍有余。质量上有些不尽人意。画质上的BUG是最难搞的东西。

看来昨天不经意发现的BUG只是一个序幕,今天更多的BUG引发了出来。甚至连我为了证明某函数是正确的数据都引出了新的BUG。郁闷~~~~~~~~


Posted by monkeycz at 20:03 | Read more | Comments (0) | Trackback (0) | Edit |

杂记 - []

1。担心已久的惨剧终于在《死神》64集发生了。打不完的BOSS,救不完的人,练不完的级……《七龙珠》《圣斗士》TV版的噩梦重现了。而且把原漫画剧情篡改的一塌糊涂,不忍卒睹。莫非只有“少年漫画”才能卖钱,只有走白痴路线才能被大众接受么?《金田一》TV版虽说篡改情节,但好歹人家还有推理在那儿撑着;《3*3 eyes》TV版已经彻底的让我恶心了一番;天知道《死神》能被那帮垃圾糟蹋成什么样子!套用星爷的话:“漫画不是这样搞的”。

2。困扰了两周的BUG昨天晚上终于搞定了。原因是一处缓冲区在特殊情况下忘记了清空。还好因为跟踪这个BUG,同时发现了其他4、5处很隐蔽的BUG,否则估计以后也很难发现。

3。以为彻底搞定了,结果今天早上测试的时候又发现了新的BUG,很少的几帧会发生错位…………看来BUG果然是无穷无尽的。


Posted by monkeycz at 12:59 | Read more | Comments (0) | Trackback (0) | Edit |

杂记 - []

好久没有更新blog了,浮上来透个气,以免某些人以为这个blog再也不更新了。

没啥值得说的,就絮絮叨叨说下最近的忙的事情:

1。关键字:优化、BUG、Mpeg4、H264。。。。。。

2。KSFrame构架更新,实现类似COM自动化的功能

3。前两天被迫搞了个正则表达式测试工具,估计以后要经常用到。放在了看雪工具版上:http://bbs.pediy.com/showthread.php?s=&threadid=20351

4。更新了ZDK的MicoLoader,修正了多实例运行非法操作等若干BUG,支持最新版本易语言编译生成的目标代码。

5。计划更新EcE,再不更新也许就要被人追杀了。

6。疯狂的玩了iPod Video和PSP若干天。

搞定了iPod和PC之间传输视频文件的问题,可以完全不用依赖iTunes。

iPod Video好处太多,就不赘述了,谈谈不好的地方。第一,电池太差,尤其在播放视频的时候,差到不可想象,这个东西完全不适合用来放电影,只适合放短片和mp3。其次,那个硬盘是在不敢恭维,在传输文件的时候如果把它放在桌子上,那种震动完全会让你有理由担心在下一秒它就会坏掉,尤其时不时的再“咔咔”想两声,真的很恐怖。再次,完全忍受不了那个iTunes。虽然众多Apple的Fans认为这完全不能成为一个理由,但是我现在只用自己的传输工具来给iPod传视频文件:)。其他,耳机、充电器……当然,美轮美奂的外观,30G的容量,视频播放,都是可以供我们瞻仰一下的。不过如果只是听mp3,我会选择iPod nano——如同精灵般的优雅;如果看电影的话,PSP也是个不错的选择。

觉得PSP是一个很强悍的平台,无论是在上面做开发还是玩游戏都是一件很爽的事情。玩了《脱狱潜龙》之后才知道在掌机上居然可以把游戏做到和电影一样的效果。而在PSP上玩《RADGE RACERS》简直是一种享受——虽然平时我几乎不玩游戏。还有PSPChina站长的看书软件《creader》,做得相当不错,PSP的屏幕全屏看书很舒服的。在PSP上看电影同样很不错,最近不少片子,包括若干集《死神》和《情癫大圣》都是在PSP上看完的。计划买一台PSP:)很难得这次丫头也支持买PSP,她同样迷上了《RADGE RACERS》:)看来我下次再计划买什么电子设备,先把小丫头迷住就是了,嘿嘿……

7。已经记不得上次去电影院是什么时候的事情了,反正是上个世纪。于是元旦休息就去看了电影。片子是《无极》。选择《无极》的原因是想验证一下这部片子究竟有多差,看完后终于得到了结论——果然真的很差……不过对于影片的评价应该考虑到观众对影片的定位。比如,如果你把《无极》当作一部搞笑片来看,你也许觉得它还是比较成功的。单单北公爵无欢一句“你毁了我做一个好人的机会”就让我和丫头笑了整整一个星期:)

8。修正上面的一个错误,上次看电影的时间没有我想象中的那么遥远,不超过半年。《星球大战前传3:西斯的复仇》公映的时候,我和当时同屋的一个北大研究生去北大的礼堂看了。从此得到的教训是:好片子是一定要到电影院去看的,家庭影院效果再好,也比不上电影院的万分之一。更不要说电脑上马赛克全屏的盗版影片了。很后悔《Matrix》上映的时候没有去电影院看。只得下了一套Matrix三部曲聊以自慰。看来电影短期内是不可能被淘汰的,反而进化的可能性很大:)

9。下了《Matrix》三部曲,拼命的又看了若干遍。强烈推荐没有看过的去搞一套看看,看过的再看一遍:)一套《Matrix》三部曲就是一部哲学编年史。拯救——存在——涅磐,既是哲学发展的轨迹,更像是老先知的预言。看看沃卓斯基兄弟,再看看张艺谋陈凯歌,实在是无话可说……

10。徘徊在HP3715、HP4700、TH55、UX50之间。虽然早就决定下一台掌上电脑不再用palm,定要试试PPC的系统,但是依然举棋不定。现在又在考虑PSP,同时看上了818和Tero650……如果考虑都买下来呢,嘿嘿,也许我就要进入流亡状态了……

11。丫头早早的买到了车票,早早的回家了。学生就是好,就是好来就是好……我就只能等到年前才能回家了。昨天买到了回家的车票,临时列车,票价46元。可怕的是,发车时间居然是凌晨3:20。发愁怎么在火车站熬过五个钟头。计划去老鸟家骚扰一宿,结果被小白一句“当心撞见老鸟干坏事”打消了兴头。

12。上周末去买公司用的mp3设备。需要支持MTV和AMV播放功能。在某一家挑选的时候,一个售货员一个劲的向我推荐一款垃圾mp3,同时抛出一大堆“专业术语”向我“传授”MTV格式的相关“知识”,比如MTV的视频是如何“压缩”的之类。最后我实在听得很郁闷,就跟他说:我就是做这个的。结果,那位售货员愣了两秒,突然冒出来一句:“我也是搞这个的”。$#$@!~#@~!@!~@%$#^%%&^Y^他还怕没说清楚,又向我解释说他每天都帮客户转换多少MTV文件之类的…………差点没把跟我一起去的同事笑死。早知道当时就该笑死那小子,他也不会到公司大肆宣扬了~~~~~~~~~~

PS:来有必要经常更新blog,否则一次需要写得东西太多。嘿嘿,希望上面的那句话能够兑现,虽然我自己都记不得已经是第几次这样说了~~~~~~~~~~~~~


Posted by monkeycz at 11:46 | Read more | Comments (0) | Trackback (0) | Edit |

易语言核心runtime的loader和部分services的逆向工程 - []

易语言核心runtime的loader和部分services的逆向工程

下面的代码易语言核心runtime(核心支持库krnln.fne)的易格式loader和部分核心services的逆向工程分析。仅仅是逆向分析而已,代码没有经过任何优化。其他就没什么好说的了,具体就看代码吧。

注:和E-Code Explorer配合使用会有意想不到的效果:)


////////////////////////////////////////////////////////////
////  MicroLoader v0.01
////  filename:  MicroLoader.cpp
////  coder:   monkeycz
////  create time: 2005/09/29 23:21
////  fix time:  2005/10/21
////////////////////////////////////////////////////////////


#include "MicroLoader.h"

PIMAGE_DOS_HEADER DosHeader = NULL;
PIMAGE_NT_HEADERS NtHeader = NULL;
PIMAGE_SECTION_HEADER SectionHeader = NULL;
PAPP_HEADER_INFO ECodeHeaderInfo = NULL;
PSECTION_INFO ThisSectionInfo = NULL;
PRELOCATION_INF ThisRelocationInfo = NULL;
UINT32 NumberOfSections = 0;
UINT32 ESectionVA = 0;
char SectionName[IMAGE_SIZEOF_SHORT_NAME + 1];
UINT32 ServerPointTable[ESERVERCOUNT];

typedef void (__stdcall* ECODESTART)(void);
ECODESTART ECodeStart = NULL;

PFN_GET_LIB_INFO GetThisNewInfo = NULL;

PSECTION_INFO pConstSectionOffset = NULL;
PSECTION_INFO pWinFormSectionOffset = NULL;
PSECTION_INFO pHelpFuncSectionOffset = NULL;
PSECTION_INFO pCodeSectionOffset = NULL;
PSECTION_INFO pVarSectionOffset = NULL;

PDLLCMD DllCmdHead = NULL;
PDLLCMD ThisDllCmd = NULL;
UINT32 DllCmdNO = 0;

PLIBINFO LibInfoHead = NULL;
PLIBINFO ThisLibInfo = NULL;
LIBSTRINGINFO ThisLibStringInfo;
UINT32 LibCount = 0;

UINT32 SaveAAddress = 0;

typedef void (__stdcall* UNKNOWFUN)(void);
UNKNOWFUN UnKnowFun = NULL;
HMODULE ThisLibrary = NULL;

HANDLE ThisHeap = NULL;

char* LibStringHead = NULL;
char* ThisLibString = NULL;

char ThisLibFileName[256];

PFN_EXECUTE_CMD** ThisCmdsFuncHead = NULL;
UINT32 LibCmdNO = 0;

PFN_NOTIFY_SYS MyNotifySys = NULL;
PFN_NOTIFY_LIB ThisNotifyLib = NULL;

char* ThisCmdLine = NULL;

char FileName_Full[256];
char FileName_Name[256];
char FileName_Path[256];

typedef void (__stdcall* GETNEWSOCK)(UINT32 Param1);
GETNEWSOCK GetNewSock = NULL;

char ErrorString[256];

INT ThisBaseCmdOffset = -1;
PFN_EXECUTE_CMD* ThisExecuteCmdPoint = NULL;

//定义临时变量
UINT32 i = 0;
UINT32 temp = 0;
UINT32* ptemp = NULL;
bool FindOK = false;

//声明函数
void Exit(void);
void _cdecl ServerFunction_09(UINT32 Param1);
UINT32 _cdecl ServerFunction_06(UINT32 Param1);

//实现核心基本命令
void _cdecl bnot (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 pRetData->m_int = ~(pArgInf->m_int);
 pRetData->m_dtDataType = SDT_INT;
 return;
}

void _cdecl band (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 INT result = 0;
 result = pArgInf->m_int;
 for(int i = 1; i <= (nArgCount - 1); i++)
 {
  result = result & (pArgInf + i)->m_int;
 }
 pRetData->m_int = result;
 pRetData->m_dtDataType = SDT_INT;
 return;
}

void _cdecl bor (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 INT result = 0;
 result = pArgInf->m_int;
 for(int i = 1; i <= (nArgCount - 1); i++)
 {
  result = result | (pArgInf + i)->m_int;
 }
 pRetData->m_int = result;
 pRetData->m_dtDataType = SDT_INT;
 return;
}

void _cdecl bxor (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 INT result = 0;
 result = pArgInf->m_int;
 for(int i = 1; i <= (nArgCount - 1); i++)
 {
  result = result ^ (pArgInf + i)->m_int;
 }
 pRetData->m_int = result;
 pRetData->m_dtDataType = SDT_INT;
 return;
}

void _cdecl shl (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 pRetData->m_int = pArgInf->m_int << (pArgInf + 1)->m_int;
 pRetData->m_dtDataType = SDT_INT;
 return;
}

void _cdecl shr (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 pRetData->m_int = pArgInf->m_int >> (pArgInf + 1)->m_int;
 pRetData->m_dtDataType = SDT_INT;
 return;
}

void _cdecl pstr (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 char* ThisStr = NULL, *NewStr = NULL;
 UINT32 ThisStrLen = 0;
 
 ThisStr = (char*)pArgInf->m_int;

 try
 {
  ThisStrLen = strlen(ThisStr);
 }
 catch(...)
 {
  MessageBoxA(0, ERROR_021, "error", MB_ICONERROR);
  ServerFunction_09(0);
  return;
 }

 if(ThisStrLen != 0)
 {
  NewStr = (char *)ServerFunction_06(ThisStrLen + 1);

  memcpy(NewStr, ThisStr, ThisStrLen + 1);
 }
 else
 {
  NewStr = NULL;
 }
  
 pRetData->m_pText = NewStr;
 pRetData->m_dtDataType = SDT_TEXT;
 return;
}

void _cdecl pbin (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
 unsigned char* ThisBin = NULL, *NewBin = NULL;
 UINT32 ThisBinLen = 0, *NewBinHead = NULL;

 ThisBin = (unsigned char*)pArgInf->m_int;
 ThisBinLen = (UINT32)(pArgInf++)->m_int;

 if(ThisBinLen != 0)
 {
  NewBin = (unsigned char *)ServerFunction_06(ThisBinLen + 8);
  NewBinHead = (UINT32*)NewBin;

  memcpy(NewBin + 8, ThisBin, ThisBinLen);
  
  (*NewBinHead) = 0x0001;
  (*(NewBinHead++)) = ThisBinLen;
 }
 else
 {
  NewBin = NULL;
 }

 pRetData->m_pBin = NewBin;
 pRetData->m_dtDataType = SDT_BIN; 
 return;
}


//核心代码从这里开始:)

void Exit(void)
{
 if(DllCmdHead != NULL)
 {
  free(DllCmdHead);
 }
 
 if(LibInfoHead != NULL)
 {
  ThisLibInfo = LibInfoHead;
  for(UINT32 i = 1; i <= LibCount; i++)
  {
   if(ThisLibInfo->ThisLibHandle == NULL || ThisLibInfo->ThisLibInfo == NULL)
   {
    continue;
   }
   
   ThisNotifyLib = ThisLibInfo->ThisLibInfo->m_pfnNotify;
   if(ThisNotifyLib != NULL)
   {
    ThisNotifyLib(NL_FREE_LIB_DATA, 0, 0);
   }
   
   FreeLibrary(ThisLibInfo->ThisLibHandle);
   ThisLibInfo->ThisLibHandle = NULL;
   ThisLibInfo->ThisLibInfo = NULL;

   ThisLibInfo++;
  }
  
  free(LibInfoHead);
 }
 
 if(ThisHeap != NULL)
 {
  HeapDestroy(ThisHeap);
 }

}

__declspec(naked) void _cdecl ServerFunction_09(UINT32 Param1)
{
 __asm
 {
  push ebp
  mov ebp, esp
 }

 if(SaveAAddress != NULL)
 {
  UnKnowFun = (UNKNOWFUN)SaveAAddress;
  UnKnowFun();
 }

 Exit();
 
 ExitProcess(Param1); 
 
 __asm
 {
  ret
 }
}

INT WINAPI ThisNotifySys(INT nMsg, DWORD dwParam1 = 0, DWORD dwParam2 = 0)
{
 PMDATA_INF ThisDataInfo = NULL;
 void* temppoint= NULL;
 DWORD temp = 0;

 switch(nMsg)
 {
  case NAS_GET_APP_ICON:
   //通知系统创建并返回程序的图标
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NAS_GET_APP_ICON);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);   
   break;
  case NAS_GET_LIB_DATA_TYPE_INFO:
   //返回指定库定义数据类型的PLIB_DATA_TYPE_INFO定义信息指针
   temp = dwParam1;
   if((temp >> 30) == 0)
   {
    ThisLibInfo = LibInfoHead;
    ThisLibInfo += ((temp >> 16) - 1);
    return (INT)(ThisLibInfo->ThisLibInfo->m_pDataType + (((temp << 16) >> 16) - 1));
   }
   break;
  case NAS_GET_HBITMAP:
   //返回非NULL的HBITMAP句柄(注意使用完毕后释放),否则返回NULL
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NAS_GET_HBITMAP);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);   
   break;
  case NAS_GET_LANG_ID:
   //返回当前系统或运行环境所支持的语言ID
   return 1;
  case NAS_GET_VER:
   //返回当前系统或运行环境的版本号
   return 0x00000004;
  case NAS_GET_PATH:
   //返回当前开发或运行环境的某一类目录或文件名,目录名以“\”结束
   switch(dwParam1)
   {
    case 1:
     strcpy((char*)dwParam2, FileName_Path);
     return (INT)FileName_Path;
     break;
    case 2001:
     strcpy((char*)dwParam2, FileName_Path);
     return (INT)FileName_Path;
     break;
    case 2002:
     strcpy((char*)dwParam2, FileName_Name);
     return (INT)FileName_Name;
     break;
    default:
     return NULL;  
   }
  case NRS_UNIT_DESTROIED:
   //通知系统指定的单元已经被销毁。
   //和窗口组建相关,不处理。
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_UNIT_DESTROIED);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_CONVERT_NUM_TO_INT:
   //转换其它数值格式到整数
   ThisDataInfo = (PMDATA_INF)dwParam1;
   switch(ThisDataInfo->m_dtDataType)
   {
    case SDT_SHORT:
     return (int)(ThisDataInfo->m_short);
    case SDT_INT:
     return (int)(ThisDataInfo->m_int);
    case SDT_INT64:
     return (int)(ThisDataInfo->m_int64);
    case SDT_FLOAT:
     return (int)(ThisDataInfo->m_float);
    case SDT_DOUBLE:
     return (int)(ThisDataInfo->m_double);
    default:
     return 0;
   }
   break;
  case NRS_GET_CMD_LINE_STR:
   //取当前命令行文本
   return (INT)ThisCmdLine;
  case NRS_GET_EXE_PATH_STR:
   //取当前执行文件所处目录名称
   return (INT)FileName_Path;
  case NRS_GET_EXE_NAME:
   //取当前执行文件名称
   return (INT)FileName_Name;
  case NRS_GET_UNIT_PTR:
   //取单元对象指针
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_GET_UNIT_PTR);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_GET_AND_CHECK_UNIT_PTR:
   //取单元对象指针
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_GET_AND_CHECK_UNIT_PTR);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_EVENT_NOTIFY:
   //通知系统产生了事件
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_EVENT_NOTIFY);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  /*
  在新版本的支持库中不支持
  case NRS_STOP_PROCESS_EVENT_NOTIFY:
   //通知系统暂停处理事件通知
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_STOP_PROCESS_EVENT_NOTIFY);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_CONTINUE_PROCESS_EVENT_NOTIFY:
   //通知系统继续处理事件通知
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_CONTINUE_PROCESS_EVENT_NOTIFY);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  */
  case NRS_DO_EVENTS:
   //通知Windows系统处理所有已有事件
   //我不觉得这种处理方式很好,确定的说,是一种很差的处理方式
   Sleep(1);
   break;
  case NRS_GET_UNIT_DATA_TYPE:
   //成功返回有效的 DATA_TYPE
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_GET_UNIT_DATA_TYPE);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break; 
  case NRS_FREE_ARY:
   //释放指定数组数据
   //不会处理T_T,:(
   MessageBoxA(0, ERROR_020, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_MALLOC:
   //分配指定空间的内存,所有与易程序交互的内存都必须使用本通知分配
   temppoint = HeapAlloc(ThisHeap, 0, dwParam1);
   if(temppoint == NULL)
   {
    if(dwParam2 == 0)
    {
     MessageBoxA(0, ERROR_017, "error", MB_ICONERROR);
     ServerFunction_09(0);
     return 0;
    }
    else
    {
     return 0;
    }
   }
   return (INT)temppoint;
  case NRS_MFREE:
   //释放已分配的指定内存
   if(dwParam1 != NULL)
   {
    HeapFree(ThisHeap, 0, (void *)dwParam1);
   }
   break;
  case NRS_MREALLOC:
   //重新分配内存
   temppoint = HeapReAlloc(ThisHeap, 0, (void *)dwParam1, dwParam2);
   if(temppoint == NULL)
   {
    MessageBoxA(0, ERROR_018, "error", MB_ICONERROR);
    ServerFunction_09(0);
    return 0;
   }
   return (INT)temppoint;
  case NRS_RUNTIME_ERR:
   //通知系统已经产生运行时错误
   sprintf(ErrorString, "%s\n\nError String is %s", ERROR_019, (char*)dwParam1);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_EXIT_PROGRAM:
   //通知系统退出用户程序
   ServerFunction_09(dwParam1);
   break;
  case NRS_EVENT_NOTIFY2:
   //以第二类方式通知系统产生了事件
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_EVENT_NOTIFY2);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_GET_WINFORM_COUNT:
   //返回当前程序的窗体数目
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_GET_WINFORM_COUNT);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_GET_WINFORM_HWND:
   //返回指定窗体的窗口句柄,如果该窗体尚未被载入,返回NULL
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_GET_WINFORM_HWND);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_GET_BITMAP_DATA:
   //返回指定HBITMAP的图片数据,成功返回包含BMP图片数据的HGLOBAL句柄,失败返回NULL
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_GET_BITMAP_DATA);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;
  case NRS_FREE_COMOBJECT:
   //通知系统释放指定的DTP_COM_OBJECT类型COM对象
   //不支持COM对象,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_FREE_COMOBJECT);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break; 
  case NRS_CHK_TAB_VISIBLE:
   //当选择夹子夹被切换后, 使用本消息通知易系统
   //和窗口组建相关,不处理
   sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_016, NRS_CHK_TAB_VISIBLE);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
   ServerFunction_09(0);
   break;   
  case NRS_GET_PRG_TYPE:
   //返回当前用户程序的类型,为PT_DEBUG_RUN_VER(调试版)或PT_RELEASE_RUN_VER(发布版)
   return PT_RELEASE_RUN_VER;
  default:
   //如果发生例外,不处理
   break;
 }
 
 return 0;
}

bool Init(void)
{
 ThisHeap = HeapCreate(0, 0x1000, 0);
 if(ThisHeap == NULL)
 {
  return false;
 }

 MyNotifySys = ThisNotifySys;

 return true;
}

void _cdecl ServerFunction_00(UINT32 Param1)
{
 
 sprintf(ErrorString, "%s\n\nIntra error number is %d.", ERROR_006, Param1);
 MessageBoxA(0, ErrorString, "error", MB_ICONERROR);
 
 ServerFunction_09(0);
 
 return;
}

__declspec(naked) void _stdcall ServerFunction_01(void)
{

 __asm
 {
  pop temp
  push eax
  pop DllCmdNO
 }

 ThisDllCmd = DllCmdHead;
 ThisDllCmd += DllCmdNO;

 if((* ThisDllCmd->DllFileName) == NULL)
 {
  i = 0;
  while((* DefaultSystemAPI[i]) != NULL)
  {
   ThisLibrary = LoadLibrary(DefaultSystemAPI[i]);
   UnKnowFun = (UNKNOWFUN)GetProcAddress(ThisLibrary, ThisDllCmd->DllCmdName);
   if(UnKnowFun != NULL)
   {
    __asm
    {
     //call UnKnowFun
     //这个地方可能会引起杀毒软件的误报,如果有必要的话,需要处理一下
     push temp
     jmp UnKnowFun
    }
    break;
   }
   else
   {
    FreeLibrary(ThisLibrary);
    i++;
   }

  }

  if(UnKnowFun == NULL)
  {
   ServerFunction_00(0);
  }
  
 }
 else
 {
  ThisLibrary = LoadLibrary(ThisDllCmd->DllFileName);
  UnKnowFun = (UNKNOWFUN)GetProcAddress(ThisLibrary, ThisDllCmd->DllCmdName);
  if(UnKnowFun != NULL)
  {
   __asm
   {
    //call UnKnowFun
    push temp
    jmp UnKnowFun
   }
  }
  else
  {
   ServerFunction_00(0);
  }  
 }
 
 __asm
 {
  push eax
 }
 
 FreeLibrary(ThisLibrary);
 
 __asm
 {
  pop eax
  push temp
  ret
 }
 
}

__declspec(naked) void _cdecl ServerFunction_02(void)
{
 
 __asm
 {
  push ebp
  mov ebp,esp
  mov LibCmdNO,eax
 }
 ThisLibInfo = LibInfoHead;
 ThisLibInfo += LibCmdNO;
 if(ThisLibInfo->ThisLibHandle == NULL || ThisLibInfo->ThisLibInfo == NULL)
 {
  sprintf(ErrorString, "%s\n\nIntra error string is \"%s\".", ERROR_014, ThisLibInfo->ThisLibName);
  MessageBoxA(0, ErrorString, "error", MB_ICONERROR); 
  ServerFunction_09(0); 
 }
 ThisCmdsFuncHead = &(ThisLibInfo->ThisLibInfo->m_pCmdsFunc);
 __asm
 {
  mov edx,[ThisCmdsFuncHead]
  add ebx,[edx]
  lea edx,dword ptr ss:[esp+0x0c]
  sub esp,0x0c
  push edx
  push dword ptr ss:[esp+0x18]
  mov dword ptr ss:[esp+0x08],0
  mov dword ptr ss:[esp+0x0c],0
  mov dword ptr ss:[esp+0x10],0
  lea edx,dword ptr ss:[esp+0x08]
  push edx
  call dword ptr ds:[ebx]
  mov eax,dword ptr ss:[esp+0x0c]
  mov edx,dword ptr ss:[esp+0x10]
  mov ecx,dword ptr ss:[esp+0x14]
  mov esp,ebp
  pop ebp
  retn
 }
}

__declspec(naked) void _cdecl ServerFunction_03(void)
{
 
 __asm
 {
  push ebp
  mov ebp,esp
  mov LibCmdNO,0
  mov ThisBaseCmdOffset,ebx
 }
 temp = 0;
 FindOK = false;
 while(KernelBaseCmd[temp].CmdOffset != -1)
 {
  if(KernelBaseCmd[temp].CmdOffset == ThisBaseCmdOffset)
  {
   FindOK = true;
   ThisExecuteCmdPoint = &(KernelBaseCmd[temp].CmdPoint);
   break;
  }
  temp++;
 }
 if(FindOK == false)
 {
  ThisLibInfo = LibInfoHead;
  ThisLibInfo += LibCmdNO;
  if(ThisLibInfo->ThisLibHandle == NULL || ThisLibInfo->ThisLibInfo == NULL)
  {
   sprintf(ErrorString, "%s\n\nIntra error string is \"%s\".", ERROR_015, ThisLibInfo->ThisLibName);
   MessageBoxA(0, ErrorString, "error", MB_ICONERROR);  
   ServerFunction_09(0); 
  }
  ThisCmdsFuncHead = &(ThisLibInfo->ThisLibInfo->m_pCmdsFunc);

  __asm
  {
   mov eax,[ThisCmdsFuncHead]
   add ebx,dword ptr ds:[eax]
  }
 }
 else
 {
  __asm
  {
   mov ebx,ThisExecuteCmdPoint
  }
 }
 __asm
 {
  lea eax,dword ptr ss:[esp+0x0c]
  sub esp,0x0c
  push eax
  push dword ptr ss:[esp+0x18]
  xor eax,eax
  mov dword ptr ss:[esp+0x08],eax
  mov dword ptr ss:[esp+0x0c],eax
  mov dword ptr ss:[esp+0x10],eax
  lea edx,dword ptr ss:[esp+0x08]
  push edx
  call dword ptr ds:[ebx]
  mov eax,dword ptr ss:[esp+0x0C]
  mov edx,dword ptr ss:[esp+0x10]
  mov ecx,dword ptr ss:[esp+0x14]
  mov esp,ebp
  pop ebp
  retn 
 }

}

void _cdecl ServerFunction_04(void)
{
 MessageBoxA(0, ERROR_012, "error", MB_ICONERROR);
 ServerFunction_09(0);
 return;
}

void _cdecl ServerFunction_05(void)
{
 MessageBoxA(0, ERROR_013, "error", MB_ICONERROR);
 ServerFunction_09(0);
 return;
}

__declspec(naked) UINT32 _cdecl ServerFunction_06(UINT32 Param1)
{
 __asm
 {
  push ebp
  mov ebp,esp
  push ecx
  mov eax,Param1
  mov ecx,ThisHeap
 }
 HeapAlloc(ThisHeap, 0, Param1);
 __asm
 {
  mov dword ptr ss:[ebp-0x04],eax
  cmp dword ptr ss:[ebp-0x04],0
  jnz okey
 }
 MessageBoxA(0, ERROR_008, "error", MB_ICONERROR);
 ServerFunction_09(0);
 __asm
 {
okey:
  mov eax,dword ptr ss:[ebp-0x04]
  mov esp,ebp
  pop ebp
  retn
 }
}

__declspec(naked) UINT32 _cdecl ServerFunction_07(UINT32 Param1, UINT32 Param2)
{
 __asm
 {
  push ebp
  mov ebp,esp
  sub esp,0x0c
  cmp Param1,0
  jnz a
  mov eax,Param2
  push eax
  call ServerFunction_06
  add esp,0x04
  jmp end  
a:  
 }
 HeapReAlloc(ThisHeap, 0, (void *)Param1, Param2);
 __asm
 {
  mov Param1,eax
  cmp Param1,0
  jnz b
 }
 MessageBoxA(0, ERROR_010, "error", MB_ICONERROR);
 ServerFunction_09(0);
 __asm
 {
  
b:
  mov eax,Param1
end:
  mov esp,ebp
  pop ebp
  retn
 }
}

void _cdecl ServerFunction_08(UINT32 Param1)
{
 if(Param1 != 0)
 {
  HeapFree(ThisHeap, 0, (void *)Param1); 
 }

 return;
}

void _cdecl ServerFunction_10(UINT32 Param1)

 return;
}

void _cdecl ServerFunction_11(UINT32 Param1)
{
 MessageBoxA(0, ERROR_011, "error", MB_ICONERROR);
 ServerFunction_09(0);
 return;
}

void _cdecl ServerFunction_12(UINT32 Param1)
{
 SaveAAddress = Param1;
 return;
}

void InitServerPointTable(void)
{
 ServerPointTable[0] = (UINT32)ServerFunction_00;
 ServerPointTable[1] = (UINT32)ServerFunction_01;
 ServerPointTable[2] = (UINT32)ServerFunction_02;
 ServerPointTable[3] = (UINT32)ServerFunction_03;
 ServerPointTable[4] = (UINT32)ServerFunction_04;
 ServerPointTable[5] = (UINT32)ServerFunction_05;
 ServerPointTable[6] = (UINT32)ServerFunction_06;
 ServerPointTable[7] = (UINT32)ServerFunction_07;
 ServerPointTable[8] = (UINT32)ServerFunction_08;
 ServerPointTable[9] = (UINT32)ServerFunction_09;
 ServerPointTable[10] = (UINT32)ServerFunction_10;
 ServerPointTable[11] = (UINT32)ServerFunction_11;
 ServerPointTable[12] = (UINT32)ServerFunction_12;
}

void UpdataServerPointTable(void)
{
 ptemp = (UINT32 *)((UINT32)ECodeHeaderInfo + pHelpFuncSectionOffset->m_nRecordOffset);
 for(i = 0; i <= ESERVERCOUNT - 1; i++)
 {
  (* ptemp) = ServerPointTable[i];
  ptemp++;
 }
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 
 //初始化内部堆栈
 if(Init() == false)
 {
  MessageBoxA(0, ERROR_009, "error", MB_ICONERROR);
  return 0;
 }

 //得到当前命令行
 ThisCmdLine = lpCmdLine;
 
 //获取当前运行环境
 GetModuleFileName(NULL, FileName_Full, 256);
 strcpy(FileName_Name, PathFindFileName(FileName_Full));
 temp = strlen(FileName_Full) - strlen(FileName_Name);
 memcpy(FileName_Path, FileName_Full, temp);
 FileName_Path[temp] = 0;

 
 //获取当前进程基址,遍历SectionTable查找易格式原体
 DosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(NULL);
 
 if(DosHeader == NULL)
 {
  MessageBoxA(0, ERROR_001, "error", MB_ICONERROR);
  return 0;
 }

 NtHeader = (PIMAGE_NT_HEADERS)((UINT32)DosHeader + DosHeader->e_lfanew);
 NumberOfSections = NtHeader->FileHeader.NumberOfSections;
 
 SectionHeader = (PIMAGE_SECTION_HEADER)((UINT32)NtHeader + sizeof(IMAGE_NT_HEADERS));

 FindOK = false;
 for(i = 1; i <= NumberOfSections; i++)
 {
  
  memcpy(SectionName, SectionHeader->Name, IMAGE_SIZEOF_SHORT_NAME);
  SectionName[IMAGE_SIZEOF_SHORT_NAME + 1] = 0;

  //寻找易格式所在节的方法是:简单的比较当前SectionName是否是“.ecode”
  if(strcmp(SectionName, ESECTIONNAME) == 0)
  {
   //找到了易格式所在的节
   FindOK = true;
   break;
  }

  SectionHeader++;

 }
 
 if(FindOK == false)
 {
  MessageBoxA(0, ERROR_002, "error", MB_ICONERROR);
  return 0;
 }
 
 //定位易格式原体,取易格式原体所在节的基址
 ESectionVA = (UINT32)DosHeader + (UINT32)SectionHeader->VirtualAddress;
 ECodeHeaderInfo = (PAPP_HEADER_INFO)ESectionVA;

 if(ECodeHeaderInfo == NULL)
 {
  MessageBoxA(0, ERROR_003, "error", MB_ICONERROR);
  return 0;
 }

 if(ECodeHeaderInfo->m_dwMark != NEW_E_APP_MARK)
 {
  MessageBoxA(0, ERROR_004, "error", MB_ICONERROR);
  return 0;
 }

 //获取易格式初始化必需的的数据

 //获取各个重要数据段的RVA
 pConstSectionOffset = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + ECodeHeaderInfo->m_nConstSectionOffset);
 pWinFormSectionOffset = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + ECodeHeaderInfo->m_nWinFormSectionOffset);
 pHelpFuncSectionOffset = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + ECodeHeaderInfo->m_nHelpFuncSectionOffset);
 pCodeSectionOffset = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + ECodeHeaderInfo->m_nCodeSectionOffset);
 pVarSectionOffset = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + ECodeHeaderInfo->m_nVarSectionOffset);
 
 //获取DLL命令信息数组
 if(ECodeHeaderInfo->m_nDllCmdCount > 0)
 {
  DllCmdHead = (PDLLCMD)malloc(sizeof(DLLCMD) * ECodeHeaderInfo->m_nDllCmdCount);
  if(DllCmdHead == NULL)
  {
   MessageBoxA(0, ERROR_007, "error", MB_ICONERROR);
   return 0;
  }

  ThisDllCmd = DllCmdHead;

  for(i = 1; i <= (UINT32)ECodeHeaderInfo->m_nDllCmdCount; i++)
  {
   ThisDllCmd->DllFileName = (char *)((UINT32)ECodeHeaderInfo + pConstSectionOffset->m_nRecordOffset + (*(UINT *)((UINT32)ECodeHeaderInfo + sizeof(APP_HEADER_INFO) + (i - 1) * sizeof(INT))));
   ThisDllCmd->DllCmdName = (char *)((UINT32)ECodeHeaderInfo + pConstSectionOffset->m_nRecordOffset + (*(UINT *)((UINT32)ECodeHeaderInfo + sizeof(APP_HEADER_INFO) + (i + ECodeHeaderInfo->m_nDllCmdCount - 1) * sizeof(INT))));
   
   ThisDllCmd++;
  }

 }
 
 //获取需要的支持库并加载
 LibStringHead = (char *)((UINT32)ECodeHeaderInfo + sizeof(APP_HEADER_INFO) + ECodeHeaderInfo->m_nDllCmdCount * sizeof(INT) * 2);

 //统计需要加载的支持库数量
 ThisLibString = LibStringHead;
 LibCount = 0;
 while((* ThisLibString) != NULL)
 {
  LibCount++;
  ThisLibString += (strlen(ThisLibString) + 1);
 }

 //加载支持库
 LibInfoHead = (PLIBINFO)malloc(sizeof(LIBINFO) * LibCount);

 ThisLibInfo = LibInfoHead;

 ThisLibString = LibStringHead;

 while((* ThisLibString) != NULL)
 {
  temp = 0;
  while((* (ThisLibString + temp)) != 0x0d)
  {
   ThisLibStringInfo.LibName[temp] = (* (ThisLibString + temp));
   temp++;
  }
  ThisLibStringInfo.LibName[temp] = 0;

  temp += 1;
  while((* (ThisLibString + temp)) != 0x0d)
  {
   ThisLibStringInfo.ThisGUID[temp - strlen(ThisLibStringInfo.LibName) - 1] = (* (ThisLibString + temp));
   temp++;
  }
  ThisLibStringInfo.ThisGUID[temp] = 0;
  
  ThisLibInfo->ThisLibHandle = NULL;
  ThisLibInfo->ThisLibInfo = NULL;
  strcpy(ThisLibInfo->ThisLibName, ThisLibStringInfo.LibName);
  
  strcpy(ThisLibFileName, ThisLibStringInfo.LibName);
  strcat(ThisLibFileName, ".fne");

  FindOK = false;

  ThisLibInfo->ThisLibHandle = LoadLibrary(ThisLibFileName);
  if(ThisLibInfo->ThisLibHandle == NULL)
  {
   strcpy(ThisLibFileName, ThisLibStringInfo.LibName);
   strcat(ThisLibFileName, ".fnr");

   FindOK = false;
   
   ThisLibInfo->ThisLibHandle = LoadLibrary(ThisLibFileName);

   if(ThisLibInfo->ThisLibHandle == NULL)
   {
    //没有加载成功,继续加载下一个支持库
   }
   else
   {
    FindOK = true;
   }

  }
  else
  {
   FindOK = true;
  }
  
  //加载成功,开始获取支持库信息
  if(FindOK == true)
  {
   GetThisNewInfo = (PFN_GET_LIB_INFO)GetProcAddress(ThisLibInfo->ThisLibHandle, FUNCNAME_GET_LIB_INFO); 
   
   //初始化核心支持库
   GetNewSock = (GETNEWSOCK)GetProcAddress(ThisLibInfo->ThisLibHandle, FUNCNAME_GET_NEW_SOCK);
   
   if(GetNewSock != NULL)
   {
    //这是一段罪恶的代码,江山从此易主。希望新版本的核心支持库能分离初始化函数和加载函数
    GetNewSock(1000);
    __asm
    {
     pop edx
     mov edx,ESectionVA
     push edx 
     call eax   
    }
    Exit();
    return 0;
   }
   
   if(GetThisNewInfo == NULL)
   {
    //载入的库没有输出FUNCNAME_GET_LIB_INFO函数,需要卸载掉
    FreeLibrary(ThisLibInfo->ThisLibHandle);
    ThisLibInfo->ThisLibHandle = NULL;
   }
   else
   {
    ThisLibInfo->ThisLibInfo = GetThisNewInfo();

    if(ThisLibInfo->ThisLibInfo == NULL)
    {
     //输出的PLIB_INFO结构为空,需要卸载这样的支持库
     FreeLibrary(ThisLibInfo->ThisLibHandle);
     ThisLibInfo->ThisLibHandle = NULL;
     ThisLibInfo->ThisLibInfo = NULL;
    }
    else
    {
     if(strcmp(ThisLibInfo->ThisLibInfo->m_szGuid, ThisLibStringInfo.ThisGUID) != 0)
     {
      //加载的支持库和需要的支持库GUID不同,需要卸载支持库
      FreeLibrary(ThisLibInfo->ThisLibHandle);
      ThisLibInfo->ThisLibHandle = NULL;
      ThisLibInfo->ThisLibInfo = NULL;
     }
     else
     {
      //为当前支持库提供Notify函数指针
      ThisNotifyLib = ThisLibInfo->ThisLibInfo->m_pfnNotify;
      if(ThisNotifyLib != NULL)
      {
       ThisNotifyLib(NL_SYS_NOTIFY_FUNCTION, (DWORD)MyNotifySys, 0);
      }

     }

    }   
   }
  }


  ThisLibInfo++;
  
  ThisLibString += (strlen(ThisLibString) + 1);
 }

 
 //获取易格式代码的起始指令地址
 ECodeStart = (ECODESTART)((UINT32)ECodeHeaderInfo + (UINT32)ECodeHeaderInfo->m_nStartCodeOffset);
 
 if(ECodeStart == NULL)
 {
  MessageBoxA(0, ERROR_005, "error", MB_ICONERROR);
  return 0;  
 }
 
 //遍历易格式中所有的数据段,对每个数据段中的重定位信息进行校正
 temp = (UINT32)ECodeHeaderInfo->m_nBeginSectionOffset;
 
 while(temp != 0xFFFFFFFF)
 {
  ThisSectionInfo = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + temp);
  
  if(ThisSectionInfo->m_nReLocationItemCount > 0)
  {
   ThisRelocationInfo = (PRELOCATION_INF)((UINT32)ThisSectionInfo + sizeof(SECTION_INFO));
   for(i = 1; i <= (UINT32)ThisSectionInfo->m_nReLocationItemCount; i++)
   {
    
    ptemp = (UINT32 *)((UINT32)ECodeHeaderInfo + ThisSectionInfo->m_nRecordOffset + ThisRelocationInfo->m_dwOffset);
    
    switch(ThisRelocationInfo->m_btType)
    {
     case RT_HELP_FUNC: 
      (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pHelpFuncSectionOffset->m_nRecordOffset;
      break;
     case RT_CONST:
      (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pConstSectionOffset->m_nRecordOffset;
      break;
     case RT_GLOBAL_VAR:
      (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pVarSectionOffset->m_nRecordOffset;
      break;
     case RT_CODE:
      (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pCodeSectionOffset->m_nRecordOffset;
      break;
     default:  
      break;
    }

    ThisRelocationInfo++; 
   }
  }
  temp = (UINT32)ThisSectionInfo->m_nNextSectionOffset;
 }

 //初始化服务指针表
 InitServerPointTable();
 UpdataServerPointTable();

 //至此初始化操作全部完成,转交控制权给易程序
 ECodeStart();

 //清除内部堆栈,准备结束
 Exit();

 return 0;
}


/////////////////////////////////////////////////////////////////////////


上面的代码也是ZanMoon计划(斩月计划)的核心组件MicroLoader的源代码,关于ZanMoon计划,详情请登陆http://monkeycz.blogbus.com

关于版权问题:由于涉及到部分头文件的版权问题,我没有发布完整的工程,请大家见谅。这个项目的全部工程,除引用和包含的第三方文档、代码外,全部源代码符合GPL规范。


monkeycz
2005/11/13


Posted by monkeycz at 22:40 | Read more | Comments (1) | Trackback (0) | Edit |

斩月计划,分离核心支持库,打造小于30k的易程序 - []

斩月计划,分离核心支持库,打造小于30k的易程序

天锁斩月(ZanMoon),是这个计划的名称。

明白这个名字来历的朋友也许就会会心一笑了。内容大致就是使易语言编译出来的可执行文件脱离runtime核心支持库运行。这样就不用每次发布软件的时候带上一个庞大的支持库了。让易语言编写的程序也可以小于30k。易语言不能编写真正的SDK程序(其实原先也是可以的,但是如果SDK程序还要依赖于某种特定的runtime的话,SDK也就没有任何意义了)、Keygen程序(你不愿意看到发布一个比软件本身还要庞大的kengen吧)、甚至xx程序(有大于200k的xx程序么?也许有,但是效果呢)的历史即将结束。

大致计划实现个功能:
1。不依赖于核心支持库。可以在98/2000/xp/2003系统上完全独立运行。一个空程序的大小将小于30k。
2。可以调用支持库中的命令,但是发布的时候需要带上用到的库。和原先最大的区别是,没有使用的支持库不用发布。
3。可以调用DLL命令。
4。不能使用易语言的任何窗口组件(其实也是可以实现的,不过需要老吴支持才行:))。但是提供了另一种创建窗口的方法,即ZanMoon Class Library(ZCL)。一个类库。封装常用的窗口类API和系统API。

发布的样式:
将以ZanMoon Development Kit(ZDK)的形式发布。完整的开发包中将提供:
1。MicroLoader,核心组件,加载程序和提供服务函数。
2。ZanMoon Class Library,斩月类库,提供常用的窗口类和系统API函数的封装。
3。一个封装程序。

由于计划的工作量比较大,希望有能力的朋友予我帮助。

希望大家能够支持,您的支持是对我最大的鼓励。如果有问题和建议,请跟帖。

我的网站是:http://monkeycz.pediy.com
我的BLOG是:http://monkeycz.blogbus.com
有关ZDK的最新消息将在上面的网站公布。

下面压缩包中的文件,是易语言的源代码和采用ZDK开发的易程序。分别演示了DLL命令,数组操作,逻辑运算,算数运算,逻辑流程,异常处理等功能。最终的可执行文件是32k。请大家下载测试。

monkeycz
2005/10/09


Posted by monkeycz at 11:40 | Read more | Comments (7) | Trackback (0) | Edit |

E-Code Explorer 0.80版 正式发布 - []
E-Code Explorer 0.80版 正式发布,强烈推荐!!!

反汇编调试由易语言编译生成的易格式可执行文件,分析内部结构,查看其中的各项数据。


下载地址:http://monkeycz.pediy.com

【功能简介】
1。格式分析:分析易格式可执行文件的总体结构,查看对应项的数据。分别对PE骨骼(PE头)和易格式原体分析,以树形结构清晰的显示,同时辅以详细的分析表格。
2。反汇编分析:快速的静态反汇编易格式可执行文件。提供方便的跳转、调用目标地址的代码预览功能。
3。窗体分析:对易格式可执行文件中包含的窗体数据分析。以树型结构清晰的显示窗体单元的从属结构。详细的控件属性显示、准确的事件处理函数定位、与反汇编模式便捷的切换,让使用者可以立即进入要调试的事件函数领空,避免在runtime的空间里四处打转浪费时间。这一点对于调试非线性事件驱动类型的程序是必须的。
4。符号修饰:可以调用易语言支持库作为符号表,对反汇编后的代码进行修饰,可以直接分析出函数所调用的方法,操作的属性,使用到的常量、基本数据类型、自定义数据类型和窗口单元。极大地提高了代码的可读性。
5。内部数据分析:能够分析出程序使用到的常量、API函数、服务,调用的支持库。
6。多种加载方式:支持从文件加载和从某一进程的内存中直接加载反汇编。直接从进程列表附加,可以避免一部分AntiDebug造成的调试困难。
7。支持多种格式:支持标准PE可执行文件,易格式原体文件,其他类型的易格式文件。均可正确分析。
8。易格式捕捉者:对于不明外壳的易格式可执行文件(如:加壳后的,通过其它手段封装的),能够方便快速的进行分析。
9。提供十六进制文件查看功能。
10。提供多种辅助工具,完成从内存dump易格式原体、修复重定位信息、易格式原体生成EXE文件等功能。
11。分析结果和反汇编结果均可直接导出生成报告文件。
12。支持自定义反汇编,HEX查看的环境颜色,你可以选择自己喜欢的颜色来阅读代码。
13。详细的分析设置,可以自己设置最合适的调试环境。
14。提供文件拖放功能,直接进行分析或调试。
15。支持从命令行获取要分析的文件。
其他更多的功能等待您在使用中发现…………


【升级历史】
★0.80版 - 2005年09月26日
1。加入了反汇编功能。支持地址转跳、调用跟踪返回、目标地址代码预览、符号修饰、自定义环境颜色等功能。
2。加入了窗体数据分析功能。可以直接显示控件列表及其属性、事件、事件处理函数。
3。加入了符号库分析功能。支持标准的带调试信息的易语言支持库作为符号文件。
4。加入了全局符号修饰功能。可以修饰核心服务、全局方法、常量、基本数据类型、自定义数据类型、窗体控件。
5。加入了更多的分析设置选项。方便自行设置调试环境。
6。加入了颜色设置,可以对反汇编部分和十六进制文件查看部分设置环境颜色。
7。修改整体界面结构,支持窗口缩放和最大化。一些经常用到的窗口还支持“总在最前”的功能。
8。新设计的软件“关于”画面和启动闪屏画面。
9。改进了十六进制查看器的算法,大幅提高了查看速度。同时修改了拖拽显示,使其定位准确。
10。加入了几个新的分析报告表格,分析结果更加详尽。
11。修正了若干BUG,提高了软件的稳定性和准确性。
★0.70版 - 2005年02月06日
1。加入了从进程中载入程序分析。同时可以查看到详细的进程信息。
2。加入了“易格式捕捉者”功能,可以通过特征码字自动从当前文件(或进程)中捕捉到易格式数据,供用户有选择的载入分析。
3。加入了“选择打开对象”面板,通过面板选择从何处(文件或进程)载入程序。
4。在“内容观察”窗口,加入了“显示中文”功能。可以使显示的字符在英文和中文之间切换。
5。修改了“内容观察”窗口的布局,使之更加合理。
6。修改了“树型视图”面板,加入了图标对项目进行修饰。改进了m_szLibString部分的显示方式。
7。修改了“分析设置”窗口的布局,使之支持“易格式捕捉者”功能。
8。对软件的界面作了小幅度的修改,去掉了原先的“载入文件栏”,加入了菜单和工具条。同时对部分控件的显示样式进行了修改。
9。加入了对文件拖放的支持。
10。加入了对命令行的支持。
★0.60版 - 2004年11月14日
1。加入了“分析设置”功能,可以选择分析文件的类型和设置文件所包含易格式的偏移。支持易格式原体文件的载入。
2。加入了“工具箱”功能,其中包含了若干实用工具。
3。加入了“导出易格式原体”功能,可以将当前分析的易格式数据导出保存为易格式原体文件。也可结合分析设置中的易格式偏移设置,将任何文件中包含的易格式数据导出。
4。加入了“易格式原体植入PE骨骼”功能,可以将易格式原体包装生成可用的PE可执行文件。目前尚不支持生成DLL文件。
5。加入了“易格式重定位信息修复”功能,可以根据用户提供的重定位基址重新设定当前载入的易格式原体中的重定位信息。
6。加入了“关闭当前分析的文件”功能。
7。加入了“导出分析报告”的功能。
8。为了添加新的功能,在原有基础上稍微修改了一下界面。
9。软件图标采用了自行设计的新图标。图标上的“EcE”即“E-Code Explorer”的缩写。
★0.54版 - 2004年10月23日
1。修正了DataDirectory中的一个非常低级的错误(又是非常低级的,该打)。成员错位,读取VirtualAddress和isize的时候弄反了。
★0.53版 - 2004年10月21日
1。修正了重定位信息中的一个非常低级的错误。居然把高低位弄反了,怪不得以前算出的重定位信息总是不对。
★0.52版 - 2004年10月17日
1.对易格式常量数据段提供了更好的支持,可以查看、导出在程序中被使用的所有常量数据。
2.可以查看所有在程序中被调用的动态链接库和动态链接库命令。
3.修正了“查看文件内容”功能中的若干定位错误。
★0.50版 - 2004年10月14日
1.第一款易格式可执行文件分析器诞生了。
2.完成了对windows操作系统下易格式封装的可执行文件的PE结构和易格式结构的基本分析。可以查看文件的各个数据结构,以十六进制方式查看文件的各个部分。
3.具有详尽清晰的树形视图查看功能。


monkeycz
2005/09/26


Posted by monkeycz at 13:53 | Read more | Comments (3) | Trackback (0) | Edit |

正义、真实…… - []

东仙要在和更木剑八决斗的时候,回忆道:“如果光有正义还不够的话,那我愿意成为那名为正义的东西”。东仙要对剑八敌视的理由光明堂皇,因为剑八是“不正义的存在”,“扰乱了”他们所维持的“和平”。所以,东仙要“赌上我全部的正义”,消灭剑八。

正义一旦由抽象概念演变为具体实在,由如一座高不可攀的山峰横在前面,正义将不复存在。

单纯的剑八使用的解决方法同样很单纯——挥剑砍下去。

狛村对剑八的评价是:“总是追求表面的强壮,不能看透敌人更深层的力量。”何止是单纯如剑八者,自信手握正义是正义的化身如东仙者,身为非人以边缘姿态现身如狛村者,等等如是众者,又何尝能看得透真实。

真实往往隐藏于极深层的地方,人们终其一生,也难窥其冰山一角。

真实是最难看清楚的东西。正因为看不清楚,所以才不可妄下结论。


Posted by monkeycz at 11:23 | Read more | Comments (0) | Trackback (0) | Edit |

[转贴]死神十四大难忘对白评选 - []

1
面对迎面而来的虚,井上所做的却是张开双臂……她所迎接的——那是曾经的兄长啊!
“有生以来我和哥哥第一次的吵架,那天在哥哥出门时,我什么也没有对他说……最后……”这段话不得不我想起《水果篮子》里的小透,同样的理由;同样的结果。虽有些落入了俗套,但这却是《死神》所带给我们第一个感情的冲击。
“身为大哥,你知道为什么你是第一个出生的吗?那是为了保护后来出生的弟妹啊!”同为长子的一护,他所说出的这句话每一个字都蕴含着自己对两个妹妹的爱。在这句话的感召下,在井上诚信的歉意中,已化身为虚的井上兄长找回了一丝的人性,摘下面具的他一如妹妹记忆中的那样和蔼可亲,作为虚的他在生命的最后得到了妹妹最后那歉意的送行:
一句“你慢走……” 
《死神》第六话——microcrack——排名十四。 

2
在自己温柔队长的卧室里面睡着,起晚的小桃像孩子一样的跳过栅栏抄了进路,等待着她的却是……
“你要小心三番队,特别是蓝染独自外出的时候。”小白的话让她雏森在情急之中把矛头直指在一旁含笑的市丸,漫画中首次展现了这位我们眼中为了填补《死神》众多人物中“罗莉”空白的副队发飙的一幕。
“我叫你让开!你听不懂嘛!”面对保护自己队长的吉良,桃早已失去理智。伴随着两人斩魄刀的双双解放,一场副队长之间的战斗就要打响……
虽然小白及时赶到制止了两人,但看到蓝染惨死的一刹那,小桃撕心裂肺的叫声已经深深的烙印在我们心中:
一句“啊啊啊啊啊啊啊啊啊啊啊啊啊!”(我数了,是十三个,不过是不是这个有点……)
《死神》第一百零一话——Split Under The Red Stalk——排名十一三。 

3
有什么能让雏森丧失所有应有的理智,抛开任何应做的思考?
出现在眼前的蓝染给了我们一个早已知晓的答案——“好久不见了呢…雏森君”一句平平常常的问候就像一杯毒酒完全洗刷了雏森的大脑,面对眼前出现的蓝染,她只是完全陷入这飞来的横“福”,为什么蓝染没死?为什么中央四十六室的人会全灭?这些在雏森眼中已不再重要,能重新看到活着的蓝染才是对她来说最重要的,还是昔日那个性情温和的队长。然而在这位温和的队长怀中,她却再也没有机会察觉自己将要遇到的险境……
令所有人跌破眼镜的剧情转折——98堪称最邪恶的一个铺垫——死神中唯一一个“罗莉”的被刺(这句话好像多余了),连这样无法预见的的事情都能够发生!今后的剧情又会如何发展?
“蓝染队长的手跟以往一样洗涤了我的心”雏森这样陶醉着,而蓝染也一如既往地这样做着,只不过这一次——是用手中的斩魄刀——
一句“再见” 
《死神》第一百六十九话——end of hypnosis——排名十二。 

4
“店长,有只猫…”顺着小雨所指的方向,一只黑得发亮的猫出现在了漫画第159页的左上角,浦原一如往常耍保似的冲过去一把抓起这只猫,兴奋的举高了它。但是谁能了解这其中又包含了多少辛酸的回忆……“这不是夜一嘛!你回来啦!”毕竟这次“回来”不知历经了几十年的光阴甚至更多。“店长唯一的亲人是只猫啊…看来他真是可怜。”甚太的这句话在当时只被我们看作98的调侃。但看过后面的剧情的人都知道:这句话正因为曾经的那段辛酸而显得如此伤感。
当浦原伸向灵子转换器的手被无情的弹回时,当夜一与浦原站在店门外无奈的等待面具军团到来时,尤其当夜一回忆两人当初一起在尸魂界修行时。我们的思绪总免不了再次回到那个重逢的时候…
一句“举高高!” 
《死神》第五十一话——DEATH——排名十一。 

5
“刚才你是真的想杀了我吧?”“那不是当然的嘛!我可是一直很努力的追杀着你啊。”
两把斩魄刀,两个目标一致的男人——救出露琪亚!这个目标就像一护讲的一样:“不是‘想救她’…而是‘要救她’!!”在面对强大的对手阿散井恋次时,一护回想起了浦原的那一番话:
躲避时“会被斩到的恐惧”;攻击时“会斩到对手的恐惧”;就连在保护别人时,也充满“会死掉的恐惧”,你的刀让我看到的全是无聊的恐惧。这是不对的!战斗所需要的并不是“恐惧”,它什么也创造不了……
决心!
一护突然爆发的灵压向周围所有人标志着他的决心——不管他冠以谁的名义,那份决心只属于等待他去拯救病只有他能够拯救的——露琪亚!
带着:
躲避时要“不让对方斩杀”!;保护别人时要“不可以死掉”!;攻击时要“将其斩杀”!
这样的决心,一护战胜了恋次,这成为剧情转折的一战。
伴随着红姬与斩月的共鸣:
一句:“看到吗?我剑上所反映的——是‘将你杀掉’的‘决心’。” 
《死神》第九十七话——Talk About Your Fear——排名第十。 

6
他哭了,虽然是在雨中,但我们还是能看出那不是雨水,而是泪……一护第一次的落泪。
“为什么你们还笑得出来?为什么没有人责备我?”一护带着这样的自责走过了6个年头,在他心中,早已把母亲的死全盘归为了自己的过失,那一场雨夜是他一直以来抹不掉的伤痛。在他的心目中大家的莫名宽容反而成了他的负担。
一个成长至此的硬汉第一次在我们面前流下了眼泪。也许他要的是大家痛快的责骂,那在他看来也许是更好的解脱。
“为什么要责备你?”父亲的话语里面找不到丝毫的责备“如果因为真关的死责备你的话,真关她会骂我的!”,一句让我们和主角都如此惊讶的回答,顷刻间化解了悲伤的气氛。事情就是这样:谁也没有错,只是一位被丈夫深爱着的母亲为了保护自己的孩子而死。疑虑没有了,深陷自责的人生到此结束,全新的生活就此开始!
一句“不要忘记,你是你母亲用生命换回来的男人。” 
《死神》第九话——The Gigar Blues Mix——排名第九。 

7
面对自己到达尸魂界后遇到的第一个队长级的敌人,雨龙完全没有赢的自信……
“在我研究过程中,每个人都曾这么说!以我灭却师的信念,我不能那样做!以我灭却师的信念,我不允许你那样做!每个人都很烦啊!”涅眼中的灭却师终归只是一种研究的材料,为自己那些BT的研究他一直都是不择手段,而他的实验也是无比的残忍。随手扔给雨龙的照片(真服了他!还一直随身携带)却换来自己走向毁灭的道路。
这个人是雨龙的师傅,也是他的亲曾祖父——那位因为死神的故意迟来而死掉的雨龙世上唯一最亲的人!“乱装天傀”下,雨龙的决心已定,一场“不想让井上看到的战斗”将会如何激烈?
再一次违背了自己至亲的人的教诲,舍弃身为灭却师的生命时间,他要换回的又是什么?我们能从这句话里找到答案:
一句“赌上我灭却师的信念…我要…除掉你。”
《死神》第一百二十三话——Pledge My Pride To——排名第八。

8
一步一步迈向敌人……恋次手中紧握着的不是斩魄刀……而是和露琪亚昔日的回忆……
“露琪亚终于有家人了……不可以妨碍她…不可以妨碍她”自卑感酿成了恋次如今的无尽懊悔。百年来对朽木白哉那种“只望其背”的敬畏,也许说成“惧怕”更贴切,让恋次不知何时开始离昔日的女伴越来越远。
自己的胆小他无法认同!露琪亚的死刑她无法接受!而这一切事情的原因——夺走露琪亚死神能力的黑崎他更是无法原谅!!
但是,一个男人在什么时候会放下自己那早已架空的自尊呢?恋次向所有的人作了如此的诠释——为了自己爱着的女人!
一句“…请你…一定要救出露琪亚…!!” 
《死神》第九十八话——星星与野狗——排名第七。 

9
面前的这个人正是露琪亚折回来想拯救的伙伴,但是面对他迎面而来,露琪亚却不得不举起手中的斩魄刀……
志波海燕,这个黑发版的黑崎一护出场似乎只是为了引出露琪亚那一段伤心的回忆。一位值得尊敬的副队长,在一场战斗中——一场露琪亚亲眼目睹的战斗中——一张露琪亚无法插手的战斗中走完了自己生命的最后一刻。
当海燕被虚俯身失去理智,当他危及浮竹的生命,当他扑向折回来露琪亚……还能有什么挽回的余地吗?露琪亚举起刀剑迎接的究竟是队友还是敌人?这个困扰着她的问题至今没有解开……
“队长…非常感谢您…让我…独自面对它”
“朽木…因为我的任性…让你遇到这种事…抱歉。”
这位尸魂界名门之后在生命的最终时刻留下的这几句话,深深的烙印在露琪亚心中,也令无数的漫迷心痛。露琪亚这么做究竟是否正确的?
一句“谢谢你。”
《死神》第一百三十六话——night of wljnruit——排名第六。 

10
“为什么还是赢不过你?为什么你还是持续的支配着我?回答我夜一!”
碎蜂与夜一的战斗中,从一开始就夹杂了太多的回忆跟感情。四大贵族“四枫院”家与下级贵族“蜂家”自古以来就代代有着割不断的联系,继承曾祖母的名号加入刑军的碎蜂更是对当时的领袖——四枫院夜一有着超越憧憬的崇拜。
“我没有一丝迷茫,真的很高兴,就算处于激烈的战斗中也只觉得幸福,要为了这一位而死,我好几次好几次在心里非常强烈的这样发誓着”对碎蜂而言,夜一也不单单是她的上司,而是已经成为了她身边的的全部——直到这个“全部”在那一天全部离她而去……
带着多年来的恨、诅咒,碎蜂不断的追求着更强的力量,而在她渴望超越的这个人身上,我们找不到她所说的恨与诅咒,找都得却只是藏在内心深处那份日日夜夜的思念……
“我,无法原谅你夜一!你背叛我对你的尊敬与信赖!我绝不原谅!”碎蜂的这些话里面所包含的是什么感情?真的有诅咒吗?真的有恨吗?还是没有?为什么?“为什么?……”
一句“为什么…您不带我一起走呢…!” 
《死神》第一百五十九话——LONG WAY TO SAY GODDBYE——排名第五。

11
“这个灵压是什么回事?很明显是队长级的!但我没有过感受过这个灵压!是谁?”
浮竹的这段话让气氛一下子紧张起来,在他看来,能拥有队长级灵压的陌生人,这简直是不可思议的!但我们知道那是谁!那就是不久前打败剑说囊换ぱ剑?从天而降的男主角,没有理睬女主角那只出口一个“一”字的呼唤,从她身边掠过,来到花太郎的身边“抱歉,要你们先过来,反而让你们受如此惊吓。”这个无疑在所有漫迷心中都等于是对俗套剧情的颠覆,而回过身那一声听上去既散漫又不带任何感情的“招呼”,又蕴含了一护对露琪亚多少的柔情呢?
一句:“对了…露琪亚…我是来救你的!”
《死神》第一百一十六话——White Tower Rocks——排名第四。 

12
“我曾一直都在畏怯,一边假装着紧跟身后行走着,一边假装磨锐着自己得爪牙,但其实 我连踩踏你的影子的这种行为,都一直畏怯不已”
98用这样的一段话来深刻的表现出恋次对眼前这位队长那种根深蒂固的恐惧,在对战中他能克服这种恐惧吗?
“现在让我来超越您吧!朽木队长!”巨大的万解完全可以传达出恋次坚定的信念,超越朽木白哉——这对他来说是比“救出露琪亚”更早便存在的目标了,但现在二者在他的前进道路上重合。面对这个他无比畏怯的敌人,他的战斗能够打赢吗?
在“千本樱”的万解下,我们看到的答案是否定的。在完全压倒性的灵压之下,连呼吸也变得困难;连手指也不敢移动,在毫无目的转动的,只有充满恐惧的大脑……他想起了什么?“当然了!”这句白哉不会明白的话从他的口中说出。
“发过誓了…绝对要救她…”一护说过的话,被恋次用在了这里,那份坚定丝毫不减。
“…发誓…吗?跟谁?”白哉以站在天端的姿态问着这样的话,换回来的却是那沾满鲜血的獠牙所做的回答!
“干得漂亮!”这也许是恋次第一次听到朽木的称赞,这应该也是朽木第一次称赞他人吧?送上朽木家代代相传的一条围巾,此时的朽木已放下了贵族的架子,“你的獠牙确实伸向了我”——他这不是很清楚恋次的心情嘛!也正因为此他才能给予自己曾经的副官那句他所能给出的最高评价。
一句“谁都没有——只有我——跟灵魂!!!!” 
《死神》第一百四十三话——Parthian Shaft——排名第三。 

13
“银…你想让这个孩子怎样?你想让我怎样?”
带着这样的疑问乱菊抓住了和蓝染一起出现在双殛的银,从两个人对过去的回忆中看得出银在乱菊的眼中是一个“好男人”,只是喜欢什么事都一力承担,常常不辞而别。
“乱菊的生日是哪一天呢?……那就把今天和你认识的日子当你的生日吧!”从这句话中,银的那一份温柔体现得淋漓尽致,但如今有时为何变得如此的薄情?也许这就是乱菊日思夜想却百思不得其解的事情吧?
“…有点可惜呢…能再让你抓久一点就更好了…再见了乱菊…”银一直都是一副笑脸,但此时,他的脸上是不是流露出了一丝悲伤?

“连我等都无法坚守原则的话还有谁会遵守呢”
一席话道出白哉作为四大贵族之一朽木家当家的苦衷。贵族不单单是用来名字好听的,他们所背负的尸魂界的尊严亦比其它人来的要更沉重——“贵族,是不得不成为所有死神典范的存在。”面对着即将行刑的露琪亚,白哉躲在这句话背后又究竟有着几分的伤感和不甘呢?
在从蓝染手中救下露琪亚后,白哉不堪重负的身体终于倒下了,从卯之花烈口中那一句“…真是乱来呢…”,就可见在这场战斗中白哉是如何舍弃他那始终守护着的“贵族风范”的。
对叫到身边的露琪亚,他娓娓道来了自己的过去、绯真的过去……多年来,白哉身为贵族所承担的各方面压力,听闻露琪亚被判死刑后的矛盾心理……在明白了这些之后,我们还能怎么样?也许只能献上尊敬的目光吧?
“当你的极刑被决定时…我变得不明白了,向父母立下要守护定则的誓约与答应绯真要守护妹妹的约定到底该坚持哪一边呢?……我要向你道歉……”白哉,终于第一次露出了“人类的表情”。

“我一直想着…不快点来道歉不行…但是我是个胆小鬼…只知道要逃…连来这里都拖了这么久…”
露琪亚心中那段始终无法淡忘的痛苦回忆,她终于要在这一天将它永久的放逐。没有告诉任何人,只身前往志波家的她做好了承担一切的心理准备。志波空鹤,面对杀死哥哥的这个人显现出了无比的宽容“我早就决定了:只要从你口中听到一句道歉的话,我就要将所有的事情付诸流水”。
这样的宽容虽然极大的超出露琪亚的想象,但无论怎样说她此行的目的完成了,而谁又想象得到,拖了这么久的这一句道歉,要再次说出口需要多大的勇气?

三句“对不起”
《死神》
第一百七十八话——No One Stand On The Sky
第一百七十九话——Confession in the Twilight
第一百八十一话——And The Rain Left Off
————排名第二。 

14
“并不可怕…我生活得很好…不辛酸…不悲哀…不后悔…连心…都不留下……”留着泪的露琪亚用一句“再见”静静的等待即将到来的死亡——而我们却一直急切盼望着一护的出现。
在解放的双殛即将贯穿露琪亚身体之时,我们的英雄出现了!
之前强烈的愿望——为要解救露琪亚所发的那句绝对的誓言——现在爆发出来了!
在蓝染被“篡改”的那封信中对双殛的威力所做过的那一份渲染:“双殛——矛的前端具有等于几百万把斩魄刀的破坏力,而行刑架上也具备了防止等同斩魄刀破坏力的防御能力”到此成了碎蜂等人惊讶的原因“那双殛的矛……竟然只用一把斩魄刀挡下了……”;“双殛的绞架……居然被破坏了”进而这些又全都演变成了一护实力的侧面体现,我们看到了——我们听到了——“这次一定会救到你的”这句话是那样的坚定有力,是那样的令人安心。
“要是…你敢追上来的话…我是绝对…不会放过你的…!”还记得露琪亚被带走时的那句话吗?又是一个雨夜,一护当时流泪了吗?我们看不清,你也许会问:“为什么前面没有这句话的排名?”
让我篡改白哉的一句名言吧:“同样的解释我不想说两遍。”
“…我不会…向你道谢的哦…笨蛋…”从那个时候的离别到这时的重逢,变强的不仅仅是一护的力量吧?是不是应该还有露琪亚的思念呢?到此,从离别到重逢的这两句话,衬托出了一护从天而降时那份惊天动地后面的屡屡柔情?
整部漫画里面最短也最难忘的对白: 
一句“哟!” 
《死神》第一百五十一话——Deathberry Returns——排名第一。


Posted by monkeycz at 11:08 | Read more | Comments (0) | Trackback (0) | Edit |


Page共14页 第一页 上一页 4 5 6 7 8 9 10 11 12 13 下一页 最后一页
© Powered by BlogBus.Com. 2002-, All Rights Reserved.