| 用Windows终端仿真程序实现微机远程文件传送1 |
| 当前位置: 论文资料 >> 计算机论文 >> 计算机应用 >> 用Windows终端仿真程序实现微机远程文件传送1 | ||
| 用Windows终端仿真程序实现微机远程文件传送1 | ||||
|
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 // 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 #include #include #include #include #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 #include #include #include #include #include #include #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()函数。 |
||||
|
|
||||