亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

保護自己的MIDlet程序之三:SNProtector

2019-11-18 16:10:32
字體:
來源:轉載
供稿:網友

有了前面的基礎,現在就開始實現SNPRotector。
這回我們對SNProtector又有哪些要求和目標呢?
1。和前面的OnceProtector和TimeProtector一樣要使用簡單;
2。用戶可以在程序里輸入用戶名和序列號并驗證;
3。允許用戶試用;
4。允許驗證后繼續運行程序。

好了,有了目標之后我們如何管理注冊碼呢?
放在資源里?放在程序里?這兩種方法都不方便批量的分發。
哪里呢?我選擇jad里面:)

分發的程序的jad里面有兩個用戶定義字段:
User: cakec
SN: 8180076728b161326ae2cc61b783b451
他們有什么用?看下去就明白了。

大家是不是又想到一個問題,如何可以像前面的兩個Protector一樣使用簡便
只需要判斷一下check,又能在用戶輸入注冊碼后再繼續運行呢?
因為check判斷和其它的startApp的初始工作在一個函數里面,難道有什么辦法
讓函數停止執行?然而如果主進程停止了執行,我又怎么顯示輸入注冊碼的界面,
響應用戶的輸入呢?思考10秒鐘然后看我的方案:)

看看你跟我想的是不是一樣:利用midlet的生命周期。
大家知道midlet每次pause之后再次切換的時候系統會調用startApp函數,
此時讓check通過不就可以了。

ok,下面來看實現:
首先是注冊碼輸入界面SNInputUI:

package vmlinux.app;

import javax.microedition.lcdui.*;

public class SNInputUI extends Form {

    TextField tfUser_;
    TextField tfSN_;
   
    public SNInputUI()
    {
        super(StringManager.get("SNInputUI.Title"));
        tfUser_=new TextField(StringManager.get("SNInputUI.User"),"",20,TextField.ANY);
        tfSN_=new TextField(StringManager.get("SNInputUI.SN"),"",60,TextField.ANY);
        this.append(tfUser_);
        this.append(tfSN_);
    }
   
    public String getUser()
    {
        return tfUser_.getString();
    }
    public String getSN()
    {
        return tfSN_.getString();
    }
}

這個沒有難度,不說了。
然后是SNProtector:

我們需要使用新的UI來獲取注冊信息,所以構造函數是這樣:

    public SNProtector(MIDlet app)
    {
        super(app);
        ui_=new SNInputUI();
        cmdDone_=new Command(StringManager.get("SNProtector.Done"),Command.SCREEN,1);
        cmdTry_=new Command(StringManager.get("SNProtector.Try"),Command.SCREEN,2);
        ui_.addCommand(cmdDone_);
        ui_.addCommand(cmdTry_);
    }

由于我們已經設置了基類Protector為CommandListener,所以需要改造一下基類:
修改Protector的commandAction并增加doCommand函數

    public void commandAction(Command c, Displayable d) {

        if(c==cmdOK_)
            app_.notifyDestroyed();
        else
            doCommand(c);
    }


    protected void doCommand(Command c)
    {
       
    }

然后在SNProtector重寫doCommand:

    protected void doCommand(Command c)
    {
        if(c==cmdDone_)
        {
                 。。。
        }
        else if(c==cmdTry_)
        {
                  。。。
        }
    }

當用戶選擇注冊的時候,要做的工作就是把用戶的輸入保存起來。
如果用戶選擇了試用,就需要一個標志,說明用戶要試用。
做完這些工作我們還需要提醒用戶暫停程序,然后再恢復程序
以便達到我們重新調用startApp的目的。

所以完整的doCommand就是這樣:

    protected void doCommand(Command c)
    {
        if(c==cmdDone_)
        {
            SNInputUI input=((SNInputUI)ui_);
            if(input.getUser().equals(app_.getAppProperty("User")))
            {
                try
                {
                    RecordStore.deleteRecordStore(SNRMS);
                }
                catch(Exception ex)
                {
                    //ignore
                }
                try
                {
                    RecordStore rs=RecordStore.openRecordStore(SNRMS,true);
                    byte[] buf=input.getSN().getBytes();
                    rs.addRecord(buf,0,buf.length);
                    rs.closeRecordStore();
                }
                catch(Exception ex)
                {
                    System.out.println(ex);
                }
                showAlert();
            }
        }
        else if(c==cmdTry_)
        {
            tryit=true;
            showAlert();
        }
    }


現在已經把用戶輸入的注冊碼保存了起來,在決定命運的check函數里就需要
把保存的信息讀出來然后對比判斷是否有效,這個就是check函數:

    public boolean check()
    {
        if(tryit)
        {
            tryit=false;
            return true;
        }
       
        boolean r=true;
        try
        {
            RecordStore rs=RecordStore.openRecordStore(SNRMS,true);
            RecordEnumeration e=rs.enumerateRecords(null,null,false);
            if(e.hasNextElement())
            {
                r=checkCode(generate(app_.getAppProperty("User"),new String(e.nextRecord())));
            }
            else
            {
                r=false;
            }
            rs.closeRecordStore();
        }
        catch(Exception ex)
        {
            r=false;
        }
        if(!r)
        {
            showUI();
        }

        return r;
    }

最后就是sn系統的核心checkCode和generate函數。
generate根據用戶名和輸入的注冊碼生成注冊序列號
然后checkCode比較生成的注冊序列號和驗證碼得出結論。
大家通過開頭的注冊碼是不是已經知道了,我在這個例子中
簡單的使用了md5加密來實現這個過程,下面就是實現:

    boolean checkCode(byte[] x)
    {
        boolean r=true;
        byte[] s=getCode();
        if(x!=null && s!=null && x.length==s.length)
        {
            for(int i=0;i<x.length;++i)
                if(x[i]!=s[i])
                {
                    r=false;
                    break;
                }
        }
        else
            r=false;
        return r;
    }
   
    byte[] getCode()
    {
        String sn=app_.getAppProperty("SN");
        if(sn==null)
            return null;
        else
        {
            //deserialize sn from text
            return sn.getBytes();
        }
    }
   
    public byte[] generate(String user,String code)
    {
        String u=app_.getAppProperty("User");
        if(u==null !u.equals(user))
            return null;
        else
        {
            //compute inner-code from user and code
            Md5 md5=new Md5(user+"/r/n"+code+"/r/nvmlinux snprotector");
            try
            {
                md5.processString();
                return md5.getStringDigest().getBytes();
            }
            catch(Exception ex)
            {
                System.out.println(ex);
                return null;
            }
        }
    }


怎么樣,這就是我的SNProtector的工作過程。
使用方法:在startApp開始加入if(!new SNProtector(this).check())return;

最后你除了要把開頭的兩條內容加入jad文件還需要告訴用戶一個密碼:123456
這個就是cakec的注冊密碼。

這個SNProtector距離實際應用還有相當距離,因為加密方法太簡單,隨便生成密碼
代入公式把生成的md5碼放到SN里面即可,只能象征性的意思一下。如何有更好的加密算法?
這個話題就太大了:)

有意見或建議請聯系vmlinuxx@Gmail.com,共同學習,共同提高:)

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费福利在线| 91久久嫩草影院一区二区| 美女精品视频一区| 成人黄色免费网站在线观看| 久久在精品线影院精品国产| 久久久久久久97| 久久色精品视频| 992tv在线成人免费观看| 亚洲www在线| 亚洲自拍偷拍视频| 国产精品日韩在线| 成人av资源在线播放| 亚洲成人网在线观看| 欧美成年人视频网站| 亚洲欧美国产精品va在线观看| 日韩美女在线观看一区| 欧美国产日韩中文字幕在线| 5566日本婷婷色中文字幕97| 中文字幕视频在线免费欧美日韩综合在线看| 日韩欧美精品免费在线| 久久偷看各类女兵18女厕嘘嘘| 91中文字幕在线观看| 97热在线精品视频在线观看| 亚洲精品一区在线观看香蕉| 欧美激情喷水视频| 97超碰蝌蚪网人人做人人爽| 亚洲成人黄色在线| 日韩美女av在线| 亚洲无av在线中文字幕| 97久久伊人激情网| 国产精品视频内| 欧美精品福利视频| 91亚洲国产成人久久精品网站| 亚洲一区二区久久久久久| 亚洲久久久久久久久久久| 亚洲人成网7777777国产| 性亚洲最疯狂xxxx高清| 久久久亚洲欧洲日产国码aⅴ| 97成人精品区在线播放| 一区二区三区国产视频| 久久久噜久噜久久综合| 欧美性开放视频| 色偷偷av一区二区三区乱| 国产丝袜一区二区三区免费视频| 亚洲风情亚aⅴ在线发布| 久久好看免费视频| 欧美高清videos高潮hd| 精品一区二区三区电影| 精品爽片免费看久久| 日韩欧美有码在线| 久久久日本电影| 日韩av电影在线播放| 亚洲国产精品国自产拍av秋霞| 欧美理论电影在线播放| 日韩欧美有码在线| 久久艳片www.17c.com| 成人黄色片网站| 欧美性猛交xxxxx免费看| 国产一区视频在线播放| 尤物99国产成人精品视频| 影音先锋欧美在线资源| 日韩欧美国产中文字幕| 91av视频导航| 欧美中文在线观看国产| 欧美大片在线免费观看| 亚洲人成人99网站| 日韩美女视频中文字幕| 欧美激情视频三区| 色偷偷91综合久久噜噜| 高清亚洲成在人网站天堂| 日韩av免费观影| 97超视频免费观看| 日本视频久久久| 最近2019年中文视频免费在线观看| 国内精久久久久久久久久人| 综合网日日天干夜夜久久| 欧美亚洲一级片| 热久久这里只有| 亚洲国产欧美一区二区三区久久| 亚洲女人被黑人巨大进入| 国产精品视频色| 日韩性生活视频| 亚洲成年人在线播放| 国产美女精彩久久| 国产亚洲精品久久| 亚洲欧美日韩国产精品| 亚洲美女视频网| 日韩精品久久久久久福利| 狠狠躁天天躁日日躁欧美| 一本色道久久综合亚洲精品小说| 亚洲va国产va天堂va久久| 高清日韩电视剧大全免费播放在线观看| 中文字幕亚洲二区| 欧美性极品xxxx娇小| 欧美视频精品一区| 亚洲欧洲在线免费| 亚洲美女激情视频| 欧美日韩国产一中文字不卡| 国产91精品青草社区| 91在线视频一区| 97在线看免费观看视频在线观看| 国产精品成人免费电影| 亚洲欧美视频在线| 欧美成人激情图片网| 欧美日韩在线第一页| 成人黄色免费看| 久久在精品线影院精品国产| 欧美在线视频一二三| 亚洲黄色av网站| 欧美性视频精品| 91香蕉嫩草神马影院在线观看| 日韩高清电影好看的电视剧电影| 26uuu日韩精品一区二区| 久久中国妇女中文字幕| 亚洲国产精品系列| 2021久久精品国产99国产精品| 国产成人在线一区| 国产成人+综合亚洲+天堂| 亚洲变态欧美另类捆绑| 久久久久日韩精品久久久男男| 日韩精品小视频| 日韩欧美成人精品| 亚洲成人激情在线观看| 岛国av在线不卡| 伊人伊人伊人久久| 亚洲娇小xxxx欧美娇小| 日韩中文字幕欧美| 奇米影视亚洲狠狠色| 亚洲无线码在线一区观看| 国产精品视频最多的网站| 在线视频欧美性高潮| 这里精品视频免费| 国产成人高清激情视频在线观看| 日韩中文字幕在线视频播放| 68精品国产免费久久久久久婷婷| 欧美日韩激情视频| 日本午夜人人精品| 2019亚洲男人天堂| 欧美日韩国产色| 成人中文字幕在线观看| 色综合久综合久久综合久鬼88| 欧美午夜xxx| 亚洲区免费影片| 自拍视频国产精品| 成人免费网站在线观看| 日本精品一区二区三区在线| 亚洲一区二区自拍| 中文字幕日韩电影| 亚洲欧洲日产国码av系列天堂| 91精品国产自产在线老师啪| 国产亚洲精品日韩| 国产精品亚洲视频在线观看| 欧美综合在线第二页| 日韩av在线免播放器| 午夜精品一区二区三区在线| 精品国内产的精品视频在线观看| 国产日韩中文在线| 国产精品中文久久久久久久| 久久九九精品99国产精品| 精品国偷自产在线视频| 欧美极度另类性三渗透| 日韩精品在线观看一区| 国产欧美一区二区三区在线看| 成人黄色短视频在线观看|