国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

保護自己的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.56wlw.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产一起色一起爱| 丁香六月婷婷| 国产三级视频| 久久精品国产亚洲a∨麻豆| www在线播放| 开心婷婷激情| 国产精品久久在线| 亚洲成av人影片在线观看| 精品av中文字幕在线毛片| 国产一级大片| 精品国内自产拍在线视频| 在线天堂视频| 日本最新在线视频| www操操操| 国产高清免费av在线| 青青草视频在线免费观看| 中文字幕在线视频不卡| 天天激情综合| 精品日韩av| 中文字幕视频在线| 超碰在线观看免费版| 精品国产二区三区| 中文字幕日本在线| 久久精品国产麻豆| 国产福利电影在线观看| 天堂在线免费视频| 免费国产视频| 亚洲国产日韩成人综合天堂| 国产精品扒开做爽爽爽的视频| jizz亚洲大全| 日本动漫理论片在线观看网站| 国产不卡精品一区二区三区| 国产农村一级特黄α**毛片 | 国产乱码在线| 免费的黄网站在线观看| 精品日韩av| 国产精品扒开做爽爽爽的视频| 国产精品综合久久久久| 色综合久久五月天| 蜜桃av在线免费观看| 亚洲欧美国产另类首页| 精品电影在线| 精品国产高清自在线一区二区三区| 国产视频你懂的| 午夜视频在线| 国产精品美女一区二区视频| 国产精品欧美韩国日本久久| 综合激情亚洲| 国产精品美女一区二区视频| 国产精品久久久久久久牛牛 | 国产麻豆精品一区二区三区v视界| 精品成人一区二区三区免费视频| 国产精品久久久久久久牛牛 | 国产精美视频| 伊人影院在线观看| 亚洲社区在线| 国产在线精品一区二区不卡| 午夜av在线播放| 2019中文字幕在线电影免费| 亚洲永久免费网站| 非洲黑人最猛性xxxx交| 国产素人视频在线观看| 国产对白国语对白| 免费在线超碰| 国产激情在线| 免费在线看v| 国产成人亚洲精品播放器下载| 99在线视频观看| 青草在线视频在线观看| 国产精品亚洲色图| 在线国产1区| 国产免费电影网站入口| 伊人av免费在线观看| 国产美女av在线| 在线黄色av| 国产日韩精品在线看| 亚洲欧美精品日韩欧美| 丁香花在线电影小说观看| 精品欧美日韩一区二区| 天堂中文字幕在线| 伊人福利在线| 国产香蕉视频在线看| gogogo影视剧免费观看在线观看| 91xxx在线观看| 日本久久网站| 中文在线观看视频| 国产视频精品久久| 中文字幕在线影视资源| 欧美亚洲天堂| 免费电影网站在线视频观看福利| 亚洲视频在线网| √天堂资源中文www| 国产精品一二三区视频| 九九热在线观看视频| 青草在线视频在线观看| 日本片在线看| 欧美亚洲另类在线观看| 日本高清不卡中文字幕| 天天干天天摸| 青青草原av在线| 交视频在线观看国产| 国产在线观看a视频| 国内a∨免费播放| 五月天亚洲激情| 国产精品免费视频一区一| 国产一区二区三区不卡在线| 国产另类图片| 国产一级性片| 51成人精品网站| 亚洲精品一线| 国产中文字幕在线| 国产一区电影| 国产福利在线看| 在线国产91| 久久精品蜜桃| 国产污视频在线| 国产98在线| 日本视频在线| 国产毛片毛片| 国产丝袜精品丝袜| 91极品在线| 午夜亚洲成人| 国产69精品久久久久孕妇国产69久久 | 国产男女av| 国产在线观看色| 午夜视频99| 伊人网在线观看| 碰草在线视频| 国产偷激情在线| 国产高清视频在线播放| 精品国产福利一区二区在线| 波多野结衣久久高清免费| **三级三级97片毛片| 69视频在线观看| h网址在线观看| 国产三线在线| 好吊日视频在线观看| 在线国产91| 国产成人精品自线拍| 二区三区中文字幕| 亚洲xxxxxx| 992tv在线观看在线播放| 国产午夜视频| 午夜视频在线看| 日本在线视频www鲁啊鲁| 国产成+人+亚洲+欧美+综合| 国产精品一品| 国产在线激情视频| 亚洲激情丁香| 亚洲天堂久久久| 99re热在线观看| 99高清免费国产自产拍| 2019中文字幕在线电影免费| 国产私拍精品| 国产香蕉视频在线观看| 国产麻豆视频网站| 国产精品作爱| 国产羞羞视频在线播放| 最近中文字幕大全中文字幕免费 | 日本黄在线观看| 亚洲sss视频| 性色视频在线| a级在线观看| 亚洲www色| 亚洲精品xxxxx| 日本欧美在线视频免费观看| 一本大道五月香蕉| а√天堂8资源在线官网| 日本片在线看| 黄色片视频在线观看| 国产美女福利在线| 国产精品自拍在线观看| 五月亚洲综合| 国产桃色电影在线播放| 国产91久久久久| www.eeuss影院| 国产麻豆高清视频在线第一页| 国产精选在线观看| 尤物在线视频观看| 免费午夜一级| 国产精品第八页| jlzzjlzz欧美大全| 国产一二区在线观看| 伊人色综合网| 豆国产97在线|亚洲| 国产福利av网站| 欧洲亚洲精品视频| 国产激情在线观看| 啪啪免费视频一区| 国产精品扒开做爽爽爽的视频| av网站大全在线| 国产深夜福利| 久热中文字幕精品视频在线| 日本中文字幕在线看| gogo在线观看| 18激情网站| 国产网红在线观看| 久久久久久国产视频| 在线免费看av| 国产精品9区|