塞班S60第三版手机证书申请平台
无须注册,最晚第二天中午即可取

举例:欲找《小兵传奇》可在框内输入
小兵传奇+附件”后点击搜索;
欲找N73可用的智能影院可在框内输入
N73+智能影院+附件”后点击搜索

 
标题: [其他] [教程]去除java游戏中的短信操作的简单教程
饕餮De爱恋
营长
Rank: 5Rank: 5
★游戏【狂】人→(上班忙碌中~)


UID 2611708
精华 0
积分 640
帖子 640
威望 0 点
财富值 770 塞班币
贡献值 0 点
好评度 2 点
交易信用 0 点
线下活跃度 0 点
阅读权限 25
注册 2007-12-28
手机型号  72&70★饕餮出品
来自 火星貧膿【游戏小强复活】
状态 离线
 
发表于 2008-2-5 21:33  资料  个人空间  短消息  加为好友 
[教程]去除java游戏中的短信操作的简单教程


[教程]去除java游戏中的短信操作的简单教程(转)

首先来了解下利用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 ph;
                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打开,定位(实际操作在2楼),
67行为:B6004B
75行为:B6004E
我们把004B和004E两个位置换下,保存,然后反编译看看,是不是OK了,接下来我们要做的是为了确保不发出短信出去(当然在有提示的时候按否也是一样的,但是为防止按错还是保险起见)把sms://这个改成其他字符吧,比如kim:// :),这样一运行到发短信的地方就发生异常,程序就运行catch中的doSendOk()了。
另外一种思路要你对流程很了解,不直接修改发送的代码,而是看doSendOk()和doSendFalse()这两个方法,既然发不出去会运行doSendFalse(),而doSendFalse()和doSendOk()二者只是一个变量的区别,那么我们把doSendFalse()中的        isSend = false改成        isSend = true,不就是和doSendOk()只是方法名之间的区别了吗,同样道理,改完后再把sms改成其他东西。(具体过程略,大家自己想想吧)。

介绍两个软件:1 UltraEdit(16进制编辑器,汉化必备基本工具)
                     2 小颖JAVA源代码反编译超级引擎(强有力的汉化助手):BAIDU上很容易找到


本帖最近评分记录
凭阴阳如反掌   2008-2-10 03:35  财富值  +5   感谢分享~




雪见..仙三..我的爱~

顶部
饕餮De爱恋
营长
Rank: 5Rank: 5
★游戏【狂】人→(上班忙碌中~)


UID 2611708
精华 0
积分 640
帖子 640
威望 0 点
财富值 770 塞班币
贡献值 0 点
好评度 2 点
交易信用 0 点
线下活跃度 0 点
阅读权限 25
注册 2007-12-28
手机型号  72&70★饕餮出品
来自 火星貧膿【游戏小强复活】
状态 离线
 
发表于 2008-2-5 21:33  资料  个人空间  短消息  加为好友 
[教程]快速定位需要修改的class文件中的16进制位置

首先讲下软件,需要下载一个名为:jclasslib的软件,并且需要安装JDK,下载下来的jclasslib一般是个压缩包,解压后目录下会有个名为bin的文件夹,里面的jclasslib.exe就是可执行文件。打开该文件,界面很清楚,选择打开我们需要修改的class文件。
比如我们需要修改的文件有这样一段代码:
public boolean a(String s1, String s2)
    {
        MessageConnection messageconnection = null;
        boolean flag = true;
        try
        {
            String s3 = "sms://" + s1;
            messageconnection = (MessageConnection)Connector.open(s3);
            TextMessage textmessage = (TextMessage)messageconnection.newMessage("text");
            textmessage.setAddress(s3);
            textmessage.setPayloadText("LS " + s2);
            messageconnection.send(textmessage);
        }
        catch(Throwable throwable)
        {
            flag = true;
        }
        if(messageconnection != null)
        {
            try
            {
                messageconnection.close();
            }
            catch(Exception exception)
            {
                return true;
            }
            return flag;
        } else
        {
            return true;
        }
    }
如果我们想把所有的true改成false。
在打开的class文件中左边会看到一系列菜单:

分别表示常量池,接口,域,方法,我们需要修改的是方法a(String s1, String s2),所以我们双击Methods,可以看见该class中的所有方法,我们找到我们需要修改的方法a,如果有很多a方法,可以对比反编译软件反编译的方法顺序来定位。我们找到a方法:

双击code,查看虚拟机指令:
  0 aconst_null
  1 astore_3
  2 iconst_1
  3 istore 4
  5 new #105 <java/lang/StringBuffer>
  8 dup
  9 invokespecial #106 <java/lang/StringBuffer.<init>>
12 ldc_w #676 <file://>
15 invokevirtual #107 <java/lang/StringBuffer.append>
18 aload_1
19 invokevirtual #107 <java/lang/StringBuffer.append>
22 invokevirtual #112 <java/lang/StringBuffer.toString>
25 astore 5
27 aload 5
29 invokestatic #677 <javax/microedition/io/Connector.open>
32 checkcast #678 <javax/wireless/messaging/MessageConnection>
35 astore_3
36 aload_3
37 ldc_w #679 <text>
40 invokeinterface #680 <javax/wireless/messaging/MessageConnection.newMessage> count 2
45 checkcast #681 <javax/wireless/messaging/TextMessage>
48 astore 6
50 aload 6
52 aload 5
54 invokeinterface #682 <javax/wireless/messaging/Message.setAddress> count 2
59 aload 6
61 new #105 <java/lang/StringBuffer>
64 dup
65 invokespecial #106 <java/lang/StringBuffer.<init>>
68 ldc_w #683 <LS >
71 invokevirtual #107 <java/lang/StringBuffer.append>
74 aload_2
75 invokevirtual #107 <java/lang/StringBuffer.append>
78 invokevirtual #112 <java/lang/StringBuffer.toString>
81 invokeinterface #684 <javax/wireless/messaging/TextMessage.setPayloadText> count 2
86 aload_3
87 aload 6
89 invokeinterface #685 <javax/wireless/messaging/MessageConnection.send> count 2
94 goto 102 (+8)
97 astore 5
99 iconst_1
100 istore 4
102 aload_3
103 ifnull 122 (+19)
106 aload_3
107 invokeinterface #687 <javax/microedition/io/Connection.close> count 1
112 goto 119 (+7)
115 astore 5
117 iconst_1
118 ireturn
119 iload 4
121 ireturn
122 iconst_1
123 ireturn
接下来我们对照虚拟机指令表:
(0x01)对应aconst_null
(0x4e)对应astore_3
(0x04)对应iconst_1
(0x36)对应istore
那么我们用Hex Workshops打开该class文件,搜索16进制关键字:014E0436,很快我们就定位到需要修改的地方了。
我们把该位置附近的0336和03AC修改成0436和04AC,保存,然后再看看:
public boolean a(String s1, String s2)
    {
        MessageConnection messageconnection = null;
        boolean flag = false;
        try
        {
            String s3 = "file://" + s1;
            messageconnection = (MessageConnection)Connector.open(s3);
            TextMessage textmessage = (TextMessage)messageconnection.newMessage("text");
            textmessage.setAddress(s3);
            textmessage.setPayloadText("LS " + s2);
            messageconnection.send(textmessage);
        }
        catch(Throwable throwable)
        {
            flag = false;
        }
        if(messageconnection != null)
        {
            try
            {
                messageconnection.close();
            }
            catch(Exception exception)
            {
                return false;
            }
            return flag;
        } else
        {
            return false;
        }
}
已经完成了修改了!





雪见..仙三..我的爱~

顶部
tony33333
士兵
Rank: 1



UID 921011
精华 0
积分 48
帖子 48
威望 0 点
财富值 48 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 5
注册 2007-2-4
手机型号 
状态 离线
 
发表于 2008-2-5 21:54  资料  个人空间  短消息  加为好友 
楼主强人,是修JAVA语言的?呵呵 佩服

顶部
″邊″→≮狂≯
中级评论员
Rank: 11Rank: 11Rank: 11Rank: 11
從開識儔現洅&傷訫


UID 1485390
精华 0
积分 1748
帖子 1748
威望 1 点
财富值 53 塞班币
贡献值 0 点
好评度 1 点
交易信用 0 点
线下活跃度 0 点
阅读权限 80
注册 2007-7-17
手机型号  N70/N73/7610
来自 河北&沧州→任丘
状态 离线
 
发表于 2008-2-5 22:40  资料  个人空间  短消息  加为好友  添加 ″邊″→≮狂≯ 为MSN好友 通过MSN和 ″邊″→≮狂≯ 交谈 QQ Yahoo!
强人 学习学习!





顶部
免费下载手机杀毒软件!
我欲为魔
排长
Rank: 3Rank: 3


UID 1892114
精华 0
积分 199
帖子 199
威望 0 点
财富值 218 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 10
注册 2007-9-22
手机型号 
状态 离线
 
发表于 2008-2-6 07:10  资料  个人空间  短消息  加为好友 
强人啊,能跟你学点就更好了,。

顶部
kitqq007
排长
Rank: 3Rank: 3


UID 2112327
精华 0
积分 206
帖子 206
威望 0 点
财富值 230 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 10
注册 2007-10-20
手机型号  5700黑红金刚
来自 GDDG
状态 离线
 
发表于 2008-2-6 09:27  资料  个人空间  短消息  加为好友  QQ
复杂....





顶部
287103605
班长
Rank: 2



UID 2894032
精华 0
积分 77
帖子 77
威望 0 点
财富值 119 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 10
注册 2008-2-2
手机型号 
状态 离线
 
发表于 2008-2-6 09:44  资料  个人空间  短消息  加为好友 
LZ真厉害,我光看就头晕了,佩服佩服

顶部
z41168742
士兵
Rank: 1



UID 2580929
精华 0
积分 41
帖子 41
威望 0 点
财富值 43 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 5
注册 2007-12-23
手机型号 
状态 离线
 
发表于 2008-2-6 14:02  资料  个人空间  短消息  加为好友 
真是强人啊  就是我看不懂啊

顶部
gmmjz
连长
Rank: 4


UID 263911
精华 0
积分 394
帖子 394
威望 1 点
财富值 440 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 15
注册 2006-6-25
手机型号 
来自 china
状态 离线
 
发表于 2008-2-6 20:55  资料  个人空间  短消息  加为好友 
佩服佩服

顶部
asd12315
班长
Rank: 2


UID 1783191
精华 0
积分 56
帖子 56
威望 0 点
财富值 58 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 10
注册 2007-9-7
手机型号 
状态 离线
 
发表于 2008-2-9 22:32  资料  个人空间  短消息  加为好友 
不懂

顶部
yymool
排长
Rank: 3Rank: 3


UID 2550498
精华 0
积分 226
帖子 226
威望 0 点
财富值 294 塞班币
贡献值 0 点
好评度 1 点
交易信用 0 点
线下活跃度 0 点
阅读权限 10
注册 2007-12-19
手机型号 
状态 离线
 
发表于 2008-2-10 01:39  资料  个人空间  短消息  加为好友 
很黄很暴力..........................

支持LZ.很爱LZ.....................

顶部
凭阴阳如反掌 (N70/游戏资源)
荣誉会员
Rank: 12Rank: 12Rank: 12
塞班首席执行官


软件战士奖  
UID 1060014
精华 1
积分 9841
帖子 9841
威望 55 点
财富值 18051 塞班币
贡献值 21 点
好评度 58 点
交易信用 0 点
线下活跃度 0 点
阅读权限 60
注册 2007-3-14
手机型号  NOKIA n70音乐版
状态 离线
 
发表于 2008-2-10 03:36  资料  个人空间  短消息  加为好友  QQ
感谢楼主分享~





★☆★遵守版规 人人有责★☆★看帖回帖 是种美德★☆★有疑问?找资源? 请善用搜索功能★☆★点击是偶的帖子★☆★
顶部
zhouxin1983
连长
Rank: 4
人肉好吃吗???


UID 2429260
精华 0
积分 337
帖子 337
威望 0 点
财富值 352 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 15
注册 2007-12-2
手机型号  小鸡鸡7610
来自 天堂村
状态 离线
 
发表于 2008-2-12 15:16  资料  个人空间  短消息  加为好友  QQ
LZ太牛了,  不过对我来说是太高深了,

顶部
Mylove旖旎
旅长
Rank: 7Rank: 7Rank: 7
<最爱塞班>


UID 2106790
精华 0
积分 1330
帖子 1330
威望 0 点
财富值 1550 塞班币
贡献值 0 点
好评度 2 点
交易信用 0 点
线下活跃度 0 点
阅读权限 35
注册 2007-10-20
手机型号  S60 V3
来自 上海徐汇
状态 离线
 
发表于 2008-2-12 15:36  资料  个人空间  短消息  加为好友 
谢谢楼主分享





像喜欢旖旎一样喜欢塞班
顶部
1009017
士兵
Rank: 1



UID 2649294
精华 0
积分 23
帖子 23
威望 0 点
财富值 23 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
线下活跃度 0 点
阅读权限 5
注册 2008-1-1
手机型号 
状态 离线
 
发表于 2008-2-12 20:47  资料  个人空间  短消息  加为好友 
介绍的详细,漫漫消化!

顶部
 



当前时区 GMT+8, 现在时间是 2008-10-14 07:53

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.043199 second(s), 7 queries , Gzip enabled

清除 Cookies - 联系我们 - 塞班智能手机网 - Archiver - WAP