<form id="itnzz"><noscript id="itnzz"></noscript></form>

          1. <menuitem id="itnzz"></menuitem>
          2. 成人午夜激情在线观看,国产精品一线天粉嫩av,99精品国产综合久久久久五月天 ,一卡2卡三卡4卡免费网站,国产高清在线男人的天堂,五月天国产成人AV免费观看,67194熟妇在线观看线路,成人无码潮喷在线观看
            現在位置:范文先生網>理工論文>計算機論文>用Windows終端仿真程序實現微機遠程文件傳送1

            用Windows終端仿真程序實現微機遠程文件傳送1

            時間:2023-02-20 22:50:47 計算機論文 我要投稿
            • 相關推薦

            用Windows終端仿真程序實現微機遠程文件傳送1

               有些硬盤防拷貝是通過對硬盤FAT表中的簇鏈的檢測來實現的,這與本文所推薦的方法原理一樣,都是通過檢測文件位置信息是否被改變來判斷文件是否已被移動的。但前者涉及到定位FAT表及文件所在目錄等繁瑣工作,而且還和硬盤型號及格式化信息有關,編程很不方便。本文所介紹的方法則不然,它直接與操作系統打交道,取出操作系統內核中現成的數據,即利用DOS系統文件表(SYSTEM FILE TABLE 簡稱SFT)來實現防拷貝。
            當您打開硬盤上的一個文件并移動讀寫指針時,DOS會時刻記錄讀寫指針所對應的硬盤位置。一個稍大些的文件在硬盤上要占用多個簇,這些簇并不是連續的,而是由操作系統一般按照“就近循環分配”原則為該文件分配的,這些簇的絕對簇號具有一定的隨機性,在FAT表中形成一個簇鏈。移動讀寫指針超過一個簇的大小時,則所對應的絕對簇號也要變化。只要該文件沒有被移動過(拷貝或整理硬盤),這些簇號就是固定的。一旦該文件被移動了,根據DOS簇分配原則,這些對應的簇號就會改變。由此,我們可以檢查特定的文件指針所對應的絕對簇號是否改變了來判斷該文件是否已被非法移動。
            SFT是DOS在文件管理上的一個很重要的數據結構。只要DOS開始引用一個文件或設備,它必然要建立一個SFT。該表記錄了文件設備名、目錄特性、設備特性、文件大小和位置、DDPB(塊設備)或設備驅動程序標題(字符設備)的地址,以及打開模式等有關文件的存儲、訪問和操作的管理信息。其中有幾項數據可以用來確定文件在硬盤上的位置,它們是:文件讀寫指針所對應的絕對簇號,目錄項的相對索引號(即目錄項在目錄扇區中的序號),目錄項所在扇區的扇區號。
            那么怎樣利用這幾項數據防拷貝呢?這里所說的防拷貝是指可以拷貝但拷貝后的文件不能執行或不能被使用,包括數據文件和可執行文件。若是可執行文件,則其本身包括一段檢測代碼,用以判斷其本身是否已被非法移動。若是數據文件,則在使用該數據文件的可執行文件中包括一段檢測代碼,來判斷該數據文件是否已被非法移動。當第一次將一個文件裝入硬盤后,它所占有的硬盤的簇號已是固定的了。這樣我們就可以作一個加密程序,在該程序里,約定一個或多個秘密的值N,N1,N2…,然后將文件指針分別移動到N或N1,N2…,在SFT中取出那幾項硬盤位置數據,再用約定的秘密算法加以運算,就得到了包含被加密文件位置信息的“鑰匙”,將它存于另一個文件中或干脆附加在被加密文件的末尾。在使用該文件的可執行文件的檢測代碼中,按同樣的算法取得當前的“鑰匙”,與先前保存的“鑰匙”相比較,若相等,則說明文件沒有被移動過,程序正常執行,否則,說明文件已不在先前的位置了,即已被非法移動過了,則程序異常執行。
            我們先看看DOS系統中SFT的具體結構,系統有多個SFT,這個數目取決于CONFIG.SYS文件中的FILES=N的N值。在DOS4.0,5.0,6.0中,每個SFT的長度是3BH。多個SFT形成SFT數組,并不是整個系統的所有SFT組成一個連續的大數組,而是可能有多個SFT數組,每個數組由一個控制塊管理,它們之間由指針連接。每個SFT數組的結構如下:
            偏移量 長度 說明
            00H DWORD 指向下一個SFT數組的指針
            04H WORD 本SFT數組內的SFT數目
            06H nBYTEs 由SFT組成的數組(n=本數組中SFT數目*每個SFT所占字節數)
            我們還必須知道第一個SFT數組所在的地址。這可由DOS功能調用52H先取得DOS的多重表指針,在多重表偏移量04H處即是一個長指針,它即指向第一個SFT數組的頭部。這樣剩下的SFT數組的位置也就知道了。
            每當DOS打開一個新文件時,DOS就從這些SFT數組中找一個空閑的SFT項,分配給該文件。以后DOS就用此SFT控制訪問該文件。那么怎樣確定一個剛打開的文件所對應的SFT項是SFT數組中的第幾項呢?我們利用文件句柄和文件句柄表。每個進程都有一個文件句柄表,當我們打開一個文件時可得到該文件的句柄,它是一個整數,設為M,則在文件句柄表中的第M項即為該文件的SFT表項在SFT數組中的位置。
            那么怎樣找到文件句柄表呢?我們先用DOS功能調用51H得到程序段前綴(PSP)的地址,在PSP偏移34H處即是指向該進程文件句柄表的雙字指針。
            附圖給出怎樣找一個已打開文件的SFT。
            @@02A08500.GIF;附圖@@
            打開文件取得文件句柄是3,所對應的SFT的序號是6。
            下面就給出一個可執行文件防拷貝的例子。
            假設我們用C++語言編一個完成某一功能的程序NO-COPY.CPP,經過編譯連接生成可執行文件NO-COPY.EXE,要對這個可執行文件實行硬盤防拷貝。我們先編寫一個設置“鑰匙”的程序PUT-KEY,在該程序中按上述方法取得NO-COPY.EXE的“原鑰匙”(它包含了NO-COPY.EXE初次裝入硬盤時的位置信息),存于一個專用文件LOC-KEY.DAT中(當然也可直接附加在NO-COPY.EXE的末尾,取時也到文件末尾去取),在NO-COPY.EXE中必須包含一段檢測代碼。
            它也用PUT-KEY的方法取出自己的“當前鑰匙”,與存于LOC-KEY.DAT中的“原鑰匙”比較,相等則說明文件還在原處,正常執行。否則,說明正在執行的NO-COPY.EXE是被拷貝的副本,停止執行或異常執行。
            這里,不用考慮“鑰匙”的安全性,“鑰匙”是可以公開的,只要取得“鑰匙”的方法是保密的,非法拷貝者就無可奈何。可以這樣理解這個防拷貝方法:可執行文件本身具有自鎖性,在它每拷貝到一個新地點時就按文件位置上了一把新鎖,當它執行時,它到一個固定的地方去取“鑰匙”,打開本身的鎖執行。當它被移動后,可理解為鎖換了(因為位置變了)。用“原鑰匙”打不開,所以“原鑰匙”是可以公開的,PUT-KEY.EXE就是用來設置“原鑰匙”的。當合法用戶想把NO-COPY.EXE拷貝到一個新地方,只需運行一次PUT-KEY.EXE就可以使用新的NO-COPY.EXE了。所以PUT-KEY.EXE必須由合法用戶保管。
            先編寫一個取“鑰匙”的子程序,放在MAKE-KEY.CPP文件中,在該子程序中,分別取目錄項的相對索引號,目錄項所在扇區的扇區號,文件指針所對應的絕對簇號。采用相加的算法,形成“鑰匙”。這里只用了一個文件指針6000所對應的簇號,當然可以使用多個文件指針,采用更復雜的算法,如相乘、相除、異或、相減等。所用的文件指針和所用的算法是保密的。而算出的“鑰匙”可以是公開的。
            MAKE-KEY.CPP的內容如下(本文件用來被包含在PUT-KEY.CPP和NO-COPY.CPP中)。
            /*本子程序用來取filename的"當前鑰匙"*/
            unsigned long curentlocation-key(char filename)
            {
            unsigned long secc;
            int filehandle;
            int i,iii,jjj1,jjj2;
            unsigned char u-char=0;
            unsigne

            d int u-int=0;
            unsigned long u-long=0;
            unsigned int offst1,segmnt1,offst2,segmnt2;
            void psp-ptrr;
            unsigned char far ptrr1, ptrr2;
            FILE Stream;
            Stream=fopen(filename,"r+b");
            if(Stream==NULL)
            {cputs("open error");exit(1);}
            filehandle=fileno(Stream); //取文件句柄;
            fseek(Stream,6000,0); //將文件指針置于6000處;
            fread(&i,2,1,Stream); //讀一次,使DOS按此文件指針修正SFT;
            asm push es
            asm mov ah,51h
            asm int 21h //取程序段前綴(PSP)段地址;
            asm mov es,bx
            asm mov ax,word ptr es:[52] //偏移量34H為文件句柄表(FHT)地址;
            asm mov bx,ax
            axm mov ax,word ptr es:[54]
            asm mov es,ax
            asm add bx,filehandle //文件句柄表中偏移filehandle 處的一字節;
            asm mov al,byte ptr es:[bx] //為該文件的SFT在SFT數組中的序號;
            asm xor ah,ah
            asm pop es
            asm mov iii,ax //iii中存放文件的SFT在SFT數組中的序號;
            asm push es
            asm mov ah,52h //取DOS多重表指針;
            asm int 21h //es為段地址,bx為偏移量;
            asm mov ax,word ptr es:[bx+4] //多重表中偏移04H為第一個SFT數組控制塊指針

            asm mov offst1,ax //offset1為第一個SFT數組控制塊偏移量;
            asm mov ax,word ptr es:[bx+6]
            asm mov segmnt1,ax//segment1為第一個SFT數組控制塊段地址;
            asm mov es,segmnt1
            asm mov bx,offst1
            asm mov ax,word ptr es:[bx]
            asm mov offst2,ax//offset2為第二個SFT數組控制塊偏移量;
            asm mov ax,word ptr es:[bx+2]
            asm mov segmnt2,ax //segment2為第二個SFT數組控制塊段地址;
            asm mov ax,word ptr es:[bx+4]
            asm mov jjj1,ax //jjj1中存放第一個SFT數組的項數,一般為五
            asm mov es,segmnt2 //個(系統保留的五個常用文件的SFT);
            asm mov bx,offst2
            asm mov ax,word ptr es:[bx+4]
            asm mov jjj2,ax //jjj2中存放第二個SFT數組的項數,它一般等于
            asm pop es //CONFIG.SYS中FILES=N的N值減去第一個SFT
            //數組中SFT項數jjj1;
            ptrr1=(unsigned char far *)MK-FP(segmnt1,offst1+6);
            //ptrr1指向第一個SFT數組中第一個SFT
            Ptrr2=(unsigned char far *)MK-FP(segmnt2,offst2+6);
            //ptrr2指向第二個SFT數組中第一個SFT
            if(iii<jjj1) //若該文件的SFT序號小于第一個SFT數組的項數,則它的SFT
            { //一定在第一個SFT數組中;
            // for(i=0;i<0x3b;i++) //這兩行可用來顯示該文件的SFT;
            // printf(" %2x",ptrr1[iii*0x3b+i]); //在DOS4.0-6.0中共0x3b個字節;
            asm push es
            asm push di
            asm les bx,ptrr1 //第0個SFT的地址;
            asm mov ax, iii
            asm mov cx,3bh
            asm mul cx
            asm mov di,ax //第iii個SFT的地址,即要找的本文件的SFT;
            asm mov ax, word ptr es:[bx+di+1bh] //SFT中偏移1bH處是目錄項所在扇區的
            asm mov word ptr u-long,ax //扇區號,可用于定位文件,取出存于
            asm mov ax, word ptr es:[bx+di+1dh] //u-long中;
            asm mov word ptr u-long+2,ax
            asm mov al,byte ptr es:[bx+di+1fh] //偏移1fH處是目錄項的相對索引號,即

            asm mov u-char,al //錄項在目錄扇區中的序號,也可用于定位
            //文件的位置,取出存于u-char中;
            asm mov ax,word ptr es:[bx+di+35h]//SFT中偏移35H處是文件讀寫指針對應的
            asm mov u-int,ax//絕對簇號(2字節),取出存于u-int中;
            asm pop di
            asm pop es
            }
            else
            {
            iii-=jjj1; //第二個SFT數組中的SFT項和第一個SFT數組中的項是統一編號的;
            // for(i=0;i<0x3b;i++)
            // printf(" %2x",ptrr2[(iii)*0x3b+i]);
            asm push es
            asm push di
            asm les bx,ptrr2
            asm mov ax,iii
            asm mov cx,3bh
            asm mul cx
            asm mov di,ax
            asm mov ax,word ptr es:[bx+di+1bh]
            asm mov word ptr u-long,ax
            asm mov ax,word ptr es:[bx+di+1dh]
            asm mov word ptr u-long+2,ax
            asm mov al, byte ptr es:[bx+di+1fh]
            asm mov u-char,al
            asm mov ax,word ptr es:[bx+di+35h]
            asm mov u-int,ax
            asm

            pop di
            asm pop es
            }
            u-long+=u-int; //這里采用的秘密算法是相加;
            u-long+=u-char;
            fclose(Stream);
            retrun u-long;
            }
            下面就是設置“鑰匙”的PUT-KEY/CPP文件的內容。
            #include <stdio.h>
            #include <process.h>
            #include <dos.h>
            #include <io.h>
            #include <conio.h>
            #include "make-key.cpp" //將取鑰匙子程序包函進來;
            void main(int argc,char * argv[]) //命令行上是待加密的文件名;
            {
            unsigned long key=0;
            FILE *stream;
            if (argc<2)
            {cputs("specify a file");exit(1);}
            key=curentlocation-key(argv[1]); //取出文件當前“鑰匙”;
            stream=fopen("loc-key.dat","w+b"); //以寫方式打開“鑰匙”文件loc-key.da
            t;
            if(stream==NULL)
            {cputs("can't open file loc-key.dat");exit(1);}
            fwrite(&key,4,1,stream); //將當前“鑰匙”(4字節)寫入文件;
            fclose(stream);
            }
            下面就是NO-COPY.CPP的內容:
            #include <stdio.h>
            #include <stdlib.h>
            #include <conio.h>
            #include <dos.h>
            #include <io.h>
            #include <stddef.h>
            #include <process.h>
            #include "make-key.cpp" //將取鑰匙子程序包函進來;
            //該程序main()函數如下:
            int main()
            {
            //下面是一段檢測代碼,(可放在程序中必要的地方);
            unsigned long proto-key,curent-key;
            FILE*Stream;
            Stream=fopen ("loc-key.dat","rb");//以讀方式打開“鑰匙”文件;
            if(Stream==NULL)//若因破壞而打不開則退出;
            {cputs("loc-key.dat open error");exit(1);}
            fread(&proto-key,4,1,Stream);//取存放于文件中的“原鑰匙”(4字節);
            fclose(Stream);
            curent-key=curentlocation-key("d.exe");//按同樣的方法取“當前鑰匙”;
            if(curent-key!=proto-key)//比較“當前鑰匙”和“原鑰匙”;
            {
            cputs("The file has been moved and is invalid!");exit(1);
            }
            //若不相等,說明當前的文件位置與裝入時的位置不同,//文件已經被移動過,這里可異常執行;
            cputs("The file is valid");//否則正常進行,完成程序的功能;
            //以下是程序代碼;
            //...
            //...
            return 0;
            }//為了防跟蹤,當打不開“鑰匙”文件或發現文件已被移動過時,可不退出,而是
            //異常執行;
            以上程序用Borlandc c++3.1編寫,使用時,分別編譯連接PUT-KEY.CPP和NO-COPY.CP
            P形成PUT-KEY.EXE和NO-COPY.EXE。然后在DOS提示符下鍵入:
            NO-COPY
            就會得到loc-key.dat open error 的信息,程序退出,這是因為還沒有運行PUT-KEY來設置“鑰匙”。
            若先鍵入PUT-KEY NO-COPY.EXE 來為NO-COPY.EXE設置“鑰匙”
            再鍵入NO-COPY
            則得到The file is valid 說明正常執行。
            若將NO-COPY.EXE拷貝到其它目錄再執行就會得到loc-key.dat open error 的信息,程序退出。
            若將loc-key.dat 一起拷貝到其它目錄再執行
            則得到The file has been moved and is invalid!
            若先在新目錄運行PUT-KEY NO-COPY.EXE 來為新的NO-COPY.EXE設置“鑰匙”
            再運行新的NO-COPY
            則得到The file is valid 說明正常執行。
            若要對一個或多個數據文件加密,可對PUT-KEY.CPP稍加修改,再在使用這些數據文件的可執行文件的原程序中加入檢測代碼即可。若要修改加密算法或調整“鑰匙”的取出方
            法,則只需修改curentlocation-key()函數。


            【用Windows終端仿真程序實現微機遠程文件傳送1】相關文章:

            用Windows終端仿真程序實現微機遠程文件傳送08-06

            FoxPro for Windows 遠程撥號通訊功能的設計與實現08-06

            遠程終端中通信控制卡的設計與實現08-06

            用Borland C++3.1實現外設與Windows應用程序實時通信08-06

            Windows CE中實現藍牙串口驅動程序08-06

            用VB實現對庫文件的分割備份08-06

            用Protel99SE實現脈沖電路的仿真08-06

            車載GPS智能終端的設計與實現08-06

            用MSP430實現的嵌入式因特網終端設計08-06

            主站蜘蛛池模板: 国产成人久久综合一区| 国产高清视频一区三区| 亚洲av与日韩av在线| 国产精品亚洲一区二区三区喷水| 狠狠狠色丁香综合婷婷久久| 白丝乳交内射一二三区| 少妇高潮喷水久久久久久久久| 日韩一区二区三区东京热| L日韩欧美看国产日韩欧美| 国产精品一二二区视在线| 嫩草院一区二区乱码| 国产精品天干天干在线观看澳门| 欧洲精品色在线观看| 久久国产精品一国产精品金尊| 亚洲熟妇av综合一区二区| 国产不卡精品视频男人的天堂| 开心色怡人综合网站| 国产黄色大片网站| 尤物无码一区| 日韩精品亚洲专在线电影| 男人狂桶女人出白浆免费视频| 亚洲人妻精品一区二区| 亚洲精品视频久久偷拍| 18禁极品一区二区三区| 医院人妻闷声隔着帘子被中出| 精品国产粉嫩一区二区三区| 亚欧美闷骚院| 色综合天天综合天天更新| 国产精品白浆在线观看免费| 潮喷失禁大喷水av无码| 亚洲av无码成人影院一区| www亚洲精品| 9久久伊人精品综合| 97人妻免费碰视频碰免| 久久久久久伊人高潮影院| 波多野结系列18部无码观看a| 2020中文字字幕在线不卡| 午夜免费啪视频| 2021国产精品视频网站| 国产精品美女久久久久久麻豆| 欧美人与禽2o2o性论交|