解开后有一个EXE文件和一个HEX文件。将HEX文件 ISP写入单片机,运行ShowID.exe, 设置好串口号,波特率随便设,例如9600,按【读取信息】键即可读取ID等信息。
(该工具组主要是方便检验唯一ID的,实际应用请看官方数据表里有C语言的范例。图中为一块STC12C5A08S2为例,请看其显示的结果与使用编程读取以上15位数据通过串口发送,用最新的程序匠人的“串口猎人”V26接收显示是一样的!:) )
不同的芯片的ID都是唯一的,上图是两个不同批次的STC12C5410AD的ID。该ID使用7位字符,可以描述的总数为: 256^7=72,057,594,037,927,936个(天文数字)!应该不会重复了吧。。呵呵。。。
本程序通过编译,运行正确Code Segment
Assume CS:Code,DS:Code
-----------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法: Output Str_Addr
用法举例:Output PromptStr
Output MACRO Str_Addr
push dx
lea dx,Str_Addr
mov ah,9
int 21h
pop dx
EndM
-----------------------------------------
功能:打开指定路径下的文件。若打开成功,保存文件代号,设置进位标志;
否则,建立文件,保存文件代号,清进位标志
入口参数:dx=文件名地址,bx=文件代号保存地址
Open_File Proc Near
mov ax,3d02h 以读写方式打开文件
int 21h
jc @@Error
mov [bx],ax 成功打开,保存文件代号
stc 设置进位标志
ret
@@Error: Output Open_Error
xor cx,cx 新建文件属性
Create_File:mov ah,3ch 建立文件
int 21h
jc Create_File 建立不成功,尝试再建
mov [bx],ax 成功建立,保存文件代号
clc 清进位标志
ret
Open_File EndP
-----------------------------------------
功能:对字符串缓冲区中的内容逐个字符加密
入口参数:si=字符串地址,cx=字符数
Encode_Str Proc Near
push si
push cx
lea di,Handle_File
mov al,[di][88] 读取密钥
@@Encoding: xor byte ptr [si],al 异或,第一步加密
push cx
mov cx,188
rol byte ptr [si],cl 循环左移188位,第二步加密
pop cx
inc si 下一个字符地址
loop @@Encoding 处理下一个字符
pop cx
pop si
ret
Encode_Str EndP
-----------------------------------------
功能:对字符串缓冲区中的内容逐个字符加密
入口参数:si=字符串地址,cx=字符数
Uncode_Str Proc Near
push si
push cx
lea di,Handle_File
mov al,[di][88] 读取密钥
@@Uncoding: push cx
mov cx,188
ror byte ptr [si],cl 循环右移188位,第一步解密
pop cx
xor byte ptr [si],al 异或,第二步解密
inc si 下一个字符地址
loop @@Uncoding 处理下一个字符
pop cx
pop si
ret
Uncode_Str EndP
-----------------------------------------
Handle_File dw ?,?,? 文件代号
File_Name1 db 'c:\masm\rory00.txt',0 未加密的文本文件
File_Name2 db 'c:\masm\rory01.txt',0 加密后的文本文件
File_Name3 db 'c:\masm\rory02.txt',0 解密后的文本文件
Open_Error db 'Open file error,creat a new file.',13,10,13,10,7,'$'
Input_New db 'Input the new information:',13,10,'$'
Press_Key db 13,10,13,10,'The Encode and Uncode have been completed.',7
db 13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es 使数据段、附加段与代码段同段
-----------------------------------------
打开或建立三个文件
lea dx,Buffer 文本内容处理缓冲区
mov cx,0ffc0h 预留32个字的堆栈空间
sub cx,dx 设置读写一次文件内容的字节数
mov bp,cx 暂存
lea dx,File_Name2 文件名地址
lea bx,Handle_File[2] 文件代号保存地址
call Open_File 打开指定路径下的文件。若打开成功,保存文件代号;否则,建立文件,保存文件代号
lea dx,File_Name3 文件名地址
lea bx,Handle_File[4] 文件代号保存地址
call Open_File
lea ax,@@jump000
push ax
call @@Locate_01
@@Locate_00:lea dx,File_Name1 文件名地址
lea bx,Handle_File 文件代号保存地址
call Open_File
jc Read_File
-----------------------------------------
若是新建文件,输入文件内容,实施加密,写到另一个文件
Input_Str: Output Input_New 提示输入新信息
lea dx,Buffer 文本内容处理缓冲区
mov ah,0ah 键盘输入字符串
int 21h
lea si,Buffer[1] 实际输入的字符个数地址
lodsb 读取实际输入的字符数
test al,0ffh
jz Input_Str 若直接回车,未输入任何字符,再次提示输入新信息
mov dx,si 数据缓冲区地址
mov cl,al 实际输入的字符数
xor ch,ch
mov bx,Handle_File 读取未加密的文本文件代号
Write_Uncod:mov ah,40h
int 21h
jc Write_Uncod 写入失败,尝试再写
call Encode_Str 逐个字符加密
mov dx,si 数据缓冲区地址,要写入的字符数已在cx中
mov bx,Handle_File[2] 文件代号
Write_Coded:mov ah,40h
int 21h
jc Write_Coded 写入失败,尝试再写
jmp @@Uncode
@@Locate_01:pop ax
ret
-----------------------------------------
若成功打开文件,读取文件内容,实施加密,写到另一个文件
Read_File: lea dx,Buffer 文本内容处理缓冲区
mov cx,bp
mov bx,Handle_File 读取未加密的文本文件代号
mov ah,3fh 读文件内容
int 21h
jc Read_File 读文件失败,尝试再读
test ax,0ffffh
jz @@Uncode 若实际读取的字节数为0,结束读写 *** 作
lea si,Buffer
mov cx,ax
call Encode_Str 逐个字符加密
mov dx,si 数据缓冲区地址,要写入的字符数已在cx中
mov bx,Handle_File[2] 读取目标文件代号
Write_File: mov ah,40h 写文件
int 21h
jc Write_File 写文件失败,尝试再写
jmp Read_File
-----------------------------------------
修改子程序Encode_Str和Encode_Str中的循环移位次数
@@jump000: mov byte ptr Encode_Str[13],6
mov byte ptr Uncode_Str[11],6
lea ax,@@Locate_00
push ax
call @@Locate_01
-----------------------------------------
将加密完的内容解密,写入第三个文本文件
@@Uncode: xor dx,dx
xor cx,cx
Loca_Seek1: mov bx,Handle_File[4] 读取解密后的文本文件代号
mov ax,4200h 移动文件指针至文件头
int 21h
jc Loca_Seek1
Loca_Seek2: mov bx,Handle_File[2] 读取加密后的文本文件代号
mov ax,4200h 移动文件指针至文件头
int 21h
jc Loca_Seek2
lea dx,Buffer 文本内容处理缓冲区
Read_File1: mov cx,bp
mov bx,Handle_File[2] 读取加密后的文本文件代号
mov ah,3fh 读文件内容
int 21h
jc Read_File1 读文件失败,尝试再读
test ax,0ffffh
jz Close_File1 若实际读取的字节数为0,结束读写 *** 作,关闭文件
lea si,Buffer
mov cx,ax
call Uncode_Str 逐个字符解密
mov dx,si 数据缓冲区地址,要写入的字符数已在cx中
mov bx,Handle_File[4] 读取解密后的文本文件代号
Write_File1:mov ah,40h 写文件
int 21h
jc Write_File1 写文件失败,尝试再写
jmp Read_File1
Close_File1:mov bx,Handle_File 读取未加密的文本文件代号
mov ah,3eh 关闭文件
int 21h
jc Close_File1
Close_File2:mov bx,Handle_File[2] 读取加密后的文本文件代号
mov ah,3eh 关闭文件
int 21h
jc Close_File2
Close_File3:mov bx,Handle_File[4] 读取解密后的文本文件代号
mov ah,3eh 关闭文件
int 21h
jc Close_File3
Output Press_Key 提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
Exit_Proc: mov ah,4ch 结束程序
int 21h
ALIGN 10h 节对齐
Buffer db 255 文本内容处理缓冲区
Code ENDS
END Start 编译到此结束
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)