谁帮忙把手机游戏改BT啊

社区服务
高级搜索
猴岛论坛手机数码谁帮忙把手机游戏改BT啊
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
1个回复

谁帮忙把手机游戏改BT啊

楼层直达
老肥¨

ZxID:11943500

等级: 上校
直视哥的双眼,感受哥体内汹涌的蛋疼之力吧

举报 只看楼主 使用道具 楼主   发表于: 2010-11-03 0
N73.rar[点击下载](781 K) 下载次数:4 累计下载获得 DB 没有记录 死亡之刃 改BT 发现改 破解没啥大用 各位大虾帮帮忙吧 谢谢了 吧rar 改成 jar
夏无蝶

ZxID:10666759

等级: 元老
配偶: benq12
To0oTo0o------------------小蝶

举报 只看该作者 沙发   发表于: 2010-11-04 0
不破解游戏,方法如下:(继续等有心人来破解)

工具:halo2.0,DJ Java Decompiler

Java游戏:英雄传说s60原版(S60V3,240*320)(本文以此为例。为什么是原版?为什么只是S60版?这是为了让更多的迷友,可以自己动手修改英雄传说的汉化版本,因为想玩才会有动力。若直接使用我修改的,这样是无法学会BT修改的。)

  1、数据的准备
什么是数据的准备?为何要数据准备?简而言之,就是我们到底需要改哪些数据,在游戏中原来的初值究竟是多少?那我们先用sjboy来模拟,看看我们到底想改哪些属性数据。

咿呀!手机顽童竟然无法模拟?!到选择人物时,直闪屏,按任何键都无法进入游戏。其实,只需不断按F3键来减缓游戏的速度即可!进入游戏后,到人物菜单界面,

好,主要是以下数据,金钱300
图一:等级数1,经验值0,升级需要经验值80,生命值72/72,法力值60/60
图二:力量8,生命5,敏捷3,意志4,进攻16,防守5
图三:可加点数0

2、数据的查找和修改

那我们一个个来找到这些数据并修改成自己想要的BT值。复习bb的修改教程,打开halo2.0,选择class editor,编辑,全文查找,输入300(为什么是300?因为这个值较为特殊,重复率较少啊。如果选择1,0,8或其它的话,可能会查出一大堆来,没有编程基础的迷友就会很迷茫,到底是去选择哪个才是正确的。那又为什么不选择72呢?这个也挺特殊啊!我要告诉你一个不幸的消息,在本游戏查找中,会出现很多,而且可以告诉大家,搜索出来的都不是。Why?经验?不是。是后面编译文件的分析。)只查找到一个目标,按照bb的教程已修改其中的参数,金钱300,力量8,生命5,敏捷3,意志4。5个值。
那么按照bb的方法,为何找不到其它相关的数值呢?!我非要修改怎么办?其实属性值的赋值有两种方式,一种是显式,如i=300或a=5,bb的教程中只能修改到这些数据。另一种是隐式,如a=(b+c)*100等。此教程主要介绍隐式数值的修改。

一般来说,如果是赋值属性值的话,会在同一个class文件中,所以,既然我们找到了金钱300的class所在,我们也应该找到了其它的属性值。那金钱300具体是在哪个class文件呢?答案就在搜索结果中,类名——ao。


现在用DJ反编译ao.class,查找300,发现,a_g_fld.a = 300;即金钱的变量名为a_g_fld.a,值为300.说明我们所找的class文件是正确的。那分别查找8,5,3,4,也找到了!

case 6: // '\006'

b_short_fld = 8;

e_short_fld = 5;

f_short_fld = 3;

g_short_fld = 4;

a_e_array1d_fld[0] = (e)ad.a((byte)0, (byte)0, true, false);

a_e_array1d_fld[0].b = true;

a_e_array1d_fld[0].h = 1;

break;

呵呵,力量的变量名为b_short_fld,以下类同,不作解释。
那查找72看看,的确没有。这也证实了此为隐式赋值。那我们该怎么办?这么多的变量,字符看得头都大了,还是分不清哪个是哪个。我起初也想了很久,一个个去分析,太慢。那我们先搜索b_short_fld看看,发现倪端。
h_short_fld += ((b_short_fld + m) * 4) / 5;
i_short_fld += (b_short_fld + m) / 5;
dataoutputstream.writeShort(b_short_fld);
前两个不就是什么所谓的隐式嘛?!那h和i又代表什么呢?暂且先不考虑。最后一句是io流操作,意思是把写入b_short_fld变量值。这个倒是给了点启示。

因为发现

dataoutputstream = new DataOutputStream(bytearrayoutputstream)).writeByte(f_byte_fld);

dataoutputstream.writeByte(g_byte_fld);

dataoutputstream.writeInt(a_int_fld);

dataoutputstream.writeInt(b_int_fld);

dataoutputstream.writeInt(c_int_fld);

dataoutputstream.writeInt(d_int_fld);

dataoutputstream.writeInt(e_int_fld);

dataoutputstream.writeInt(f_int_fld);

dataoutputstream.writeByte(z);

dataoutputstream.writeShort(a_short_fld);

dataoutputstream.writeShort(b_short_fld);

dataoutputstream.writeShort(e_short_fld);

dataoutputstream.writeShort(f_short_fld);

dataoutputstream.writeShort(g_short_fld);

只要把找到这些数据的源头,也就是属性值的源头了。最后的4个变量即是bb教程中的4个属性参数,这里就不作讨论了。
1.那么我们先从f_byte_fld变量开始。首先搜索,看看这个变量到底是代表什么含义的。这个变量搜索共有3处。前两处是写入和读取;另一处是赋初值public byte f_byte_fld = 0;所以暂且不管。

2. g_byte_fld变量,还是搜索,g_byte_fld = 1;另外还有几处判断,略去,有兴趣的迷友可自行研究。

另外,if(g_byte_fld < 99)

{g_byte_fld++;
……
}

猜测是等级,如果变量小于99,递加……。经测试,的确是表示等级的变量。那么我们把变量变为11试试,即把g_byte_fld = 1改为g_byte_fld = 1;那这个是显性函数,修改方法同bb教程,修改后如图:

3.变量a_int_fld = d_int_fld; b_int_fld = e_int_fld;那么我们先看变量d_int_fld
d_int_fld = (e_short_fld + n + g_byte_fld) * 12;
e_int_fld = (g_short_fld + p + g_byte_fld) * 12;
让我们看到了一些希望。因为72和60都是12的倍数,难道这就是我们所要找的数据。
据我们所知e_short_fld=5,g_short_fld = 4(前面已讲到),那么g_byte_fld就是前面2所讲的等级,即生命值和魔法值与生命和意志有关,而且与等级有关。那n与p又是代表什么呢?

public final void n()

{
e ae1[] = (e[])a_e_array1d_fld;
m = 0;
n = 0;
o = 0;
p = 0;
for(int i1 = 0; i1 < 5; i1++)
if(ae1[i1] != null)
{

m += ae1[i1].j[0];
n += ae1[i1].j[1];
o += ae1[i1].j[2];
p += ae1[i1].j[3];
}

在n()中赋值和递加。初值为n=0,p=0;代入,d_int_fld=72;e_int_fld=60,^_^,终于找到真身了。那么最简单修改就是修改12这个系数,因为这也既不改变原来的计算公式,也容易操作,当然你也可以修改成其它。说改就改,把12改成60,理论上应该是360和300.
Halo2.0操作步骤:打开jar,选择ao.class.右键editor class,出现下图:


反编译得,d_int_fld = (e_short_fld + n + g_byte_fld) * 12;在public final void n()中,那么halo2.0方法找到n,发现访问控制public,final已勾选,类型void,和反编译的完全相同,那么选择n方法下的code,如图

把159 bipush 12和180 bupush 12中的12均改成60后,保存方法,编译打包运行得:

与猜测得相一致。Binggo,当然,还可以直接修改这个隐式函数,这里不做讨论。(修改无极限,只要你能想到,修改的方法很多。我只是提供大家思路而已)

那么先前找到的a_int_fld是什么呢?继续查找,

public final void b(int i1)

{
a_int_fld += i1;

if(a_int_fld > d_int_fld)

a_int_fld = d_int_fld;

if(a_int_fld < 0)

a_int_fld = 0;

bs.a_as_static_fld.c();

if(a_int_fld == 0)

{
a((byte)6);

super.k = 0;

u = 24;

return;

} else

{

return;

}

}

所以可以知晓,a_int_fld代表生命值的当前值。同理可得b_int_fld代表魔法值的当前值。

4.变量c_int_fld,c_int_fld = 0;初值为0,难道是经验值?继续查找,

public final void f(int i1)

{
i1 *= 4;
for(c_int_fld += i1; c_int_fld >= f_int_fld;)
{
c_int_fld -= f_int_fld;

r();
}

if(c_int_fld < 0)

c_int_fld = 0;
bs.a_as_static_fld.e();

a_p_fld.a(i1);

}

既然出现f_int_fld,那么顺便查找一下,发现

f_int_fld = (g_byte_fld * g_byte_fld * g_byte_fld - g_byte_fld * g_byte_fld) + 80 * g_byte_fld;

看到80了,一阵激动,因为g_byte_fld的初值为1(前面已经搜索过)那么f_int_fld的初值就为80,哈哈,终于找到升级需要经验值了。为了验证我们的猜想,把80改成99试试,如图,的确如此:

呵呵,把f_int_fld改成1就可以实现,打一个怪可以升N级,或者自己编个函数,实现打一个怪升一级。

回到刚才的c_int_fld,那么当c_int_fld += i1; c_int_fld >= f_int_fld;时,c_int_fld += i1; c_int_fld -= f_int_fld;猜想c_int_fld变量代表经验值。因为,若c_int_fld=82>80时,那么就升级,经验值变为82-80=2.好,那我们来简单修改c_int_fld的初值。c_int_fld = 0,把0改成66试试。变量赋值语句在public final void c(byte byte0)方法中,修改后得下图:

至此,图一所涉及的所有参数等级数、经验值、升级需要经验值、生命值、法力值。已都找到并修改。
5.变量a_short_fld,a_short_fld =0,

if(g_byte_fld < 99)

{

g_byte_fld++;

n();

super.a.addElement(new aw((byte)3));

super.a.addElement(new aw((byte)4));

a_short_fld += 3;

}

分析得,a_short_fld变量是表示可加后可加点数的。为什么?首先初值是0,另外,在等级<99时,每升一级变量就在自身的基础上+3,推测应该是表示升级后可加点数。修改后如图:

至此,已经把io操作流中的写入数据一一分析。但好像还是遗漏了图2中的攻击和防御数值。那它们到底隐藏在何处呢?的确,我也找了很久没找到,后来发现,攻击与力量值有一定联系,随着力量数值的修改,攻击值也会变动

那么我们就来搜索b_short_fld这个变量。发现

h_short_fld += ae1[0] == null ? 0 : ((short) (ae1[0].a + (ae1[0].e * 5) / 2));

h_short_fld += ((b_short_fld + m) * 4) / 5;

i_short_fld += ae1[1] == null ? 0 : ((short) (ae1[1].a + ae1[1].e));

i_short_fld += ae1[2] == null ? 0 : ((short) (ae1[2].a + ae1[2].e * 2));

i_short_fld += ae1[3] == null ? 0 : ae1[3].a;

i_short_fld += ae1[4] == null ? 0 : ae1[4].a;

i_short_fld += (b_short_fld + m) / 5;

i_short_fld += g_byte_fld / 3;

h_short_fld和i_short_fld很特别,与力量有关的隐式函数,值得我们关注。
经修改发现,的确如我们所料(具体变量间如何变化,就不在展开,牵涉比较多的变量数据基础,怕很多迷友看得一头雾水。有兴趣的迷友可以自己参看一些基础知识。)

把h_short_fld += ((b_short_fld + m) * 4) / 5中的4改成40,i_short_fld += g_byte_fld / 3中的除法idiv改成乘法imul(具体图文不列举了,如果能熟练操作halo2.0的应该没有问题,即把偏移量为433:idiv,编辑(高级),修改成imul即可。)

得,攻击变为74,防御变为8

3、小结:本教程主要讲解如何去寻找目标数据,halo2.0上的操作讲解并不详细,请谅解!
数据准备中的所有数据已一一找到。

« 返回列表
发帖 回复