彩神彩票

加密鎖的使用技巧

        在使用硬件加密時,加密的強度主要依靠兩個方麵:一是加密鎖本身的設計結構,二是開發商使用加密鎖的技巧。在使用同一種加密鎖時,軟件的加密強度可能有很大的差別,因為很多開發商不是很熟悉加密鎖的使用方式,沒有充分利用加密鎖提供的加密方式,給破解者留下了漏洞。在應用加密鎖開發時加密的強度可以從兩個途徑提高:一是增加破解的工作量,二是增加加密點的複雜度。

        一、增加工作量的基本技巧:

        1、增加加密點的數量,在程序的多個位置,多次檢驗加密鎖的存在,存取數據,破解者必須識別並修改每個加密點,隻要有漏掉的加密點,程序就不能正常執行。

        2、增加複雜的循環或死循環等耗時操作,讓破解者難以跟蹤程序的執行。例如:

例1.1

RetCode = RY2_Find();
//加入多條語句,可以是與操作狗有關的,或者其他複雜的語
//句結構。
//後麵的例子如無特別說明,此標記都代表這個意思
while(RetCode<=0)//如果沒有找到鎖,則進入死循環
{
    int j = abs(random()/10);
    RetCode = RecCode-j;
}

        3、提高效驗和讀寫加密鎖的隨機性,使破解者難以理解程序的結構和執行規律。隨機性是加密的重要思想,合理應用應用隨機性還可以增加程序的複雜度,有效對抗分析軟件和加密鎖模擬器。例如:

例1.2

int j = abs(random()/100);
if(j%17==0){
    RetCode = RY2_Find();
    if(RetCode==0){
        //未找到鎖,出錯處理
    }else{
        RetCode = RY2_Open(...);//打開指定UID的加密鎖
        if(RetCode==0){
            //打開失敗,出錯處理
        }
    }
}

        二、增加加密點的複雜度的基本方法是增加迷惑語句,並根據加密鎖本身的特點使用一些編程技巧,迷惑就是增加破解者找到加密點的難度,使程序難於理解。常見的有一下幾種方式:

        1、不顯示出錯提示信息:這個技巧很重要,盡可能少地給用戶提示信息,因為這些蛛絲馬跡都可能導致解密者直接深入到保護的核心。比如,當檢測到破解企圖之後,不要立即給用戶提示信息,而是在係統的某個地方做一個記號,隨機地過一段時間後使軟件停止工作,或者裝作正常工作但實際上卻在所處理的數據中加入了一些垃圾。例如:

例2.1

可以改寫上麵的示例中
if(RetCode==0){} //未找到鎖,出錯處理 這句:
int flag = 1;
//此部分同例1.2
if(RetCode==0) //未找到鎖,出錯處理
{
    Flag--
}
//此部分同例1.2
if(flag==0){
    //這裏可以采用三種處理方法
    1.普通的:未找到加密鎖,退出程序
    2.迷惑性處理:啟動定時器,過一定的時間後結束程序
    3.迷惑性處理:破壞掉鎖內的數據,繼續運行程序。
}

        2、加入複雜的循環和死循環,讓破解者難以跟蹤,發現加密點。這個方法與例1.1類似:

例2.2

for ( ;; ){
int j = random() %1000;
    if(j%917==0){
        RetCode = RY2_Find();
        if(RetCode == 0){
        }else{
        }
    }
}

        3、隨機的讀寫和效驗加密鎖,在隨機的位置讀寫。這條技巧前麵已經多次應用,下麵舉例說說隨機位置的讀和寫:

例2.3

int i = abs(random()/5);
char buffer[512];
retcode = RY2_Write(handle, 0, buffer);//隨機寫人到某一塊
retcode = RY2_Read(handle,0, buffer);//讀出剛才寫入的那一塊

        4、把操作加密鎖和最終判斷程序執行是否合法的語句分開。這個技巧前麵的例子裏麵都用到了,就是不要在得到操作加密鎖的狀態後立即判斷狀態是否正常,而是在操作和判斷之間加入一定的代碼。

        5、加入無用的讀寫,效驗鎖的語句或其他無效代碼。

        6、在加密鎖內寫入讀出無效數據。當然不要應用真的應用這些數據。2.4、2.5、2.6常結合使用。

        三、下麵結合rockey2的特點說說綜合的編程技巧。

        1、使用加密鎖傳遞變量,把加密鎖內的存儲區當作臨時變量,變量需要賦值時,向鎖內寫入數據,需要應用變量的值時讀取加密鎖。

        a.傳遞局部或全局變量舉例

例3.1

void func(){
    int i;//這個變量的值將被寫入加密鎖,
    //鎖內值的更改和使用代替了變量i本身
    char buffer[512];
    memcpy(buffer,&i,sizeof(i))
    retcode = RY2_Write(handle, 0, buffer);
    while(...){
        if(...){
            int j
            retcode = RY2_Read(handle, 0, buffer);
            memcpy(&j,buffer,sizeof(i));
            //原來需要用變量i的現在改用臨時變量j,
            //j的值是從加密鎖內讀出來的
            retcode = RY2_Write(handle, 0, buffer);
            //原來把變量j的當前值寫入加密鎖,
            //相當於變量i的值發生了變化
        }
    }
}

        b. 傳遞函數的參數:

例3.2

普通的編程思路:
Func1(int i){}
Func2(){
    int j;
    Func1(j)
}
改寫為應用加密鎖的方式:
Func1(){
    int j;
    retcode = RY2_Read(handle, 0, buffer);
    memcpy(&j,buffer,sizeof(int));//這個過程相當於參數傳遞
}
Func2(){
    char buffer[512];
    int i;//這個是要傳遞的參數,
    memcpy(buffer,&i,sizeof(i))
    retcode = RY2_Write(handle, 0, buffer);
    Func1();
}

        2、把需要保存在磁盤上的數據全部或部分保存到加密鎖內.Rockey2提供了多達2560字節的存儲空間,可以把本來需要保存在磁盤上的重要的數據保存在加密鎖內,比如程序的配置信息,上次運行時得到的下次需要應用的數據等等

        3、使用多線程技術。利用多線程調試的複雜性可以有效迷惑破解者和破解軟件。可在一個線程中尋找加密鎖,隨機讀寫數據,在另外的線程中應用這些信息。多線程技術也是加密鎖應用的重要技巧。

彩神彩票