求JX3周围人物的名字的内存地址查看,如何通过找内存的方法获得周围玩家的名字?

你的位置:
[转]内存中找怪物之代码注入 详解 求加精
16:16:24 |
来源: 按键精灵资源站
【转】内存中找怪物之代码注入篇& &
这是我在网上找到的一篇关于用代码注入找怪物内存地址的
个人觉得很不错
希望能对你们有用& &也希望斑竹给加个精(邪恶笑容ing)
  网上看了N多的文章,对内存中找怪极少有详细介绍,大多数人搞定人物内存中的有关参数后,止步于内存中的找怪。人物只有一个,而怪有各种各样的,数量又同时出现多个,比在内存中找人物坐标难度要大得多。
  下面我将尽可能详细的讲讲内存中找怪之代码注入篇,抛砖引玉,望高人指点。这里的代码注入是直接把代码注入到游戏文件中,学个破解的人都知道,哪怕游戏原文件加了壳,在游戏原文件中加入自己的代码也是完全可以的。
  由于本人水平有限,有的地方可能表达不清,请耐心慢慢看。有的地方采取的方法也许对高手来说好低劣,见笑了。
  一、把周围的怪物名称起始地址集中写到内存中一固定区域。游戏中,玩家周围有许多怪物,所有怪物的名称、坐标、血量等参数不可能会固定在某一内存位置,但对于每一个怪物而言,它的名称、坐标、血量等在内存中的地址之间有着相对固定的差值,只要知道怪物的名称地址就能知道这个怪物的坐标、血量等地址。因此,只要把周围每个怪物的名称地址固定在内存中一定区域,就可知道这些怪物的其他参数。
  1、先把游戏中我们需要打的怪物名称(不是所有怪物,因为有的怪物不爆东西等不值得打)固定放到内存地址为004d2a60起的一块区域,制做一张需要打的怪物名称列表。每个怪名称占12字节,不够12字节的后面用00填充。
  内存地址:004d2a60是怎样来的呢?
  我们用PEditor打开游戏原文件,可以看到PE文件分了好多块,有的块是可以改写的(属性为E0000020或C0000040的可以改写),块里并不全部写满了数据,还有大块连续为00的空闲区域。用UltraEdit等软件打开游戏文件,看到文件物理地址为000d2a60起有一大块为00的空闲区域。映射到内存中就是地址为004d2a60起一块为00的空闲区域,我们先把怪物名称写到这块地方。
  具体操做是用UltraEdit打开游戏文件,修改文件物理地址为000d2a60起的数据。原文件中这里全部为00,我们把下面数据填进去(部分怪物名称列表)。
  000D2A60 B0 EB CA DE D5 BD CA BF 00 00 00 00 B0 EB CA DE 半兽战士....半兽
  000D2A70 D3 C2 CA BF 00 00 00 00 BB A2 C9 DF 00 00 00 00 勇士....虎蛇....
  000D2A80 00 00 00 00 B6 BE D6 A9 D6 EB 00 00 00 00 00 00 ....毒蜘蛛......
  000D2A90 C9 AD C1 D6 D1 A9 C8 CB 00 00 00 00 CD FE CB BC 森林雪人....威思
  000D2AA0 B6 F8 D0 A1 B3 E6 00 00 B6 E0 BD C7 B3 E6 00 00 而小虫..多角虫..
  000D2AB0 00 00 00 00 BF F8 BC D7 B3 E6 00 00 00 00 00 00 ....盔甲虫......
  000D2AC0 B8 AF CA B4 C8 CB B9 ED 00 00 00 00 C0 CB D7 D3 腐蚀人鬼....浪子
  000D2AD0 C8 CB B9 ED 00 00 00 00 C0 D7 B5 E7 BD A9 CA AC 人鬼....雷电僵尸
  000D2AE0 00 00 00 00 BD A9 CA AC 00 00 00 00 00 00 00 00 ....僵尸........
  000D2AF0 C9 AE C2 C2 BD A9 CA AC 00 00 00 00 B6 B4 C7 F9 僧侣僵尸....洞蛆
  000D2B00 00 00 00 00 00 00 00 00 F7 BC F7 C3 BE AB C1 E9 ........骷髅精灵
  000D2B10 00 00 00 00 CA AC CD F5 00 00 00 00 00 00 00 00 ....尸王........
  这样,当游戏运行时,从内存地址004d2a60起的一段区域有了我们需要打的怪物列表。
  2、再把玩家周围实际刷的怪物名称的起始地址(注意是名称的起始地址)固定在内存为004D3000起的长为100(16进制)的地方。
  内存地址:004D3000是游戏运行时我们查到的空闲内存地址,我们利用它们来放周围怪物名称的起始地址,每个怪物名称的起始地址占4个字节,长为100(16进制)可以放64个怪物,玩家周围不会超过64个怪物吧,长为100应足够了。
  3、怎么写入这些怪物名称的起始地址呢?
  首先应知道,游戏从哪里把怪物名称写入内存中。
  Cheat Engine会用吧?具体怎么找,简单的说一下:
  先运行游戏再运行Cheat Engine,CE中选择游戏程序,查看内存,搜索内存玩家周围的一个怪物名称。找到后记下怪物名称的起始内存地址,手动添加地址,把找到的地址添加到列表,类型为文本。从列表中选刚才添加的地址,右键选“寻找什么写入这个地址”。回到游戏中移动玩家,观察刚添加的内存地址的数值变化。变为00时为该怪物从玩家视眼中消失。再移动玩家到看见这怪物,如果运气好,怪物名会再次写入这个内存地址。这样在“以下处理将改变运算码”的窗口中会有汇编代码出现。
  如我的游戏:
  能看到 mov byte ptr [edi+ecx], dl 这句。
  游戏是从这句把怪物名写入内存中的。
  用OllyICE打开游戏。跳到以下这段代码可以看到:
   &/8A11 mov dl, byte ptr [ecx] //从这里开始写怪物名称
   . |88140F mov byte ptr [edi+ecx], dl //名称从[edi+ecx]开始
   . |41 inc ecx
   . |84D2 test dl, dl
   .^\75 F6 jnz short
  0040987A . 50 push eax //写完了运行到这里。
  0040987B ? 68 4C774C00 push 004C774C
   . 56 push esi
   . E8 02F10A00 call 004B8988
  游戏每出现一个怪都会把怪物名称写入[edi+ecx]开始的内存中,显然内存地址[edi+ecx]不是一个固定的值。我们要把这个值复制一份固定到内存中地址为004D3000开始的一块区域。
  这样,周围的怪物名称的起始地址就固定在004D04、004D3008等等内存中.知道怪物名称的起始地址就能算出怪物的坐标、血量等地址。
  具体怎么做呢?
  我们看到游戏运行到0040987A . 50 push eax 这行时,怪物名称已经写到内存中,我们从这行开始写入我们的代码,原文件中紧接这行的下面肯定没有多余的空间来写我们的代码,这就要求改写这行代码,跳到空闲的地方把我们的代码加进去,运行完我们的代码后再跳回来。
  因此把原文件改为如下(对照上面):
   &/8A11 mov dl, byte ptr [ecx]
   . |88140F mov byte ptr [edi+ecx], dl
   . |41 inc ecx
   . |84D2 test dl, dl
   .^\75 F6 jnz short
  0040987A .- E9 FB690C00 jmp 004D027A //这里改为跳到004d027a
   . 56 push esi
   . E8 02F10A00 call 004B8988
  就是把这行0040987A . 50 push eax改为:
  0040987A .- E9 FB690C00 jmp 004D027A
  从004d027A开始写我们的代码,原文件中004D027A也是一块为00的空闲区域。
  下面是我们添加进去的代码,原文件中是为00的空闲区域。
  004D027A 50 push eax //先把一些用到的寄存器数据入栈,保护现场。
  004D027B 53 push ebx
  004D027C 51 push ecx
  004D027D 52 push edx
  004D027E 31D2 xor edx, edx
  004D A4F61200 add edi, 12F6A4 //此处就是edi+ecx,ecx为常数12F6A4
  004D cmp dword ptr [edi], 0 //怪名是否为空
  004D je short 004D02EE //为空不是怪名,直接跳回去不写入
  004D028B 33C9 xor ecx, ecx
  004D028D 8B0439 mov eax, dword ptr [ecx+edi] //怪名前4个字节放入eax中
  004DC11 602A4D00 mov ebx, dword ptr [ecx+edx+4D2A60] //需要打的怪名前4个字节
  004D 04 add ecx, 4
  004D029A 3BC3 cmp eax, ebx //比较刷的怪名与需要打的怪名前4个字节
  004D029C 75 07 jnz short 004D02A5 //不相等,跳到与下一个需要打的怪名
  004D029E 83F9 0C cmp ecx, 0C //因为怪名长占12个字节,所以要比较三次
  004D02A1 ^ 7C EA jl short 004D028D //没比较完返回继续比较
  004D02A3 EB 0D jmp short 004D02B2 //刷的怪名从需要打的怪名列表中找到了,跳到开始写入. 004D02A5 83C2 0C add edx, 0C //下一个需要打的怪名
  004D02A8 81FA
cmp edx, 108 //是否到了需要打的怪名列表尽头
  004D02AE ^ 7C DB jl short 004D028B //没到继续比较
  004D02B0 EB 3C jmp short 004D02EE //到了尽头刷的这个怪不是需要打的,跳回不写入
  004D02B2 33C9 xor ecx, ecx //从这开始写入
  004D02B4 8B81 00304D00 mov eax, dword ptr [ecx+4D3000] //把想写入的内存地址放入eax
  004D02BA 83C1 04 add ecx, 4
  004D02BD 81F9
cmp ecx, 100 //是否写满,能写64个怪,周围一般同时没有这么多
  004D02C3 7F 12 jg short 004D02D7 //写满了清空这块区域.
  004D02C5 83F8 00 cmp eax, 0 //比较内存地址[ecx+4D3000],是否写了其他怪
  004D02C8 ^ 75 EA jnz short 004D02B4 //写了,找下一个内存地址
  004D02CA 89B9 FC2F4D00 mov dword ptr [ecx+4D2FFC], edi //把怪名的起始内存地址写入
  004D02D0 E8 BB000000 call 004D0390 //写入一怪后,重新找最近怪,后面详细讲这个call
  004D02D5 EB 17 jmp short 004D02EE //整理后返回
  004D02D7 33C9 xor ecx, ecx
  004D02D9 33C0 xor eax, eax
  004D02DB D00 mov dword ptr [ecx+4D3000], eax
  004D02E1 83C1 04 add ecx, 4
  004D02E4 81F9
cmp ecx, 100
  004D02EA ^ 7C EF jl short 004D02DB
  004D02EC ^ EB C4 jmp short 004D02B2
  004D02EE 5A pop edx //各寄存器出栈,恢复现场
  004D02EF 59 pop ecx
  004D02F0 5B pop ebx
  004D02F1 58 pop eax
  004D02F2 50 push eax //把原文件的代码补上
  004D02F3 68 4C774C00 push 004C774C //这也是原文件的代码补上
  004D02F8 - E9 8395F3FF jmp
//跳回到原文件插入跳转指令的下一行
  通过以上代码,我们把玩家周围出现的怪,而且是我们需要打的怪名的起始内存地址放到了以内存地址004D3000开始的一段区域内。
  4、修改游戏原始文件,下次启动游戏时能运行我们的代码:
  用UltraEdit打开原文件,把原文件地址为0000987A起数据:
   改为:E9FB690C0090
  把下面数据复制到000d027A起的文件里.
  50 53 51 52 31 D2 81 C7 A4 F6 12 00 83 3F 00 74
  63 33 C9 8B 04 39 8B 9C 11 60 2A 4D 00 83 C1 04
  3B C3 75 07 83 F9 0C 7C EA EB 0D 83 C2 0C 81 FA
  08 01 00 00 7C DB EB 3C 33 C9 8B 81 00 30 4D 00
  83 C1 04 81 F9 00 01 00 00 7F 12 83 F8 00 75 EA
  89 B9 FC 2F 4D 00 E8 BB 00 00 00 EB 17 33 C9 33
  C0 89 81 00 30 4D 00 83 C1 04 81 F9 00 01 00 00
  7C EF EB C4 5A 59 5B 58 50 68 4C 77 4C 00 E9 83
  95 F3 FF
  上面的这些16进制数据就是我们上面加入的代码,修改好后存盘。
  至此,游戏运行时,不需要其他,游戏本身就会把怪名的起始内存地址固定到了以内存地址004D3000开始的一段区域内。7×24小时QQ咨询
游戏服务器
【北傲诀 男 正太 无橙武 3万以下 】刚连起来的萌太,人物好看名字好听
浏览:25次
保障服务:
◆◆该帐号注册资料已经过5173专业审核,信息属实。
◆◆购买后,当商品发生找回、封号时,卖家承诺最高全款退款
该商品已停止出售,您可以选择。
5173帐号点评
建议您购买后对帐号进行各种绑定,以提高帐号安全性。
帐号安全级别
星级代表帐号注册资料的完善程度,资料越齐全,帐号安全程度越高。
购买帐号如何不被卖家找回?
1、建议您挑选大卖家提供的帐号,如五星大卖家经过5173认证,帐号安全不易被找回。2、挑选带有安全保障服务的帐号…
找不到客服或者客服不在线怎么办?
1、在您下单购买后,可以自主选择一位客服为您服务;如果中断了流程您还可以进入我的5173→我是买家→我购买的商品 …
什么是过户?
1、过户就是将卖家帐号的注册邮箱、身份证等信息更改为买家资料的一种服务。2、您只需要购买时选择过户服务…
如何验证真假客服?
1、在5173首页“真假客服验证”处,输入客服QQ号即可验证客服真假;真客服QQ必定为纯数字,如带有下划线…
&武学:声望:经脉:装备:坐骑:仓库:金币:其他:
免责声明:5173仅提供平台服务,商品信息真实性及合法性由卖家自行负责,购买即表示您同意。购买帐号后,请您立即修改注册资料,以免被找回。
商品已成功加入收藏!
您已收藏过该商品,请勿重复添加。
很抱歉,购物车已满。
购物车最多能放置 20 件商品,请您
后再添加。C语言内存地址基础 - 文章 - 伯乐在线
& C语言内存地址基础
感谢 的热心翻译。如果其他朋友也有不错的原创或译文,欢迎投递。
从计算机内存的角度思考C语言中的一切东东,是挺有帮助的。我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节。比方说我们的电脑有 4K 内存,那这个内存数组将会有 4096 个元素。当我们谈论一个存储地址的指针时,就当相于我们在谈论一个存储着该内存数组某个元素索引的指针。逆向引用某个指针,将会得到数组中该索引所指向的值。这一切当然都是谎言。操作系统对内存的管理要远比这复杂。内存不一定连续,也不一定按顺序处理。但前面的类比是一种讨论C语言内存的简单方式。
如果对『指针』、『地址』和『逆向引用』感到混乱,请看《》。// 译注:“dereferencing” 的译法比较多,本文采用了“逆向引用”。
假设我们的计算机有 4K 的内存,下一个开放地址的索引是2048。我们声明一个新的字符变量i='a'。当该变量所获得的内存放置了它的值,变量的名字也与内存中的该位置关联,我们的字符i就获得了一个存储在2048位置的值。该字符是单字节的因此它只占用了索引为 2048 的位置。如果我们对 i 变量使用地址操作符(&),它将返回到索引为2048的位置。如果这个变量是另一种类型,比如是 int,它将占用4字节,在数组中占用索引为
的位置。使用地址操作符仍将返回索引2048的位置,因为 int 型即便占用了 4 字节,但它开始于 2048 位置。我们看一个例子:
// intialize a char variable, print its address and the next address
char charvar = '\0';
printf("address of charvar = %p\n", (void *)(&charvar));
printf("address of charvar - 1 = %p\n", (void *)(&charvar - 1));
printf("address of charvar + 1 = %p\n", (void *)(&charvar + 1));
// intialize an int variable, print its address and the next address
int intvar = 1;
printf("address of intvar = %p\n", (void *)(&intvar));
printf("address of intvar - 1 = %p\n", (void *)(&intvar - 1));
printf("address of intvar + 1 = %p\n", (void *)(&intvar + 1));
1234567891011
// intialize a char variable, print its address and the next addresschar charvar = '\0';printf("address of charvar = %p\n", (void *)(&charvar));printf("address of charvar - 1 = %p\n", (void *)(&charvar - 1));printf("address of charvar + 1 = %p\n", (void *)(&charvar + 1));&// intialize an int variable, print its address and the next addressint intvar = 1;printf("address of intvar = %p\n", (void *)(&intvar));printf("address of intvar - 1 = %p\n", (void *)(&intvar - 1));printf("address of intvar + 1 = %p\n", (void *)(&intvar + 1));
运行将得到如下的输出:
address of charvar = 0x7fff9575c05f
address of charvar - 1 = 0x7fff9575c05e
address of charvar + 1 = 0x7fff
address of intvar = 0x7fff
address of intvar - 1 = 0x7fff
address of intvar + 1 = 0x7fff9575c05c
address of charvar = 0x7fff9575c05faddress of charvar - 1 = 0x7fff9575c05eaddress of charvar + 1 = 0x7fffaddress of intvar = 0x7fffaddress of intvar - 1 = 0x7fffaddress of intvar + 1 = 0x7fff9575c05c
在第一个例子的1-5行中,我们声明了一个字符变量,并打印输出该字符的地址,然后打印了内存中位于该变量前后的两个地址。我们是通过使用&操作符并+1或-1来获取前后两个地址的。在7-11行的第二个例子中我们做了差不多的事,除了声明了一个int型变量,打印出它的地址以及紧邻它前后的地址。
在输出中,我们看到地址是 16 进制的。更值得注意的是,字符的地址前后相差1字节。int 型变量地址前后相差四字节。内存地址的算法、指针的算法、都是根据所引用的类型的大小的。一个给定的类型的大小是依赖于平台的,我们这个例子中的char是1字节,int是四字节。将字符的地址-1是改地址前的地址,而将int型地址-1是该地址前4个的地址。
在例子中,我们是用地址操作符来获取变量的地址,这和使用表示变量地址的指针是一样的效果。
英文原博中评论已经提出:存储&charvar-1(一个非法的地址因它位于数组之前)在技术上是未特别指出的行为。C的标准已经声明,未特别指出的以及在一些平台存储一个非法地址都将引起错误。
在C语言中,数组是相邻的内存区域,它存储了大量相同数据类型的值(int、long、*char等等)。很多程序员第一次用C时,会将数组当做指针。那是不对的。指针存储一个简单的内存地址,而一个数组是一块存储多个值的连续的内存区域。
// initialize an array of ints
int numbers[5] = {1,2,3,4,5};
int i = 0;
// print the address of the array variable
printf("numbers = %p\n", numbers);
// print addresses of each array index
printf("numbers[%u] = %p\n", i, (void *)(&numbers[i]));
} while(i & 5);
// print the size of the array
printf("sizeof(numbers) = %lu\n", sizeof(numbers));
123456789101112131415
// initialize an array of intsint numbers[5] = {1,2,3,4,5};int i = 0;&// print the address of the array variableprintf("numbers = %p\n", numbers);&// print addresses of each array indexdo {&&&&printf("numbers[%u] = %p\n", i, (void *)(&numbers[i]));&&&&i++;} while(i & 5);&// print the size of the arrayprintf("sizeof(numbers) = %lu\n", sizeof(numbers));
运行将得到如下的输出:
numbers = 0x7fff
numbers[0] = 0x7fff
numbers[1] = 0x7fff
numbers[2] = 0x7fff
numbers[3] = 0x7fff0815c0ec
numbers[4] = 0x7fff
sizeof(numbers) = 20
numbers = 0x7fffnumbers[0] = 0x7fffnumbers[1] = 0x7fffnumbers[2] = 0x7fffnumbers[3] = 0x7fff0815c0ecnumbers[4] = 0x7fffsizeof(numbers) = 20
在这个例子中,我们初始化了一个含有 5 个 int 元素的数组,我们打印了数组本身的地址,注意我们没有使用地址操作符 & 。这是因为数组变量已经代表了数组首元素的地址。你会看到数组的地址与数组首元素的地址是一样的。然后我们遍历这个数组并打印每个元素的内存地址。在我们的计算机中 int 是四个字节的,数组内存是连续的,因此每个int型元素地址之间相差4。
在最后一行,我们打印了数组的大小,数组的大小等于sizeof(type)乘上数组元素的数量。这里的数组有5个int型变量,每一个占用4字节,因此整个数组大小为20字节。
结构体地址
在C语言中,结构体一般是连续的内存区域,但也不一定是绝对连续的区域。和数组类似,它们能存储多种数据类型,但不同于数组的是,它们能存储不同的数据类型。
struct measure {
// declare and populate the struct
ball.category = 'C';
ball.width = 5;
ball.height = 3;
// print the addresses of the struct and its members
printf("address of ball = %p\n", (void *)(&ball));
printf("address of ball.category = %p\n", (void *)(&ball.category));
printf("address of ball.width = %p\n", (void *)(&ball.width));
printf("address of ball.height = %p\n", (void *)(&ball.height));
// print the size of the struct
printf("sizeof(ball) = %lu\n", sizeof(ball));
1234567891011121314151617181920
struct measure {&&char category;&&int width;&&int height;};&// declare and populate the structstruct measure ball;ball.category = 'C';ball.width = 5;ball.height = 3;&// print the addresses of the struct and its membersprintf("address of ball = %p\n", (void *)(&ball));printf("address of ball.category = %p\n", (void *)(&ball.category));printf("address of ball.width = %p\n", (void *)(&ball.width));printf("address of ball.height = %p\n", (void *)(&ball.height));&// print the size of the structprintf("sizeof(ball) = %lu\n", sizeof(ball));
运行后的输出结果如下:
address of ball = 0x7fffd1510060
address of ball.category = 0x7fffd1510060
address of ball.width = 0x7fffd1510064
address of ball.height = 0x7fffd1510068
sizeof(ball) = 12
address of ball = 0x7fffd1510060address of ball.category = 0x7fffd1510060address of ball.width = 0x7fffd1510064address of ball.height = 0x7fffd1510068sizeof(ball) = 12
在这个例子中我们定义了一个结构体measure,然后声明了该结构体的一个实例ball,我们赋值给它的width、height以及category成员,然后打印出ball的地址。与数组类似,结构体也代表了它首元素的地址。然后打印了它每一个成员的地址。category是第一个成员,它与ball具有相同的地址。width后面是height,它们都具有比category更高的地址。
你可能会想因为category是一个字符,而字符型变量占用1字节,因此width的地址应该比开始出高1个字节。从输出来看这不对。 根据C99标准(§6.7.2.1),为边界对齐,结构体可以给成员增加填充字节。它不会记录数据成员,但会增加额外的字节。在实际中,大多数的编译器会使结构体中的每个成员与结构体最大的成员有相同大小,
在我们的例子中,你可以看到char实际上占用4字节,整个struct占用12个字节。都发生了什么?
struct变量指向struct首元素的地址
不要去假设一个结构体的成员相对于另外一个成员有多少内存偏移量,结构体成员之间可能有边界字节,或者编译器也可能将它们放在不连续的内存空间中。使用地址操作符&来获得成员的地址
使用sizeof(struct instance)来获得struct的总大小,不能假设它是各个成员大小的大小总和,也许还有填充字节。
喜欢这篇博文可以帮你理解更多的在C中如何操作不同的数据类型的地址。在以后的博文中,我们将会继续研究一下指针和数组的基础。
关于作者:
可能感兴趣的话题
看完了,谢谢分享
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线后使用快捷导航没有帐号?
查看: 9975|回复: 231
【剑网3插件】NPC、人物名字增强插件(名字不再模糊)
LV.3, 积分 363, 距离下一级还需 138 积分
插件已经更新咯。[jx08]
详见另一帖
【剑网3插件】头顶文字超级增强(9月29日更新简装版1.01b)
还在为NPC、和人物名字太模糊而发愁么??
看下面——[jx26] 欢迎光临!
这不是大家想要的东西么?可能目前还有稍许的bug,不过请大家理解,毕竟是第一次……
非常感谢我们的作者!为我们提供如此强大的东西!
  插件名:PuzzlePanel
  作者:Danexx
  说明:本插件是PuzzlePanel的升级补丁,下载以后可以直接覆盖PuzzlePanel&&也可以单独使用。
希望大家有什么意见都可以说出来。我会不定时来看看。可以向作者反应情况。
当然,能不能实现我个人不能保证,我也是抱着玩家的态度去感受。谢谢!
插件下载链接
需注册才能下载,本论坛还有更多游戏攻略,有兴趣的不妨看看![jx06]
[ 本帖最后由 、灵魂 于
09:37 编辑 ]
[jx27] [jx27] [jx27] 真的哇?喜欢
强帖留名[jx27]
冤有头,债有主,前方直行策划组 ...
[jx12] 好东西啊.
曾经我以为人类已经阻止不了我了,直到我的膝盖中了策划的特大暴雨梅花针....
[jx15]& &这不是你们 想要的怎么 哑巴了。诶。吵架就见你们好贴也没人顶。
挖....支持下
不错 不错······
[jx08] 好东西
下一个看看先2[jx01]
这个猛啊 顶!!!!!!!
恶人谷光明正大杀谢渊?光你 嘟 啊&&带了一群中立WH XX。。还TM装&&装你 嘟 啊
剑3版主勋章
剑3版主勋章
Powered by
Copyright & 2014 .All rights reserved.

我要回帖

更多关于 内存地址编号 的文章

 

随机推荐