华中科技大学计算机专业11级汇编课程设计报告文件加密与解密.docx
- 文档编号:10154250
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:24
- 大小:406.50KB
华中科技大学计算机专业11级汇编课程设计报告文件加密与解密.docx
《华中科技大学计算机专业11级汇编课程设计报告文件加密与解密.docx》由会员分享,可在线阅读,更多相关《华中科技大学计算机专业11级汇编课程设计报告文件加密与解密.docx(24页珍藏版)》请在冰豆网上搜索。
华中科技大学计算机专业11级汇编课程设计报告文件加密与解密
汇编课程设计报告
题目:
文件的加密和解密(Win32)____
课程名称:
汇编程序设计
专业班级:
学号:
姓名:
报告日期:
2013-9-12
计算机科学与技术学院
目录
1设计概要1
1.1模块划分1
1.2模块的层次结构1
1.3模块间的接口1
1.4人机界面1
2详细设计2
2.1包含文件2
2.2宏定义2
2.2.1字符串定义宏2
2.2.2赋值宏2
2.3过程声明与原型2
2.3.1过程声明2
2.3.2过程原型2
2.4数据段3
2.5主程序3
2.5.1流程图3
2.5.2源代码4
2.6窗口主程序4
2.6.1流程图4
2.6.2源代码5
2.7消息处理程序6
2.7.1流程图6
2.7.2源代码10
3程序界面图14
3.1程序主界面14
3.2“选择文件”按钮14
3.3“加密文件”按钮15
3.4“解密文件”按钮15
4设计总结16
4.1技术特点16
4.2设计不足16
4.3改进建议16
4.4问题与解决16
4.5设计体会16
4.6参考文献16
1设计概要
1.1模块划分
<1>包含文件、宏定义、过程声明、数据段
<2>代码段
a.主程序
b.窗口主程序
c.消息处理程序
d.加密/解密处理程序
1.2模块的层次结构
1.3模块间的接口
主程序通过调用窗口主程序创建窗口;
窗口主程序进入“消息循环”,通过“分发消息”(invokeDispatchMessage)进行消息处理;
消息处理的过程就是消息处理程序的执行。
1.4人机界面
采用传统的windows界面:
主程序调用窗口主程序,窗口主程序通过invokeRegisterClassEx注册窗口,通过invokeCreateWindowEx建立窗口;
消息处理程序中通过invokePushButton、invokeEditS1生成按钮和文本框;
按钮“选择文件”触发时,通过invokeGetOpenFileName显示打开文件对话框。
2详细设计
2.1包含文件
windows.inc;系统常量定义
kernel32.inc
user32.inc
kenel32.lib
user32.lib
comdlg32.inc;文件操作有关
comdlg32.lib
2.2宏定义
2.2.1字符串定义宏
szTextMACROName,Text:
VARARG
LOCALlbl
jmplbl
NamedbText,0
lbl:
ENDM
方便定义字符串
2.2.2赋值宏
m2mMACROM1,M2
pushM2
popM1
ENDM
简化了变量的赋值操作
2.3过程声明与原型
2.3.1过程声明
WinMainPROTO:
DWORD,:
DWORD,:
DWORD,:
DWORD
WndProcPROTO:
DWORD,:
DWORD,:
DWORD,:
DWORD
.
PushButton
PROTO:
DWORD,:
DWORD,:
DWORD,:
DWORD,:
DWORD,:
DWORD,:
DWORD
EditS1PROTO:
DWORD,:
DWORD,:
DWORD,:
DWORD,:
DWORD,:
DWORD,:
DWORD
2.3.2过程原型
a.WinMainprochInst:
DWORD,
hPrevInst:
DWORD,
CmdLine:
DWORD,
CmdShow:
DWORD
b.WndProcprochWin:
DWORD,
uMsg:
DWORD,
wParam:
DWORD,lParam:
DWORD
c.PushButtonproclpText:
DWORD,hParent:
DWORD,a:
DWORD,b:
DWORD,
wd:
DWORD,ht:
DWORD,ID:
DWORD
jmpButton_Type
btnClassdb"BUTTON",0
Button_Type:
invokeCreateWindowEx,0,ADDRbtnClass,lpText,WS_CHILDor\WS_VISIBLE,a,b,wd,ht,hParent,ID,hInstance,NULL
ret
PushButtonendp
d.EditS1procszMsg:
DWORD,a:
DWORD,b:
DWORD,wd:
DWORD,ht:
DWORD,
hParent:
DWORD,ID:
DWORD
jmp_CreateEdit
slEditdb"EDIT",0
_CreateEdit:
invokeCreateWindowEx,WS_EX_CLIENTEDGE,ADDRslEdit,szMsg,WS_VISIBLEorWS_CHILDWINDOWor\
ES_AUTOHSCROLLorES_NOHIDESEL,a,b,wd,ht,hParent,ID,hInstance,NULL
ret
EditS1endp
2.4数据段
.data
szClassNamedb"Template_Class",0
szDisplayNamedb"文件加密与解密",0
CommandLinedd0
hWnddd0
hInstancedd0
hButton1dd0
hButton2dd0
hButton3dd0
hEditdd0
MAXSIZEequ260
ofnOPENFILENAME<>;打开文件对话框用到的结构
szFileNamedbMAXSIZEdup(0)
szFilterStringdb"所有文件",0,"*.*",0,0
szMyTitledb"请打开一个文件...",0
2.5主程序
2.5.1流程图
图2.1主程序流程图
2.5.2源代码
.code
start:
invokeGetModuleHandle,NULL
movhInstance,eax
invokeGetCommandLine
movCommandLine,eax
invokeWinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invokeExitProcess,eax
……
endstart
2.6窗口主程序
2.6.1流程图
图2.2窗口主程序流程图
2.6.2源代码
WinMainprochInst:
DWORD,
hPrevInst:
DWORD,
CmdLine:
DWORD,
CmdShow:
DWORD
;声明局部变量
LOCALwc:
WNDCLASSEX
LOCALmsg:
MSG
LOCALWwd:
DWORD
LOCALWht:
DWORD
LOCALWtx:
DWORD
LOCALWty:
DWORD
;填充窗口类结构变量
movwc.cbSize,sizeofWNDCLASSEX
movwc.style,CS_HREDRAWorCS_VREDRAWorCS_BYTEALIGNWINDOW
movwc.lpfnWndProc,offsetWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
moveax,hInst
movwc.hInstance,eax;< macronotmnemonic movwc.hbrBackground,COLOR_BTNFACE+1 movwc.lpszMenuName,NULL movwc.lpszClassName,offsetszClassName invokeLoadIcon,hInst,500;iconID movwc.hIcon,eax invokeLoadCursor,NULL,IDC_ARROW movwc.hCursor,eax movwc.hIconSm,0 invokeRegisterClassEx,ADDRwc ;建立窗口 movWwd,500 movWht,350 movWtx,300 movWty,200 invokeCreateWindowEx,WS_EX_LEFT,ADDRszClassName,ADDRszDisplayName, WS_OVERLAPPEDWINDOW,Wtx,Wty,Wwd,Wht,NULL,NULL,hInst,NULL movhWnd,eax invokeShowWindow,hWnd,SW_SHOWNORMAL invokeUpdateWindow,hWnd StartLoop: ;消息循环 invokeGetMessage,ADDRmsg,NULL,0,0 cmpeax,0 jeExitLoop invokeTranslateMessage,ADDRmsg invokeDispatchMessage,ADDRmsg jmpStartLoop ExitLoop: moveax,msg.wParam ret WinMainendp 2.7消息处理程序 2.7.1流程图 图2.3消息处理程序流程图 图2.4加密(解密)过程流程图 2.7.2源代码 WndProcprochWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD ;消息处理程序 LOCALhFile: DWORD;文件句柄 LOCALdwFileSize: DWORD;文件大小 LOCALReadLen: DWORD;实际读文件大小 LOCALpMemory: DWORD;缓冲区指针 LOCALpos: DWORD;实际写文件大小 LOCALfilePointer: DWORD;文件指针变量 .ifuMsg==WM_DESTROY invokePostQuitMessage,NULL .elseifuMsg==WM_CREATE szTextButnTxt1,"选择文件",0 invokePushButton,ADDRButnTxt1,hWin,30,70,100,26,500 movhButton1,eax szTextButnTxt2,"加密文件",0 invokePushButton,ADDRButnTxt2,hWin,150,70,100,26,501 movhButton2,eax szTextButnTxt3,"解密文件",0 invokePushButton,ADDRButnTxt3,hWin,280,70,100,26,502 movhButton2,eax invokeEditS1,NULL,20,30,400,20,hWin,701 movhEdit,eax .elseifuMsg==WM_COMMAND .ifwParam==500;按钮“选择文件”的处理代码 ;"打开文件"对话框 movofn.lStructSize,sizeofofn m2mofn.hwndOwner,hWnd ;文件选择对话框所属窗口 m2mofn.hInstance,hWnd movofn.lpstrFilter,offsetszFilterString ;过滤文件字符串,本处为“*.*”即所有文件 movofn.lpstrFile,offsetszFileName ;赋值选择文件名存放的缓冲区指针 movofn.nMaxFile,MAXSIZE;缓冲区大小 movofn.Flags,OFN_FILEMUSTEXISTorOFN_PATHMUSTEXISTorOFN_LONGNAMESorOFN_EXPLORER;初始化标志 movofn.lpstrTitle,offsetszMyTitle ;设置文件打开对话框上的标题 invokeGetOpenFileName,addrofn;显示打开文件对话框 invokeSetWindowText,hEdit,ADDRszFileName;将文件名送到文本框 .elseifwParam==501 ;按钮“加密文件”的处理代码 invokeCreateFile,addrszFileName,GENERIC_READor\ GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL ;以“可读可写”方式打开文件 movhFile,eax .ifhFile==INVALID_HANDLE_VALUE szTextszErrOpen,"文件打开错误" invokeMessageBox,hWnd,addrszErrOpen,addrszDisplayName,MB_OK jmpen_close1 .endif invokeGlobalAlloc,GMEM_FIXEDorGMEM_ZEROINIT,1000;分配1000字节内存 .ifeax==NULL szTextMemoryErr,"内存分配失败" invokeMessageBox,0,addrMemoryErr,NULL,MB_OK jmpen_close2 .endif movpMemory,eax;返回缓冲区首址 movfilePointer,0 en_repeat_read: invokeReadFile,hFile,pMemory,1000,addrReadLen,NULL .ifReadLen==0;空文件 jmpen_close2 .endif movecx,ReadLen;ECX作为计数寄存器 movebx,pMemory;EBX作为间接寻址寄存器 en_again: XORbyteptr[ebx],33H incebx loopen_again invokeSetFilePointer,hFile,filePointer,0,FILE_BEGIN ;移动文件指针到上次读的位置 invokeWriteFile,hFile,pMemory,ReadLen,addrpos,NULL ;写入文件,写入完毕时文件指针偏移开始位置长为filePointer_ReadLen .ifeax==FALSE szTextWriteErr,"写入文件失败" invokeMessageBox,0,addrWriteErr,NULL,MB_OK jmpen_close1 .endif moveax,ReadLen addfilePointer,eax;filePointer+ReadLen为下次读的文件指针位置 cmpReadLen,1000;如果读到的不够1000字节,说明文件结束 jeen_repeat_read szTexten_successful,"加密成功! " szTextNote,"提示" invokeMessageBox,0,addren_successful,addrNote,MB_OK en_close1: invokeGlobalFree,pMemory en_close2: invokeCloseHandle,hFile .elseifwParam==502;按钮“解密文件”的处理代码 invokeCreateFile,addrszFileName,GENERIC_READorGENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL movhFile,eax .ifhFile==INVALID_HANDLE_VALUE invokeMessageBox,hWnd,addrszErrOpen,addrszDisplayName,MB_OK jmpde_close1 .endif invokeGlobalAlloc,GMEM_FIXEDorGMEM_ZEROINIT,1000 .ifeax==NULL invokeMessageBox,0,addrMemoryErr,NULL,MB_OK jmpde_close2 .endif movpMemory,eax movfilePointer,0 de_repeat_read: invokeReadFile,hFile,pMemory,1000,addrReadLen,NULL .ifReadLen==0 jmpde_close2 .endif movecx,ReadLen movebx,pMemory de_again: XORbyteptr[ebx],33H incebx loopde_again invokeSetFilePointer,hFile,filePointer,0,FILE_BEGIN invokeWriteFile,hFile,pMemory,ReadLen,addrpos,NULL .ifeax==FALSE invokeMessageBox,0,addrWriteErr,NULL,MB_OK jmpde_close1 .endif moveax,ReadLen addfilePointer,eax cmpReadLen,1000 jede_repeat_read szTextde_successful,"解密成功! " invokeMessageBox,0,addrde_successful,addrNote,MB_OK de_close1: invokeGlobalFree,pMemory de_close2: invokeCloseHandle,hFile .endif .endif invokeDefWindowProc,hWin,uMsg,wParam,lParam ret WndProcendp 3程序界面图 3.1程序主界面 图3.1程序主界面 3.2“选择文件”按钮 图3.2“选择文件”按钮呼出对话框图 3.3“加密文件”按钮 图3.3“加密文件”按钮呼出消息图 3.4“解密文件”按钮 图3.4“解密文件”按钮呼出消息图 4设计总结 4.1技术特点 界面简洁明了,程序简单易用; 加密和解密算法简单有效,可修改性和可变性强。 因为加密(解密)的核心代码都集中在一个地方,可以方便地修改; 用户处理程序部分对各种情况包括出错处理都考虑在内,较为完善。 4.2设计不足 加密(解密)算法设计简单,利用反汇编工具可以轻松找到加密(解密)代码; 有些句柄获取后存放在变量中但没有使用到,占用内存空间; 模块化不明显,子程序都为内部子程序。 4.3改进建议 探索更有效的加密算法; 深入理解相关API入口和出口参数作用; 可以考虑采用外部子程序或使用更复杂的多文件设计。 4.4问题与解决 .API种类不明了,不知有哪些API可以应用 b.API参数过多,难以找到需要的参数 ->通过查阅参考书籍,查看常用API介绍 c.形参命名 ->模仿已有Win32程序,命名时尽量有意义 d.加密算法设计 ->借鉴与参考相关设计,比如文件操作和内存操作 4.5设计体会 对Win32汇编程序的结构框架——主程序、窗口主程序、消息处理程序、用户处理程序——有了更深入的了解; 对主要的API——RegisterClassEx、CreateWindowEx、DispatchMessage、MessageBox——有更深了解,对文件操作和内存操作的API——GetOpenFileName、CreateFile、GlobalAlloc、ReadFile、WriteFile、SetFilePointer、GlobalFree、CloseHandle——有更多了解; Win32的消息驱动机制是核心,窗口主程序中的消息循环是消息驱动的实现方法,通过消息循环和分发消息可以不停地处理窗口消息直到收到结束指令。 用户处理程序隐藏在不同消息的触发中,在本次设计中主要是按钮的触发。 主程序的作用似乎仅仅是获取相关句柄,接着就调用窗口主程序WinMain,移交控制权。 Win32程序中较多的是API的调用,所以设计Win32程序既可以说难也可以说容易,难是因为对API不熟悉,容易那自然是知道各种API的使用之后了! 4.6参考文献 [1]《80X86汇编语言程序设计》.王元珍、曹忠升、韩宗芬编著.华中科技大学出版社。 [2]《DOS/Windows汇编语言程序设计教程》.赵树升、杨建军编著.清华大学出版社。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 计算机 专业 11 汇编 课程设计 报告 文件 加密 解密