使用Proguard混淆J2ME应用程序

原创 2004年10月14日 17:47:00
 如果我们的开发的J2ME应用程序直接打包成JAR文件发布,那么存在被其他人反编译的可能。因为反编译class文件并不是一件困难的事情。为了保护我们的程序代码不被破解,我们可以使用混淆器Proguard。非常幸运的是eclipse已经把Proguard集成在一起了。

    Proguard是开源的软件,他是基于java语言写成的,因此他的运行需要java2运行环境。我们可以从http://Proguard.sourceforge.net 免费下载到。目前的最新版本为proguard3.0。把他解压缩安装在C:/proguard3.0.1。运行eclipse,选择菜单windows-preferences-j2me-obfuscation,在这里我们应该指定正确的Proguard的根目录,由于我们混淆的时候要保留扩展了MIDlet的类,不然程序将无法执行。所以在Proguard keep expressions中应该写public class * extends javax.microedition.midlet.MIDlet。请参考下图
2004923161556773.gif

 

 

 

 

 

 

 







 

 

 

    下面我们按照开发J2ME的应用程序一样编写代码、编译、预验证。为了节省时间,在这里略去这些步骤。以下面的代码为例演示如何使用proguard混淆J2ME应用程序:

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;

public class ImageGetter extends MIDlet implements CommandListener
{

    private Display display;
    public static final Command connCommand = new Command("Connect",
            Command.ITEM, 1);
    public static final Command exitCommand = new Command("Exit", Command.EXIT,
            1);
    private Form mainForm;
    private GetterThread gt;

    protected void startApp() throws MIDletStateChangeException
    {

        display = Display.getDisplay(this);
        mainForm = new Form("Image Getter");
        mainForm.append("Click Connect to get Image");
        mainForm.addCommand(connCommand);
        mainForm.addCommand(exitCommand);
        mainForm.setCommandListener(this);
        display.setCurrent(mainForm);
        gt = new GetterThread(this);
        gt.start();

    }

    public void setImage(Image image)
    {

        mainForm.append(image);
        display.setCurrent(mainForm);
    }

    protected void pauseApp()
    {

    }

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {

    }

    public void commandAction(Command cmd, Displayable disp)
    {
        if (cmd == connCommand)
        {
            synchronized (this)
            {
                notify();
            }
        } else if (cmd == exitCommand)
        {
            exitMIDlet();
        }
    }

    private void exitMIDlet()
    {
        try
        {
            destroyApp(false);
            notifyDestroyed();
        } catch (MIDletStateChangeException e)
        {
            e.printStackTrace();
        }
    }

    class GetterThread extends Thread
    {
        private ImageGetter midlet;
        public static final String URL = "http://localhost/j2medev.png";
        private HttpConnection httpConn = null;
        private InputStream is = null;

        public GetterThread(ImageGetter midlet)
        {
            this.midlet = midlet;
        }

        public void run()
        {
            synchronized (midlet)
            {
                try
                {
                    midlet.wait();
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            System.out.println("connect to server...");
            try
            {
                httpConn = (HttpConnection) Connector.open(URL);
                is = httpConn.openInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int ch = 0;
                while ((ch = is.read()) != -1)
                {
                    baos.write(ch);
                }
                byte[] imageData = baos.toByteArray();
                Image image = Image.createImage(imageData, 0, imageData.length);
                midlet.setImage(image);
                baos.close();
                is.close();
                httpConn.close();

            } catch (IOException e)
            {
                e.printStackTrace();
            }

        }
    }

}

右键选择项目GetImage-J2ME-create obfuscated package,这样proguard就会把除MIDlet之外的class文件混淆。如下图所示:
2004923162546804.gif

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 







 




在deploy文件夹内我们可以看到GetImage.jar、GetImage.jad和一些proguard产生的其他文件,你可以用jar命令解开GetImage.jar,发现他的另一个class文件已经被混淆成a.class了,MIDlet类则没有任何改变,Proguard除了混淆的功能之外同时会把我们的jar文件减小,提高一些运行效率。

 

 

用proguard混淆java web项目

工具:proguard 5.2 准备:web项目导出的jar包和war包,项目所需的jar包 过程: 1.proguard设置:   设置所要混淆的项目jar包,和混淆后的jar包名称。并添...
  • shen_ming
  • shen_ming
  • 2015年02月06日 11:12
  • 1526

代码混淆———Proguard使用最新,最全教程,亲自试验

最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而且网上资料最多的。由于不是纯JAVA项目...
  • baochanghong
  • baochanghong
  • 2016年07月13日 10:02
  • 2776

ProGuard代码混淆详细攻略

转载请标明出处:http://blog.csdn.net/shensky711/article/details/52770993 本文出自: 【HansChen的博客】 ProGuard简介和工...
  • shensky711
  • shensky711
  • 2016年10月09日 21:59
  • 5125

java项目加密,使用Proguard进行项目混淆加密

首先我介绍下我要混淆的项目框架是jeecg+easyui+spring(包含xml配置文件,导致部分class文件不能直接混淆)。下面开始说详细的操作步奏: 1)将web项目的src目录的jav...
  • marvel_cheng
  • marvel_cheng
  • 2017年02月06日 14:38
  • 3243

Android Proguard 混淆warning解决

这个看似简单的问题困扰了我好久了,我已经google了很多相关的信息了,但是在我看来总觉得他们说得不够全面,包括官方的文档(ps:可能是我的英语了解能力不够好^_^),好吧在这里我就来个比较全面、严密...
  • offbye
  • offbye
  • 2013年07月12日 12:17
  • 1728

Maven WEB 项目使用ProGuard进行混淆,最佳解决方案&详解

本文中介绍的项目使用了SSM框架。项目包结构: 该项目是典型的Maven WEB项目 主要混淆对象 对类的名称、属性、方法名都进行混淆 次要混淆对象 对类的名称不混淆,类的属性、方法名选择...
  • sinat_35100573
  • sinat_35100573
  • 2016年07月05日 17:31
  • 6143

Java之——使用proguard混淆java web项目代码

1.首先下载proGuard.zip到本地: proguard4.5beta4.tar.zip解压开, 2.新建文本文档,修改文件名为XXX.pro,然后复制下面内容到.pro -injars 'D:...
  • l1028386804
  • l1028386804
  • 2015年09月15日 23:04
  • 3949

混淆(Proguard)用法

混淆(Proguard)用法
  • bihansheng2010
  • bihansheng2010
  • 2016年05月09日 14:49
  • 2849

使用proguard对jar包做混淆加密遇到的问题及解决办法

因为需要对第三方提供独立jar包涉及到代码保护的问题,用到了代码混淆。网上推荐proguard(我使用的是GUI版本)进行混淆,试了一下遇到几个问题,记录在这里以便今后查阅。 1. 当前环境...
  • wpyily
  • wpyily
  • 2015年07月20日 19:35
  • 1202

Maven 环境下使用 proguard 混淆 多模块 J2EE工程

原文:https://my.oschina.net/noahxiao/blog/304746?utm_source=tuicool&utm_medium=referral#comment-list ...
  • lipei1220
  • lipei1220
  • 2017年03月15日 11:38
  • 1178
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Proguard混淆J2ME应用程序
举报原因:
原因补充:

(最多只允许输入30个字)