Shell's Home

May 31, 2005 - 1 minute read - Comments

郁闷

今天没事,看看大家的blog去。结果发现基本都没有更新。然后看到Gigi的上面写的郁闷宣言。然后万分悲惨的……我也郁闷了…… 算算已经快六一了,当然我已经不是儿童,儿童节没啥好企盼的。不过答辩在6.13,目前核心算法还只写了一半,优化和美化完全没有做,文档动笔才3000字。最郁闷的就是,找不到老师,也找不到研究生。毕设还打不打算让我准时过去啊? 当然,要仅仅如此还不至于郁闷到死。那个做的太快导致老师来不及布置任务也就算了,反正我不着急毕业,也不准备拿啥奖。(不给我个最差劲学生奖就不错了)就算准时答辩照样还有30号的运筹学考试拦着,左右无法正常毕业,拖也无妨。问题是现在很无聊,所以家里就开始催我找工作。我说,这人是不是没有被某些人雇佣就不是人啦?那雇人的人呢? 我又不是很差(呃……不说我的成绩……),找个一千二千的工作肯定找的到。问题是好的工作不好找啊。一个个不知道啥理由的催催催,仿佛多催催就可以找到好工作似的。没有找到工作我也暴郁闷啊(在此再次BS中国的就业率)。 更郁闷的就是程序的问题了,呃,不是编程上的问题。最近看看行情,悲哀的发现,中国计算机还过的去的MM就如同秃子的头发,没几个。而且还要排除如花……干吗,BS我?BS我也要排除,我又不是周星星。剩下的人再排排队。然后,意料之中的发现……轮不到我。我周围计算机最顶尖的MM就算Gigi和zoomy了。不过按照程序员的角度来看问题的话,那个也没啥东西……其他的就更别提了,最基础的系统优化都做不好,写个程序头痛的要死。发嗲和骗GG代劳的本事比计算机水平要高,对于电脑的感觉就和对于体重计的感觉差不多。 虽然说我已经做好了没有人分享心理的准备,也决定了今后不相信任何一只动物,尤其是人。不过对于生命繁衍的需要和某些乐趣(呃,请诸MM不要扁我,扁我也不要拿东西,拿东西也别拿硬的,拿硬的也别扁我脸)的需要,一个共享空间和环境的对象是必须的。(写完才发现,上帝啊,系统引论真的看多了。越看越像不同程序共享同一进程空间……)目前状况来看,恐怕不是运气级好的撞上一个秃子的头发(去去,如花退散……),就是必须忍受一个讲话如同对XX谈琴的对象。 不过总总来说,这还不是郁闷之最。郁闷之最的是……我该干什么?迷茫啊…… 呃……我没醉……我没醉,妈的,谁把啤酒换成香槟的……

May 28, 2005 - 4 minute read - Comments

从游戏修改到程序优化

前几天在家没事情干,就写了一个通用游戏修改器。代码很简单,利用argv参数获取传入文件位置,然后反复调用EditFile。重复映射文件,并且定位目标位置,修改指定数量的数据,然后保存。然后,我为了某些特殊目的,决定赋予程序动态运行和可扩展的功能。并且加入搜索支持。其实后者并不困难,我们只要反复调用函数对比和赋值,并且逐步推进指针就好。但是前者的实现具有一定困难,为此我不得不增加了部分程序开销,来保存一个函数指针,并且可以动态的调用。这样我们就可以实现诸如轩辕剑中的物品修改。其过程大致如下所述。 轩辕剑中的物品是一个数组,但是数组头的RVA是不固定的,仅仅知道大致位置。我们必须先定位某个物品的代码(特征代码),然后修改后面紧跟的一个WORD,实现修改物品数量。程序会自动的建立一个指针,并且逐步推进。我们的实现函数仅仅需要判断当前指针指向的WORD对象是否等于一个特定值,等于的时候进行修改就好。主体框架如下: #define NOSEARCH 0x00000000 #define SEARCHALL 0xFFFFFFFF #define RADDR(x) (LPVOID)((DWORD)RVABase+(x)) typedef DWORD (*tpEditData)(LPVOID Data); struct _RVATable{ DWORD RVA; DWORD SearchEnd; int size; tpEditData pfnEditData; LPVOID OldData; LPVOID DataBuff; }; _RVATable RvaTab[]={ {0xBA4C, NOSEARCH, 01, NULL, NULL, “x09”}, {0xBA4E, NOSEARCH, 01, NULL, NULL, “x5B”}, {0x76AB, NOSEARCH, 01, NULL, NULL, “x09”}, {0x0000, NOSEARCH, 0, NULL, NULL, NULL} }; void EditFile(LPTSTR lpPath); int CompareMemory(LPVOID mem1, LPVOID mem2, int size); void main(int argc, TCHAR* argv[]){ for(int i=1;i<argc;i++) EditFile(argv[i]); return ; } void EditFile(LPTSTR lpPath){ int i; HANDLE hMap, hFile; LPVOID RVABase=NULL, DataByRva, DataEndRva, DataNow; DWORD FileSize; __try{ hFile=CreateFile(lpPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if( hFile==INVALID_HANDLE_VALUE ) return ; FileSize=GetFileSize(hFile, NULL); hMap=CreateFileMapping(hFile, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 0, NULL); if( !

May 28, 2005 - 1 minute read - Comments

光盘镜像Copy、底层文件读写和CreateFile

1.CreateFile读写文件,设备,网络。 刚刚看到有人在问,知道了数据的物理位置,如何读取光盘上的数据。于是我很纳闷,这有何难。看他的意思不会是要编程进行硬件交互读取吧。如果已知数据的偏移地址,那么使用CreateFile(”\.X:“…)就可以直接读取某个盘上的数据了。(Windows 2000 Support Tools中DiskProbe就是用这种方法直接读写物理磁盘的,包括可以读写0面0道0扇区,不过他用的对象是\.PHYSICALDRIVEx而已) 还有可以打开的对象包括管道(会用的人一定知道),文件(废话),Consoles(简单来说就是命令行界面),通信资源(例如COM1)。据说还可以打开内存,似乎是PHYSICMEM资源,记不得了。 以上资源的打开都有限制的,多数都比较简单,就是在打开时候使用OPEN_EXISTING标志。另外还有些当然的限制,例如光盘不能做为GENERIC_WRITE打开(我是没有试过啦,不过想也知道,光盘哪里能写。) 举例来说,这次我做的ISO镜像制作程序(ISO可以是光盘的按字节镜像),代码大致就是这样的。(以下代码都是伪代码,不要拿去编译哦。) GetLogicalDriveStrings(nBufferLength, lpBuffer); lpRootPathName=lpBuffer; while( lpRootPathName\[0\] ){ if(GetDriveType(lpRootPathName) & DRIVE\_CDROM ) break; lpRootPathName+=strlen(lpRootPathName)+1; }; if( !lpRootPathName\[0\] ) return -1; strcpy(RootPathName, "\\."); strcat(RootPathName, lpRootPathName); RootPathName\[strlen(RootPathName)-1\]=0; hFileCDROM=CreateFile(RootPathName, GENERIC\_READ,//我要做镜像,不是刻盘(不知道能不能刻) FILE\_SHARE\_READ, NULL, //你这个用户有访问能力就是NULL,没有自己去看API编程去 OPEN\_EXISTING, //必须如此,这个是打开光盘的限制条件 FILE\_ATTRIBUTE\_NORMAL | FILE\_FLAG\_OVERLAPPED, //交叠模式 0); hFileISO=CreateFile(ISOpath, GENERIC\_WRITE, 0, NULL, OPEN\_ALWAYS, FILE\_ATTRIBUTE\_NORMAL, 0); Overlap.hEvent=CreateEvent(NULL, FALSE, FALSE, NULL); do{ Overlap.Offset=...; Overlap.OffsetHigh=...; ReadFile(hFileCDROM, lpBuffer, BUFF\_SIZE, &NumberOfBytes, &Overlap); WaitForSingleObject(olRead.hEvent, TimeOut); if(!GetOverlappedResult(hFileCDROM, &Overlap, &NumberOfBytes, FALSE) ){ switch( GetLastError() ){ case ERROR\_IO\_INCOMPLETE: CancelIo(hFileCDROM); break; default: break; } //error } WriteFile(hFileISO, lpBuffer, BUFF\_SIZE, &NumberOfBytes, NULL); }while( 1 ); CloseHandle(Overlap.

May 26, 2005 - 1 minute read - Comments

搬家

今天蛮狼狈的,把学校的电脑搬回家来。先是高估了绳子的牢固程度,导致了搬运途中必须依靠手的力量来平衡电脑,而不是拎起来就好了。结果累的要死,甚至有的时候要在大庭广众下扛着电脑跑。后来又发现有个硬盘的螺丝没有敲。要死了,在机器里面逛逛狂磕,这个心疼啊……。最后发现带了电脑忘记带鼠标了,要用家里的破鼠标,学校里面的可是光电啊。 不过也有好事,搬的时候还是挺巧的。碰到一个初中同学,骑车到学校门口。正好顺风拉过去,省的走段路了。聊了聊,发现人家MM是去面试的……哎,自卑……想想自己学校不差,水平不差(虽然不是本专业水平),人品也不算太差。怎么就是找不到工作呢?(画外音:你根本没有找好不好。而且英语不好是你的原罪……) 昨天详细看了Witness2003的破解,感觉还是一样。写这个程序的人多数是个废柴。所有的函数全部打包到一起,没有任何保护措施,连壳都不加。判断非常凌乱,东一个西一个,虽然主要在一个函数里面,不过还有很多不是的。而且最让人鄙视的是,我连破解练习都过不去的水平,居然轻松拆掉了它的保护。由此可见,所谓的保护,其实就是告诉你,不能用,仅仅一个对话框而已。不过非常烦而已。 混帐的毕设终于开始了。其实程序设计不算难,一周的时间我构架和测试都做好了。还是一边看古田任三郎一边写的。不过……主核没做,算法不会。现在已经开始写程序设计说明了,发现其实说明比程序难写,早知道我当时写程序的时候就多写点注释好了。目前程序的每个节点已经非常像控件了,不过没有控件的事件驱动而已。各种操作界面也出来了,基本来说就这样了。看来赶上正常毕业答辩有希望哦。不过前提是我可以正常参加陈峰的考试……

May 16, 2005 - 1 minute read - Comments

关于未来计算机思考

我认为,将来的计算机可能向两个方向发展。一个是嵌入化个人化,一个是集中化。 首先可能出现某种移动数码核心,类似当前PDA的作用。不过在安全方面的使用要完善的多。他可以将手机作为外部设备加载,进行可视电话,或者身份认证,或者仅仅是看看电视上上网。 而后分布系统的发展将会使这个设备不仅仅成为安全认证的核心,而且成为个人电脑的一部分,携带机密数据和软件版权。而各个电脑会成为这个设备的外部扩展,毕竟键盘和屏幕很难随身化的。包括笔记本也可能成为这个设备的一个外部延伸。 而家中的所有设备(或者办公室的)都会集成微芯片,和某个中心连接并且统一规划。该中心在认证(那个核心哦)后接受控制。这样在生活和工作上,人们都依赖于这个核心上。 而在高性能计算和集成应用上,趋势表现为分布化。但是集成中心的负荷不断加重(或者说这才导致了分布化)。说明未来集成的解决也会成为一个热点。 而目前的个人电脑,可能会退化为核心设备的外延。利用强大的网络在一个集成化的设备上工作(分布式系统连接了核心和集成设备),这样对于设备的效率有很好的利用。

May 16, 2005 - 1 minute read - Comments

无题

今天心情不错,数码相机(姑且叫数码相机吧)到了。拿出去拍了N多东西,街道,美女,天空。我拍,我拍。啊,生活真美好。 刚刚想到一个问题,曾经在网络上看到一个文章,是在ring3如何运行ring0代码的。方法是利用Admin权限申请Token,访问DriverPhysicsMemory对象。而后修改进程表,从而隐藏自身。我刚刚突然想到,是否可以隐藏某个HANDLE呢?例如winsock HANDLE。或者直接注入某个sys去和网络连接。这样防火墙不就是一个废物了? 想想似乎可行,过两天找个机会做做看好了。呵呵,Kernel Debug真好玩。 另外想了一个问题,关于时空结构内在形成逻辑的考虑。我预期逻辑的成因是因为时空的特性。如果时空的特性变化就产生不同的逻辑。以因果律为例,如果静止的物体具备速度了。那么它必定被外力作用过。但是如果时空可以重组合,那么一个物体的加速未必存在动力原因。例如一个人留下一个可以穿越时空的方法,而后有人实现,将方法带到过去留下。如此组成循环,那么在未来会出现穿越时空的方法,但是却没有形成的原因。同理,目前的所有逻辑可能都是时空所造成的。如果逻辑不出错,则时空无法逆转。例如考虑超过光速会出现何等现象等等,首先推论的逻辑即无法使用。因为物体运动具备有限速度亦是时空的限制。 我们要假设考虑弯曲并且重新组合时空,则必须有两个条件。首先是存在第五维度,其次是时空可以黎曼形变,这样才有折叠回去的可能。假如时空交叉组合了。那么回到过去的反馈会产生什么效应呢? 我们假设时空的点状态在一个N维空间中,这个N可以无穷大。时空的状态就在N维中变化。时空的变化可能为三。 一个是耗散态,对过去的回馈在量级上等同于过去的量子不定性造成的热变化(布朗效应)。于是对过去的回馈不造成多余的结果。这个等于变性的时空流,没有对外的效应。说例子嘛,寻秦可能基于这个思路。 一个是稳定态,对于过去的回馈造成的结果阻碍对于过去的回馈。于是未来处在一个与原来不同的稳定状态。例如刚刚回到过去那个例子。 另外一个就是非稳定态,对于过去的回馈加大对于过去的回馈。除非时空在回馈中出现非线性的因素,否则如此回馈的结果必定导致未来的不唯一。换言就是没有一个稳恒的未来。例如一个人将金子带回过去,利用知识发财。则下次回到过去可以带更多的金子,等等等等。 不过实话来说,上述推论都仅仅为科幻推论。因为推理的基石,因果率在时空重组下即不成立了。所以一旦时空重组,会产生如何效应并非我们这些三维的人可以理解的。