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();
} [NextPage]
catch(IOException _ex)
{
doSendFalse();
}
}
void doSendOk()
{
System.out.println("Send Ok");
isSend = true;
}
void doSendFalse()
{
System.out.println("Send False");
isSend = false;
}
} [NextPage]
通常,发送成功之后会有个判断或者是进行接着的方法,有的发送的方法本身就返回boolean变量,如果发送成功就返回true,反之就返回 false。上面的例子属于一般情况,我们可以用以下几个思路来考虑。1.发送成功后会运行doSendOk()方法,而发送失败就会运行 doSendFalse(),那么我们只要把这两个方法的位置换一下,那么即使发送失败,那么程序仍然会运行doSendOk()方法。我们用 jclasslib打开该class,然后查看sendSms()方法,看字节码:
0 aconst_null1 astore_12 new
#31 <java/lang/StringBuffer>5 dup6 ldc
#33 <sms://>8 invokespecial
#36 <java/lang/StringBuffer.<init>>11 aload_012 getfield
#18 <SMSXX.phoneNum>15 invokevirtual
#40 <java/lang/StringBuffer.append>18 invokevirtual
#44 <java/lang/StringBuffer.toString>21 astore_222 aload_223 invokestatic
#50 <javax/microedition/io/Connector.open>26 checkcast
#52 <javax/wireless/messaging/MessageConnection>29 dup30 astore_131 ldc
#54 <text>33 invokeinte***ce
#58 <javax/wireless/messaging/MessageConnection.newMessage> count 238 checkcast
#60 <javax/wireless/messaging/TextMessage>41 dup42 astore_343 aload_244 invokeinte***ce
#65 <javax/wireless/messaging/Message.setAddress> count 249 aload_350 aload_051 getfield
#22 <SMSXX.s>54 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.doSendOk>70 goto 78 (+8)73 astore_274 aload_075 invokevirtual
#78 <SMSXX.doSendFalse>78 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
|