当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
2015计算机二级考试指导:去除java游戏中的短信操作的简单教程
发布时间:2010/3/10 15:46:02 来源:城市学习网 编辑:MOON
  首先来了解下利用java实现短信发送的原理,这个使用的是j2me的可选包Wireless Messaging API(WMA,JSR120)来进行操作的,这是个敏感API,在未取得授权或认证,使用之前必须提示使用者是否要进行操作。对于有的型号的手机可以直接设置程序是否可以进行短信操作。所以一般来说,不会出现无缘无故发出短信而扣费的情况,除非你设置了总是允许操作这项(相信没几个人会这么做)。当然很多免费短信软件如悠信,XROSE什么的都是利用的这个API啦。由于设置了短信的游戏中目的只是为了收费,而且一般一条短信的价格都不菲,但是很多地方不发短信又无法继续进行游戏,那么,如果想继续免费玩下去,就得对短信操作进行处理。(一般来说发短信和连网不一样,不是必须发才可以实现结果的,同样是进下一关,网络下载就是必须进行的操作,而短信买关就不一样,那关其实是存在的,但是必须进行这一操作才可继续玩)首先是工具,必备的工具就是java反编译软件,UE或 HEX等16进制器,另外为了方便查看字节码还需要jclasslib。首先我们来看一段代码,一般的短信发送都是类似的,当然,你也可以利用这个自己写个免费发短信的东西:)
  import java.io.IOException;import java.io.PrintStream;import javax.microedition.io.Connection;import javax.microedition.io.Connector;import javax.wireless.messaging.*;class SMSXX{
  String phoneNum = "123456";
  String s = "发送的内容";
  boolean isSend = false;
  void sendSms()
  {
  MessageConnection messageconnection = null;
  try
  {
  String s1 = "sms://" + phoneNum;
  TextMessage textmessage;
  (textmessage = (TextMessage)(messageconnection = (MessageConnection)Connector.open(s1)).newMessage("text")).setAddress(s1);
  textmessage.setPayloadText(s);
  messageconnection.send(textmessage);
  doSendOk();
  }
  catch(IOException _ex)
  {
  doSendFalse();
  }
  }
  void doSendOk()
  {
  System.out.println("Send Ok");
  isSend = true;
  }
  void doSendFalse()
  {
  System.out.println("Send False");
  isSend = false;
  }
  }
  通常,发送成功之后会有个判断或者是进行接着的方法,有的发送的方法本身就返回boolean变量,如果发送成功就返回true,反之就返回 false。上面的例子属于一般情况,我们可以用以下几个思路来考虑。1.发送成功后会运行doSendOk()方法,而发送失败就会运行 doSendFalse(),那么我们只要把这两个方法的位置换一下,那么即使发送失败,那么程序仍然会运行doSendOk()方法。我们用 jclasslib打开该class,然后查看sendSms()方法,看字节码:
  0 aconst_null1 astore_12 new
  #31 java/lang/StringBuffer5 dup6 ldc
  #33 sms://8 invokespecial
  #36 java/lang/StringBuffer.init11 aload_012 getfield
  #18 SMSXX.phoneNum15 invokevirtual
  #40 java/lang/StringBuffer.append18 invokevirtual
  #44 java/lang/StringBuffer.toString21 astore_222 aload_223 invokestatic
  #50 javax/microedition/io/Connector.open26 checkcast
  #52 javax/wireless/messaging/MessageConnection29 dup30 astore_131 ldc
  #54 text33 invokeinte***ce
  #58 javax/wireless/messaging/MessageConnection.newMessage count 238 checkcast
  #60 javax/wireless/messaging/TextMessage41 dup42 astore_343 aload_244 invokeinte***ce
  #65 javax/wireless/messaging/Message.setAddress count 249 aload_350 aload_051 getfield
  #22 SMSXX.s54 invokeinte***ce
  #68 javax/wireless/messaging/TextMessage.setPayloadText count 259 aload_160 aload_361 invokeinte***ce
  #72 javax/wireless/messaging/MessageConnection.send count 266 aload_067 invokevirtual
  #75 SMSXX.doSendOk70 goto 78 (+8)73 astore_274 aload_075 invokevirtual
  #78 SMSXX.doSendFalse78 return
  我们需要利用的就是67行和75行这两段,我们只要把这两段的位置换一下就OK。用HEX打开,定位(怎么定位请看我的另一篇文章,快速定位需要修改的16进制位置),67行为:B6004B75行为:B6004E我们把004B和004E两个位置换下,保存,然后反编译看看,是不是OK了,接下来我们要做的是为了确保不发出短信出去(当然在有提示的时候按否也是一样的,但是为防止按错还是保险起见)把sms://这个改成其他字符吧,比如 kim:// :),这样一运行到发短信的地方就发生异常,程序就运行catch中的doSendOk()了。另外一种思路要你对流程很了解,不直接修改发送的代码,而是看doSendOk()和doSendFalse()这两个方法,既然发不出去会运行doSendFalse(),而doSendFalse()和 doSendOk()二者只是一个变量的区别,那么我们把doSendFalse()中的isSend = false改成isSend = true,不就是和doSendOk()只是方法名之间的区别了吗,同样道理,改完后再把sms改成其他东西。(具体过程略,大家自己想想吧)。
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved