ZOL博客
登录  |   注册  |   帮助
我的主页 日志 好友 相册
论坛
视频装备圈子 网摘
ZOL博客 > 活动策划→小马 的主页 > 日志

去除java游戏中的短信操作的简单教程


2007-11-13 13:36:14   浏览(746)
首先来了解下利用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_null
1 astore_1
2 new #31 <java/lang/StringBuffer>
5 dup
6 ldc #33 <sms://>
8 invokespecial #36 <java/lang/StringBuffer.<init>>
11 aload_0
12 getfield #18 <SMSXX.phoneNum>
15 invokevirtual #40 <java/lang/StringBuffer.append>
18 invokevirtual #44 <java/lang/StringBuffer.toString>
21 astore_2
22 aload_2
23 invokestatic #50 <javax/microedition/io/Connector.open>
26 checkcast #52 <javax/wireless/messaging/MessageConnection>
29 dup
30 astore_1
31 ldc #54 <text>
33 invokeinterface #58 <javax/wireless/messaging/MessageConnection.newMessage> count 2
38 checkcast #60 <javax/wireless/messaging/TextMessage>
41 dup
42 astore_3
43 aload_2
44 invokeinterface #65 <javax/wireless/messaging/Message.setAddress> count 2
49 aload_3
50 aload_0
51 getfield #22 <SMSXX.s>
54 invokeinterface #68 <javax/wireless/messaging/TextMessage.setPayloadText> count 2
59 aload_1
60 aload_3
61 invokeinterface #72 <javax/wireless/messaging/MessageConnection.send> count 2
66 aload_0
67 invokevirtual #75 <SMSXX.doSendOk>
70 goto 78 (+8)
73 astore_2
74 aload_0
75 invokevirtual #78 <SMSXX.doSendFalse>
78 return

我们需要利用的就是67行和75行这两段,我们只要把这两段的位置换一下就OK。用HEX打开,定位(怎么定位请看我的另一篇文章,快速定位需要修改的16进制位置),
67行为:B6004B
75行为:B6004E
我们把004B和004E两个位置换下,保存,然后反编译看看,是不是OK了,接下来我们要做的是为了确保不发出短信出去(当然在有提示的时候按否也是一样的,但是为防止按错还是保险起见)把sms://这个改成其他字符吧,比如kim:// :),这样一运行到发短信的地方就发生异常,程序就运行catch中的doSendOk()了。
另外一种思路要你对流程很了解,不直接修改发送的代码,而是看doSendOk()和doSendFalse()这两个方法,既然发不出去会运行doSendFalse(),而doSendFalse()和doSendOk()二者只是一个变量的区别,那么我们把doSendFalse()中的        isSend = false改成        isSend = true,不就是和doSendOk()只是方法名之间的区别了吗,同样道理,改完后再把sms改成其他东西。(具体过程略,大家自己想想吧)。
投稿:五花八门
谁顶了这篇日志>>  还有谁对该日志投票? 最近读者>>
4
好文,顶
0
烂文,踩
N_Fan 雨林小树
N_Fan 雨林小树
顶过
dongfangboy
dongfangboy
顶过
箜中霛雨
箜中霛雨
顶过
独孤忆人
独孤忆人
顶过
 
freesia
freesia
3小时前
 
网友评论>>
18
2008-09-21 20:58:42 - - | 回复
是不是JDK6.0的?你这里面居然说到里面有个“无线消息发送”的API?

17
2008-01-28 15:33:47 - - | 回复
慢慢来啊~!~!
可以边尝试边看~!

16
2008-01-28 15:03:24 - - | 回复
对编程不通 但值得收藏

15
2008-01-26 08:14:56 - - | 回复
晕,怎么都没看懂

14
2008-01-22 17:41:31 - - | 回复
哈哈,那个仁兄真搞笑!!!我更看不 懂

13
2007-12-20 08:24:44 - - | 回复
还没看完就晕了


12
2007-12-19 15:48:37 - - | 回复
这些是给高级菜鸟看的!!

11
2007-12-19 15:45:51 - - | 回复
顶!
我顶!
我再顶!
我用力顶!
我很用力顶!
我非常用力顶!
我用尽全力去顶!
就算鞋子烂也要顶!
就算腾讯倒闭也要顶!
就算天塌下来我都要顶!
要是天真塌下来了继续顶!
要是地面凹了我不管继续顶!
要是踩到我脚骨折我也继续顶!
要是别人见了骂我傻我还是要顶!
要是警察敢过来阻止我就更加要顶!
要是你看我不爽我没办法还要继续顶!
要是你觉得敢兴趣你也可以过来一起顶!
顶到地下水喷发造成洪灾损失惨重我也顶!
顶到益阳地震山崩地裂地下水泛滥我还要顶!
顶到火山喷发太平洋海啸我还要继续往死里顶!
顶到阎罗王说我制造噪音我刁根烟看看他继续顶!
顶到日天昏地暗惊天地泣鬼神我不管我还要继续顶!
顶到刚刚重建好的伊拉克房屋又倒塌了我不管还要顶!
顶到日本岛所有导弹由于震波影响而突然自爆我还要顶!
顶到正在坐飞机去日本嫖娼的水扁大哥坠机身亡我还要顶!
顶到在富士山上面的拉登同志被山上滑坡石头砸死我还要顶!

10
2007-12-17 14:38:23 - - | 回复
厉害!太佩服你拉!一点没看懂!

9
2007-12-13 10:37:43 - - | 回复
看的我都晕了,不过还是顶你。。。


发表评论:  
 
内 容:
插入表情 文采分大于5可以使用表情
   *Ctrl+Enter快速回复

针对ZOL博客您有任何使用问题和建议 您可以 联系博客管理员查看帮助
ZOL简介 | 用户注册 | 广告服务 | 人员招聘(月) | ZOL历程 | 互动营销中心 | 站点地图 | 联系方式 | 欢迎投稿 | RSS订阅 | 友情链接
Copyright ©1999 - 2008 ZOL. All rights reserved. 中关村在线 版权所有.