Minisoyo社区's Archiver

欢迎注册泡面三国

feiying145 发表于 2007-1-5 14:37

梦幻模拟战破解教程

梦幻模拟战破解教程

游戏采用二次联网收费,具体表现为游戏中弹出保存菜单然后联网存储验证收费再回到游戏中存储,操作界面如下图:

[attach]11327[/attach]  
                                    
       调用存储菜单

[attach]11328[/attach]  
                  
       联网验证选择菜单

  [attach]11329[/attach]  

      进行服务器存单界面

   [attach]11330[/attach]              
    存档完成返回游戏界面

破解的关键是分析联网存储的方法和游戏中数据存储和读取的方法,然后进行修改跳过联网验证界面进行游戏存储和读取。

破解步骤:

[b]1、分析游戏存储和读取方法:[/b]

       游戏的存储和读入是利用RMS进行,所以通过观察反编译后的源代码发现游戏的存储在c.class类中。在eclipse中搜索openRecordStore发现很多相关的方法,但这个游戏为SLG游戏,这类游戏每一关的数据量一定很大,经比较确定代码较长的private static boolean v()方法为记录存储关卡数据的方法。

[b]2、分析v()方法的上层调用方法:[/b]

      在eclipse中搜索v()发现,private static void n()调用了v()而private static void aK()又调用了n(),那我们看一下aK()方法:

private static void aK()
    {
        boolean flag = true;
        switch(O)
        {
        case 103: // 'g'
            f();
            break;

        case 102: // 'f'
            e();
            break;

        case 101: // 'e'
            b();
            break;

        case 104: // 'h'
            c();
            break;

        case 105: // 'i'
            d();
            break;

        case 0: // '\0'
            System.out.println("before flowLogo...");
            k();
            return;
   
        省略。。。。

        case 8: // '\b'
            n();
            return;
省略。。。。
}

由代码中的System.out.println("MODE_game_choose!!!")我们可以确定这是一个游戏状态的处理方法。即当 O= 8时调用n()进行数据存储。

[b]3、分析网络数据处理方法:[/b]

      观察源代码发现游戏使用HttpConnection访问网络,具体实现为a.class。在a.class搜索Connector.open找到private static byte[] a(String s, String s1) 访法。
一般发送数据都会放在线程里面完成,所以A必然是一个线程,run方法里面才是真正调用发送数据,而run要能被调用,必然是thread的start方法,那么必然有人要调用a类,然后让a类来调用start方法。
游戏中的表现为构造函数a(int i)中l = new Thread(this)创建新线程, l.start()调用run()方法,然后调用a(String s, String s1)开始向网络发送数据。
我们找一下谁调用了a(int i)方法,搜索分析后确认c.class中的public static a e = new a(),而public static final void a(byte byte0) 方法中对a类的实例e进行了处理。进一步分析public static final void a(byte byte0) 方法,发现101,104都会向网络发送数据,代码如下。

public static final void a(byte byte0)
    {
        if(O == byte0)
            return;
        switch(byte0)
        {
        case 4: // '\004'
        case 102: // 'f'
        case 105: // 'i'
        default:
            break;

        case 101: // 'e'
            if(e == null)
                e = new a();
            e.a(1);
            break;

        case 104: // 'h'
            if(e == null)
                e = new a();
            e.a(0);
            break;

        case 103: // 'g'
            a(a.c, b - 2, 30, c - 10, (c - 40) / d);
            break;
        }
        aZ = 0;
        O = byte0;
}

[b]4、游戏状态判断:[/b]

      那么回到刚才那个游戏状态方法aK,可以发现前面都是103、102、101、 104、105进一步分析case后面的方法,发现实际上这些函数都跟网络有关。那我们做一个猜测101-105是跟网络有关的状态,其中只有101和104只有这两个才是真正发送数据,而102、105、103、4都是中间状态,例如选择菜单,选择代理模式等等。我们要确定是谁进入了网络状态,然后又从网络状态出来的,要破解的就是不让其进入网络状态。

破解前游戏流程:游戏中->网络状态(101-105)->游戏中。
破解后游戏流程:游戏中->游戏中。

确定游戏进入到网络的初始状态值: 101-105都和网络有关的状态,所以必然是101-105以外的一个值进入到101-105之内的一个值。

①103的f方法里面有a((byte)101),可以排除101是初始进入但103不能排除,103可能为初始进入状态值。
    public static final void f()
    {
        if(R == 56)
        {
            if(n < j.length - m)
            {
                n++;
                return;
            }
        } else
        if(R == 50)
        {
            if(n > 0)
            {
                n--;
                return;
            }
        } else
        {
            if(R == 1 || R == 53)
            {
                a((byte)101);
                return;
            }
            if(R == 2 && a.b == 2)
                a((byte)4);
        }
    }

其中a((byte)4)为返回到游戏中,代码如下:

省略。。。。
switch(byte0)
        {
        case 4: // '\004'
        case 102: // 'f'
        case 105: // 'i'
        default:
            break;
省略。。。。

②104调用c方法,代码中只有a((byte)4)返回状态,所以排除。
public static final void c()
    {
        if(o <= 450)
        {
            o++;
            return;
        }
        if(R == 2)
        {
            e.a();
            a((byte)4);
        }
    }

③101调用b方法,很明显它是一个游戏状态控制方法,所以排除。
  public static final void b()
    {
        if(o <= 450)
        {
            o++;
            return;
        }
        if(R == 2)
        {
            e.a();
            a(a.h, b - 2, 30, c - 10, (c - 40) / d);
            a((byte)102);
            return;
        }
        if(f == 999)
            return;
        switch(f)
        {
        case 0: // '\0'
            a((byte)8);
            return;

        case 99: // 'c'
            a(a.g, b - 2, 30, c - 10, (c - 40) / d);
            a((byte)102);
            return;

        case -1:
            a(a.h, b - 2, 30, c - 10, (c - 40) / d);
            a((byte)102);
            break;
        }
    }

④102调用e方法,代码中确认时执行a((byte)4)返回状态,所以排除。
public static final void e()
    {
        if(R == 1 || R == 53)
        {
            a((byte)4);
            return;
        }
        if(R == 56)
        {
            if(n < j.length - m)
            {
                n++;
                return;
            }
        } else
        if(R == 50 && n > 0)
            n--;
    }

⑤105调用d方法里面有a((byte)104),可以进一步排除104是初始进入,但105不能排除。
public static final void d()
    {
        if(R == 1 || R == 53)
        {
            k = 0;
            a((byte)104);
            return;
        }
        if(R == 50 || R == 56)
            i = !i;
    }

游戏中使用数字键2(R == 50)、8(R == 56))选择菜单选项,数字键5确认选择然后调用a((byte)104)进行网络操作,与105调用的d方法符合,确认105可能为初始进入状态值。

[b]5、确认修改调用参数:[/b]

      接下来,你在eclipse中搜索出现105的地方.也就是说我们要找到那里设置了105这个状态.而从上面来看我们知道a(byte byte)方法是用来设置状态的。注意:变量o为int类型(public static int o = 0)而public static final void a(byte byte0)的参数类型为byte,参数传递前需强制转换为byte型,所以搜索a((byte)105),找到代码如下:
  private static void aj()
    {
        switch(aA)
        {
       省略。。。。
        case 2: // '\002'
            a((byte)105);
            aZ = 0;
            return;
省略。。。。
   }
此处的2是101-105以外进入到101-105之内的值,而103没有进入值所,确认初始进入状态值为105。如果这一步不能通过代码分析确认105,可假定103或105分别进行修改然后调试确认。这个游戏只有一处a((byte)105),将其修改为a((byte)8)即可完成破解。
破解后效果如下图:
[attach]11343[/attach]                    [attach]11344[/attach]

xstubborn 发表于 2007-1-5 17:03

好东西~~学了JAVA再研究

443200530 发表于 2007-1-5 17:35

强烈支持FY原创,支持!!!

bb 发表于 2007-1-5 19:20

支持啊啊。。。怎么没有jar

gmdragon 发表于 2007-1-15 23:36

怎么没有破解后的软件

bb 发表于 2007-1-15 23:52

破解的貌似只能白金会员使用

h585 发表于 2007-4-26 14:54

可惜的是好多代码编译不回去,说 JVM INSTR pop 是不认识的代码?怎么编译回去?谢谢!

303332149 发表于 2007-4-26 14:58

用他破解火焰2

h585 发表于 2007-4-26 15:50

火焰2代码编译不回去。

peterjujuju 发表于 2007-8-15 11:04

先把你顶了 我再看

wangjianra2386 发表于 2008-1-14 00:34

好像我的手机还是不行呀。。。。:困-_- :困-_- :困-_-

dp56151b9 发表于 2008-1-20 22:28

这游戏破解版好像出了!期待2的破解版

linghuchongxajh 发表于 2008-2-15 17:34

挺难的!不过支持

ymksrnr 发表于 2008-3-22 09:58

大哥,你不用讲解了,帮我们破了吧,我找了好多,就是没破解版的啊!

document 发表于 2008-4-10 09:18

好复杂,直接破解了放上来不就行了?

jklm831 发表于 2008-5-20 21:05

Re

[img]http://www.cuteseo.cn/images/1.gif[/img]

走过路过看贴拿米走人~~~

[color=wheat]我的链接:[/color][url=http://service.cuteseo.cn/service_yhfw.htm][color=wheat]搜索引擎优化服务[/color][/url]
[url=http://service.cuteseo.cn/service_yxfw.htm][color=wheat]搜索引擎营销服务[/color][/url]
[url=http://service.cuteseo.cn/service_yxch.htm][color=wheat]网络营销策划服务[/color][/url]
[url=http://service.cuteseo.cn/service_tgfa.htm][color=wheat]网站推广方案[/color][/url]
[url=http://service.cuteseo.cn/service_wzyh.htm][color=wheat]网站优化方案[/color][/url]

梦ぃ浪子 发表于 2008-7-19 13:35

看不懂啊`~~

iou_y 发表于 2008-7-23 14:48

那些代码怎么去确定呢

wangzhe8699 发表于 2008-7-23 20:23

厉害,支持原创,辛苦

思緒飛楊 发表于 2008-8-26 01:50

不错的教程。慢慢来消化一下。一定要学会。。嘻嘻

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.