J2ME游戏破解心得之二
2011-01-18 22:40
267 查看
上一次一篇《J2ME游戏破解心得暨反编译字节码操作研究》记录了我破解一款RPG游戏的短信计费代码,不出一个月,被许许多多的网站转载,而且没有注明出处。当然,这到不是最重要的,重要的是大家学会了破解的方法。
最近在破解另一个深受大家喜爱的游戏时(名字我还是不提了),遇到了和上次不同的问题,虽然都是发送短信计费,但代码的结构和逻辑发生了比较大的变化。上次破解时,关于发送短信的判断比较简单,就是成功了就返回成功,失败了捕捉异常返回失败,破解点也就显得简单,只需把返回失败的地方改成返回成功就行了。而这次是使用了一个匿名的线程类,发送时启动一个线程去处理,外部通过一些发送的状态变量值来判断。该类对应的文件是b.class,而匿名的线程类被编译到b$1.class中。b$1.class文件反编译出的代码如下:
可见要发送两次短信进行计费(心太黑了),b.try就是外部用于判断是否发送够的标志,发送够之后还做了其他一些事情。可见,用上一次的更改true、false不行了。网上也有一个例子是sendOK和sendFalse两个函数交换位置的,在这里也行不通。
我尝试了更改字节码,但发现在需要更改这样较多的字节码时,很难做到不出错。最后还是想到用javassist来处理,思路就是把messageconnection.send(textmessage);这一句“干掉”,当然,你也可以把MessageConnection相关的都“干掉”,那样连提示发送短信都没有了。
经过多方查找,找到了CtMethod的instrument方法,该方法可以对method内部的每一个表达式进行判断、替换,下面就来看看“干掉”send调用的代码:
这个ExprEditor的意思就是,当表达式是调用MessageConnection类的send方法时,对该调用进行替换,我这里是替换成空字符串。
至此,该类替换完毕。反编译替换后的b$1.class代码变成以下:
send那一行代码的确没有了,但多了两行这样的代码:
TextMessage textmessage1 = textmessage;
MessageConnection messageconnection1 = messageconnection;
不知道是为什么,但明显这两行对整个方法没有影响。
重新打包进jar,放在手机上测试,成功!
注意:
由于这是J2ME的程序,破解时最好新建一个J2ME的项目,尽管实际上就是一般的java控制台程序。因为我之前用java项目,class是改了,但是打进jar包运行要出错,而在J2ME项目下,修改后的class打进jar包是成功运行了的。
最近在破解另一个深受大家喜爱的游戏时(名字我还是不提了),遇到了和上次不同的问题,虽然都是发送短信计费,但代码的结构和逻辑发生了比较大的变化。上次破解时,关于发送短信的判断比较简单,就是成功了就返回成功,失败了捕捉异常返回失败,破解点也就显得简单,只需把返回失败的地方改成返回成功就行了。而这次是使用了一个匿名的线程类,发送时启动一个线程去处理,外部通过一些发送的状态变量值来判断。该类对应的文件是b.class,而匿名的线程类被编译到b$1.class中。b$1.class文件反编译出的代码如下:
public void run() { try { b.if = true; MessageConnection messageconnection = null; String s = "sms://" + b.access$000(b.this); System.out.println(s); messageconnection = (MessageConnection)Connector.open(s); TextMessage textmessage = (TextMessage)messageconnection.newMessage("text"); textmessage.setPayloadText(b.access$100(b.this)); messageconnection.send(textmessage); messageconnection.close(); b.int[0]++; b.this.do.setRecord(1, b.int, 0, 1); if (b.int[0] < 2) { b.try = 3; } else { g.j = 1; a.do(); b.if = false; b.try = 6; } } catch (Exception exception) { b.try = -1; exception.printStackTrace(); } }
可见要发送两次短信进行计费(心太黑了),b.try就是外部用于判断是否发送够的标志,发送够之后还做了其他一些事情。可见,用上一次的更改true、false不行了。网上也有一个例子是sendOK和sendFalse两个函数交换位置的,在这里也行不通。
我尝试了更改字节码,但发现在需要更改这样较多的字节码时,很难做到不出错。最后还是想到用javassist来处理,思路就是把messageconnection.send(textmessage);这一句“干掉”,当然,你也可以把MessageConnection相关的都“干掉”,那样连提示发送短信都没有了。
经过多方查找,找到了CtMethod的instrument方法,该方法可以对method内部的每一个表达式进行判断、替换,下面就来看看“干掉”send调用的代码:
public static void main(String[] args) throws Exception{ ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.get("c.b$1"); System.out.println(cc.getName()); CtMethod cm = cc.getDeclaredMethod("run", new CtClass[0]); cm.instrument(new ExprEditor() { public void edit(MethodCall m) throws CannotCompileException { if (m.getClassName().equals("javax.wireless.messaging.MessageConnection") && m.getMethodName().equals("send")) m.replace("{ }"); } }); cc.writeFile(); } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/paulluo0739/archive/2009/12/29/5099068.aspx
这个ExprEditor的意思就是,当表达式是调用MessageConnection类的send方法时,对该调用进行替换,我这里是替换成空字符串。
至此,该类替换完毕。反编译替换后的b$1.class代码变成以下:
public void run() { try { b.if = true; MessageConnection messageconnection = null; String s = "sms://" + b.access$000(b.this); System.out.println(s); messageconnection = (MessageConnection)Connector.open(s); TextMessage textmessage = (TextMessage)messageconnection.newMessage("text"); textmessage.setPayloadText(b.access$100(b.this)); TextMessage textmessage1 = textmessage; MessageConnection messageconnection1 = messageconnection; messageconnection.close(); b.int[0]++; b.this.do.setRecord(1, b.int, 0, 1); if (b.int[0] < 2) { b.try = 3; } else { g.j = 1; a.do(); b.if = false; b.try = 6; } } catch (Exception exception) { b.try = -1; exception.printStackTrace(); } }
send那一行代码的确没有了,但多了两行这样的代码:
TextMessage textmessage1 = textmessage;
MessageConnection messageconnection1 = messageconnection;
不知道是为什么,但明显这两行对整个方法没有影响。
重新打包进jar,放在手机上测试,成功!
注意:
由于这是J2ME的程序,破解时最好新建一个J2ME的项目,尽管实际上就是一般的java控制台程序。因为我之前用java项目,class是改了,但是打进jar包运行要出错,而在J2ME项目下,修改后的class打进jar包是成功运行了的。
相关文章推荐
- J2ME游戏破解心得暨反编译字节码操作研究
- J2ME游戏破解心得之二
- 飞行游戏程序设计要点【做J2ME游戏时候的一些心得】
- 破解游戏苹果机最强心得
- Android破解游戏内购心得
- 【代码】如何快速将J2me游戏移植到Android上
- 浅谈即时战略游戏在 J2ME 上的实现
- Eclipse开发J2ME程序之图形化游戏
- J2me Game开发技巧:手机游戏中声音播放及处理
- 转【iOS应用安全】游戏安全之IPA破解原理及防御
- 用j2me编写手机软件不是手机游戏
- J2ME游戏优化秘密
- cocos2dx android游戏防破解总结
- Flash游戏破解
- J2ME游戏开发中使用层的概念
- 开发易于移植的J2ME游戏(一)
- j2me游戏引擎的基本构成--场景管理器
- 为J2ME开发移动3D游戏之立即模式
- J2ME Tutorial, Part 3: 探究MIDP 2.0的游戏API (一)
- J2ME 游戏开发之GameCanvas的使用