快速定位*.class文件中需要修改的位置

首先讲下软件,需要下载一个名为: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;
        }
}
已经完成了修改了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值