<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/ct8d" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/ct8d" type="application/rss+xml"></fs:self_link><lastBuildDate>Sat, 16 Sep 2006 11:25:57 GMT</lastBuildDate><title>我的博客</title><description>dusk</description><link>http://duskmeng79.blog.163.com</link><language>zh-CN</language><pubDate>Thu, 03 Jul 2008 07:39:58 GMT</pubDate><dc:creator>duskmeng79</dc:creator><dc:date>2008-07-03T07:39:58Z</dc:date><dc:language>zh-CN</dc:language><image><title>我的博客</title><url>http://ava.blog.163.com/photo/GnCQXqd1zct_jjf3mw5KFw==/1477180677777533188.jpg</url><link>http://duskmeng79.blog.163.com</link></image><item><title>我的学习日记(改动态内存)</title><link>http://item.feedsky.com/~feedsky/ct8d/~7070042/99364861/5178237/1/item.html</link><slash:comments>3</slash:comments><dcterms:modified>2006-09-16T19:25:57+08:00</dcterms:modified><description>&lt;div&gt;&lt;P&gt;游戏修改器&lt;BR&gt;&amp;nbsp;&lt;BR&gt;2003-3-27 13:08:59&amp;nbsp;&amp;nbsp; GAMERES&amp;nbsp;&amp;nbsp; CrackYY&amp;nbsp;&amp;nbsp; 阅读次数: 39639 &lt;BR&gt;开高级游戏黑客的面纱，教你打造游戏修改器 &lt;BR&gt;工具:SoftICE、金山游侠2002、VC++7.0、PE查看器、SPY++ &lt;BR&gt;测试平台：Window2000 Professional SP2 &lt;/P&gt;
&lt;P&gt;　　大家好！我先给大家拜个晚年，时间过真快工，一年又过去了，我也和大家分开一年了，真是感慨万分呀，不知道大还记得不记得YY了，不过我是不会忘记大家的。这一年真是太忙了，根本就没有时间再像从前那样在深夜里一边听着音乐一边写文章了，今天就着假期，再给大家充充电：D &lt;/P&gt;
&lt;P&gt;　　今天YY给大家带来些什么呢？呵呵，看题目就知道了，看起来很酷吧，“高级游戏黑客”,什么？你说你就游戏黑客？看好了，是“高级”的！什么是高级的？等你看完这篇文章就知道了：D &lt;/P&gt;
&lt;P&gt;首先我介绍一下将会用到的工具： &lt;BR&gt;1、SoftICE（不用多说了吧，我想你应该会用） &lt;BR&gt;2、金山游侠2002（这个你也应该会用） &lt;BR&gt;3、VC++7.0(不要求你一定会用，但至少应该会一种编程工具) &lt;BR&gt;4、PE查看器(你可以随意找一个，没有也没关系，我会教你用SoftICE查看) &lt;BR&gt;5、SPY++(VC里的一个查看程序信息的工具，你可以和别的，比如Delphi和C++Builder的WinSight32) &lt;/P&gt;
&lt;P&gt;然后就是你应该会的知识: &lt;BR&gt;1、汇编基础 &lt;BR&gt;2、一些编程基础，至少应该看懂我介绍的几个API函数 &lt;BR&gt;3、PE文件结构的基础，不会也没关系，我会解释给你 &lt;/P&gt;
&lt;P&gt;以上几点你都具备了的话我们就可以开始了。 &lt;/P&gt;
&lt;P&gt;　　我来介绍一下我要教给你的东西。想必大家都玩过PC游吧，那么也一定用过一些专用的游戏修改器吧，比如暗黑，红警，大富翁这些经典的游戏都有它们专用的修改器，注意，我说的不是FPE之类的通用修改工具。 &lt;/P&gt;
&lt;P&gt;　　你试没试过用金山游侠修改红警二的金钱？如果有的话你应该知道每玩一次就要改一次，因为这个游戏是动态分配内存的，每次重新开始都会改变。所以你会选择到网上去下载一个专用的修改器，那么你有没有想过自己做一上呢？想过？那你为什么不做？什么不会？那就好办了，看了这篇教程你就会了：D费话少说，我来讲一下原理。 &lt;/P&gt;
&lt;P&gt;　　有一些经常修改游的朋友一定会知道，不论游戏中“物品”的内存地址是否是动态的，物品与物品之间相隔的距离都是不变的，我拿“楚留香新传”为例，我先用金山游侠查找内力值的内存地址，找到的结果是:79F695C，再查找物品“金创药”的地址是：328D1DC，现在我用79F695C减去328D1DC，得到：4769780，这个数就是内力值与金创药的偏移值，没看懂？接着看呀，我还没说完呢，现在重新再运行游戏，查找内力值的地址，得到：798695C再查找金创药得到的地址是：321D1DC，两个值的内存地址都改变了，但是用你内力值的地址减去金创药的地址得到的结果是什么？没错，还是4769780，也就是说，无论这两个值的内存地址变成多少，它们之间的距离是永远不变的，不光是这个游戏，一般的游戏都是，至少我没见过不是的：D &lt;/P&gt;
&lt;P&gt;　　上面讲的东西总结出一个结论，那就是我们只要得到这两个地址中的任何一个，就可以得到另外一个，只要你知道它们之间的偏移量是多少。 &lt;/P&gt;
&lt;P&gt;　　我们第一步要做的就是得到这个地址，但是内存中的地址是动态改变的，得到也没有用，这里我就教你把它变成静态的，叫它永远都不变！我继续拿“楚留香新传”为例，如果你有这个游的话就跟我一起做，没有的也没关系，只要看懂这几个步骤就行了。开工！ &lt;/P&gt;
&lt;P&gt;　　首先进入游戏，查找内值的地址，得到的是：798695C（不知道为什么这上游并不是每次重起都改变内存地址），按Ctrl+D打开SoftICE，下命令：BPM 798695C W（写这个地址时则中断），回到游戏中，打开人物属性面板，游戏中断了，在SofitICE中你会看到这条指令：&lt;/P&gt;
&lt;P&gt;0047EB17&amp;nbsp; MOV&amp;nbsp; EAX [EDX+000003F4] 下命令：D EDX+3F4将看到内力值 &lt;BR&gt;0047EB1D&amp;nbsp; PUSH&amp;nbsp; EAX &lt;BR&gt;……………………………… &lt;BR&gt;……………………………… &lt;/P&gt;
&lt;P&gt;从上面可看出0047EB17处的指令是将内力值的指针送到EAX寄存器中，这是一个典型的寻址方式，设想一下，我们是到了EDX中的基址，那么无论什么时候只要用EDX+3F4就可以轻松的得到内力值的地址，因为000003F4是一个常量，它是不会改变的，改变的只是EDX中的地址，所以只要有办法得到EDX中的值就什么都好办了，你明白了没有？如果还是不懂，那么请再看一遍。现在要做的就是如何得到这个值，下面我教给你如何做: &lt;/P&gt;
&lt;P&gt;　　我的办法就是设计一段代码，把EDX中的值存放到一个地址中，然后运行这段代码，再返回游戏的原有指令继续执行，什么？补丁技术？SMC？随你怎么说啦，只要运行正常就一切OK啦：D &lt;/P&gt;
&lt;P&gt;实际操作： &lt;BR&gt;　　首先在程序中找一段空白处来存放我们设计的代码，很简单，只要懂得一些PE文件结构的朋友都会知道，一般在EXE文件的数据段（.data段）的结尾都会有一段缓冲区，我们可以在这段区域中写任何东西，当然你也可以用“90大法”找一段空白区，但我还是推荐你用我教给你的方法。上同我提到，如果你没有PE文件查看工具我可以教你用SoftICE查看，而且很简单，只要一个命令：MAP32 “模块名”，看一下我是怎么做的你就知道了。 &lt;/P&gt;
&lt;P&gt;　　Ctrl+D呼收出SoftICE，然后下命令：MAP32 CrhChs,这时你应该看到EXE各个段的信息，我们要注意的只是.data段，既然要找的是数据段的结尾，那么我们就从下一个段开始向上找，如下： &lt;/P&gt;
&lt;P&gt;&amp;nbsp; .data&amp;nbsp; 004FB000 &lt;BR&gt;&amp;nbsp; .rsrc&amp;nbsp; 00507000 &lt;/P&gt;
&lt;P&gt;.data的下一个段是.rsrc段，它是从00507000开始的，也就是说以00507000为基础向上一个字节就是数据段的结尾，我所择从00506950处开始写代码，说了这么半天那么我们的代码到底是什么样子呢？修改后的指令又是什么样的呢？别急，请看下面: &lt;/P&gt;
&lt;P&gt;修改0047EB17后代码： &lt;BR&gt;0047EB17&amp;nbsp; JMP&amp;nbsp;&amp;nbsp;&amp;nbsp; 00506950 //跳到我们的代码中去执行&amp;nbsp; &lt;BR&gt;0047EB1C&amp;nbsp; NOP&amp;nbsp; //由于这条指令原来的长度是6字节，而修改后的长度是5个字节，所以用一个空指令补上 &lt;BR&gt;0047EB1D&amp;nbsp; PUSH&amp;nbsp; EAX &lt;/P&gt;
&lt;P&gt;//我们的代码： &lt;BR&gt;00506950&amp;nbsp; MOV&amp;nbsp; DWORD PTR&amp;nbsp; EAX，[EDX+00003F4] //恢复我们破坏的指令 &lt;BR&gt;00506956&amp;nbsp; MOV&amp;nbsp; DWORD PTR&amp;nbsp; [00506961],EDX //把EDX保存以00506961中去 &lt;BR&gt;0050695C&amp;nbsp; JMP&amp;nbsp; 0047EB1D //返回原来的指令去执行 &lt;/P&gt;
&lt;P&gt;把上面的代码用SoftICE的A命令写入，OK！ &lt;/P&gt;
&lt;P&gt;　　现在我们试一下运行的效果，你现在用金山游侠搜索一下内力址的地址，什么又变了？那就地啦，它要是不变我们还用费这么大劲儿吗？记下这个地址返回到游戏中去，Ctrl+D呼出SoftICE，下命令 D *[00506961]+000003F4，在数据窗口看到什么了？呵呵，没错，看到了你刚才记住的那个地址，里面的数值正是内力的值，试着改一下，回到游戏中，呵呵，内力值变了吧：D &lt;/P&gt;
&lt;P&gt;　　讲到这里，我们的工作已经完成了%90，但别高兴的太早，后面的%10要远比前的%90花的时间长，因为我们要用编程实现这一切，因为你不能每次都像刚才那样做一次吧！ &lt;/P&gt;
&lt;P&gt;现在我来说一下编程的步骤： &lt;BR&gt;　　首先用FindWindow函数得到窗口句柄，然后用GetWindowThreadID函数从窗口句柄得到这个进程的ID，接着用OpenProcess得到进程的读写权限，最后用WriteProcessMemory和ReadProcessMemory读写内存，然后。。。。呵呵，你的修改器就做成啦:D &lt;/P&gt;
&lt;P&gt;　　下面是我抄写以前写的修改器源程序片断，第一部分是动态写入刚才的代码，第二部分是读取并修改内力值，由于我没有时间整理和测试，所以不能保证没有错误，如果大家发现有遗漏的话，可以在QQ上给我留言或写信给我，代码如下: &lt;BR&gt;有几点请大家注意： &lt;BR&gt;1、写机器码时要一个字节一个字节的写 &lt;BR&gt;2、注意要先写入自己的代码，然后再修改游中的指令(下面的代码没有这样做，因为不影响，但是你应该注意这个问题) &lt;/P&gt;
&lt;P&gt;////////////////////////////////////////////////////////////////////////// &lt;BR&gt;//动态写入代码 &lt;BR&gt;&amp;nbsp; //0047EB17 &lt;BR&gt;#define MY_CODE1&amp;nbsp; 0xE9 &lt;BR&gt;#define MY_CODE2&amp;nbsp; 0x34 &lt;BR&gt;#define MY_CODE3&amp;nbsp; 0x7E &lt;BR&gt;#define MY_CODE4&amp;nbsp; 0x08 &lt;BR&gt;#define MY_CODE5&amp;nbsp; 0x00 &lt;BR&gt;#define MY_CODE6&amp;nbsp; 0x90 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //00506950 &lt;BR&gt;#define MY2_CODE1&amp;nbsp; 0x8B &lt;BR&gt;#define MY2_CODE2&amp;nbsp; 0x82&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //这部分是要写入的机器码的常量定义 &lt;BR&gt;#define MY2_CODE3&amp;nbsp; 0xF4 &lt;BR&gt;#define MY2_CODE4&amp;nbsp; 0x03 &lt;BR&gt;#define MY2_CODE5&amp;nbsp; 0x00 &lt;BR&gt;#define MY2_CODE6&amp;nbsp; 0x00 &lt;/P&gt;
&lt;P&gt;#define MY3_CODE1&amp;nbsp; 0x89 &lt;BR&gt;#define MY3_CODE2&amp;nbsp; 0x15 &lt;BR&gt;#define MY3_CODE3&amp;nbsp; 0x61 &lt;BR&gt;#define MY3_CODE4&amp;nbsp; 0x69 &lt;BR&gt;#define MY3_CODE5&amp;nbsp; 0x50 &lt;BR&gt;#define MY3_CODE6&amp;nbsp; 0x00 &lt;/P&gt;
&lt;P&gt;#define MY4_CODE1&amp;nbsp; 0xE9&amp;nbsp; &lt;BR&gt;#define MY4_CODE2&amp;nbsp; 0xBC &lt;BR&gt;#define MY4_CODE3&amp;nbsp; 0x81 &lt;BR&gt;#define MY4_CODE4&amp;nbsp; 0xF7 &lt;BR&gt;#define MY4_CODE5&amp;nbsp; 0xFF &lt;BR&gt;//-----------------------------------------------------------------------------// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD A1 =MY_CODE1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD A2 =MY_CODE2; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD A3 =MY_CODE3; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD A4 =MY_CODE4; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD A5 =MY_CODE5; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD A6 =MY_CODE6; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD B1 =MY2_CODE1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD B2 =MY2_CODE2; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD B3 =MY2_CODE3;&amp;nbsp; //这部分是变量的定义 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD B4 =MY2_CODE4; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD B5 =MY2_CODE5; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD B6 =MY2_CODE6; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD C1 =MY3_CODE1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD C2 =MY3_CODE2; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD C3 =MY3_CODE3; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD C4 =MY3_CODE4; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD C5 =MY3_CODE5; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD C6 =MY3_CODE6; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD D1 =MY4_CODE1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD D2 =MY4_CODE2; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD D3 =MY4_CODE3; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD D4 =MY4_CODE4; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD D5 =MY4_CODE5; &lt;BR&gt;//--------------------------------------------------------------------------// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HWND hWnd =::FindWindow(&quot;CRHClass&quot;,NULL); //得到窗口句柄 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(hWnd ==FALSE) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox(&quot;游戏没有运行！&quot;); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetWindowThreadProcessId(hWnd,&amp;amp;hProcId); // 从窗口句柄得到进程ID &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE nOK = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ| &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROCESS_VM_WRITE,FALSE,hProcId);&amp;nbsp; //打开进程并得到读与权限 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(nOK ==NULL) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox(&quot;打开进程时出错&quot;); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //0047EB17 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0047EB17,&amp;amp;A1,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0047EB18,&amp;amp;A2,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0047EB19,&amp;amp;A3,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0047EB1A,&amp;amp;A4,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0047EB1B,&amp;amp;A5,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0047EB1C,&amp;amp;A6,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //00506950 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506950,&amp;amp;B1,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506951,&amp;amp;B2,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506952,&amp;amp;B3,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506953,&amp;amp;B4,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506954,&amp;amp;B5,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506955,&amp;amp;B6,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //第二句 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506956,&amp;amp;C1,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506957,&amp;amp;C2,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506958,&amp;amp;C3,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506959,&amp;amp;C4,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0050695A,&amp;amp;C5,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0050695B,&amp;amp;C6,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //最后一句 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0050695C,&amp;amp;D1,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0050695D,&amp;amp;D2,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0050695E,&amp;amp;D3,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x0050695F,&amp;amp;D4,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteProcessMemory(nOK,(LPVOID)0x00506960,&amp;amp;D5,1,NULL); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseHandle(nOK); //关闭进程句柄 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;} &lt;BR&gt;/////////////////////////////////////////////////////////////////////////////// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //读取并修改内力值 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp; hProcId; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HWND hWnd =::FindWindow(&quot;CRHClass&quot;,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(hWnd ==FALSE) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox(&quot;No&quot;); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetWindowThreadProcessId(hWnd,&amp;amp;hProcId); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE nOK = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ| &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROCESS_VM_WRITE,FALSE,hProcId); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(nOK == NULL) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox(&quot;ProcNo!&quot;); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD buf1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD write; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x00506961,(LPVOID)&amp;amp;buf1,4,NULL); //读取我们保存EDX中的基础 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(OK ==TRUE) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write =buf1+0x000003F4;&amp;nbsp; //得到内力值的地址 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD Writeed =0x00; //要修改的数值 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOL B =WriteProcessMemory(nOK,(LPVOID)write,&amp;amp;Writeed,1,NULL); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(B==FALSE) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox(&quot;WriteNo&quot;); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseHandle(nOK); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;　　啊，写的我手都麻啦，今天就到这里了，才疏学浅难免会有遗漏，请大家指教，如果我不会或不喜欢用VC的话，你可以在QQ上与我交流，我可以教你如何用Delphi、C++Builder、Win32Asm或VC实同上面的功能。 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (如转载本篇文章请不要改动内容及作者！) &lt;/P&gt;
&lt;P&gt;作者：CrackYY &lt;BR&gt;Email：&lt;A href=&quot;mailto:CoolYY@msn.com&quot;&gt;CoolYY@msn.com&lt;/A&gt; &lt;BR&gt;OICQ：20651482&amp;nbsp; &lt;BR&gt;&lt;/P&gt;&lt;/div&gt;</description><pubDate>Sat, 16 Sep 2006 19:25:57 +0800</pubDate><author>duskmeng79</author><comments>http://duskmeng79.blog.163.com/blog/static/2471196200681672557674</comments><guid isPermaLink="false">http://duskmeng79.blog.163.com/blog/static/2471196200681672557674</guid><dc:creator>duskmeng79</dc:creator><fs:srclink>http://duskmeng79.blog.163.com/blog/static/2471196200681672557674</fs:srclink><fs:srcfeed>http://duskmeng79.blog.163.com/rss/</fs:srcfeed><fs:itemid>feedsky/ct8d/~7070042/99364861/5178237</fs:itemid></item></channel></rss>