- 浏览: 110370 次
- 性别:
- 来自: Mars
文章分类
最新评论
-
a376730551:
红色部分表示 把进位值传递给bh
汇编语言AAA指令多字节加法代码分析(5) -
madbluesky:
死了,只剩下赞扬了...看来不只是中国,全世界都是同一套啊.. ...
麦克杰克逊--------世界上最傻的明星 -
sunloveny:
敬你!
麦克杰克逊--------世界上最傻的明星 -
jiorry:
感动
MJ 一路走好
麦克杰克逊--------世界上最傻的明星 -
javaboy2006:
MJ单纯到不懂得保护自己。永远怀念。
麦克杰克逊--------世界上最傻的明星
来自于《Intel汇编语言程序设计》(第四版)第六章。
这个例子利用了XOR(异或)指令的一个特性(即对操作数两次异或之后操作效果抵消),对字符串进行加密。
书中代码:
TITLE Encryption Program (Encrypt.asm)
INCLUDE Irvine32.inc
KEY = 239 ; any value between 1-255
BUFMAX = 128 ; maximum buffer size
.data
sPrompt BYTE "Enter the plain text : ",0
sEncrypt BYTE "Cypher text : ",0
sDecrypt BYTE "Decrypted : ",0
buffer BYTE BUFMAX dup(0)
bufsize DWORD ?
.code
main PROC
call InputTheString ; input the plain text
call TranslateBuffer ; encrypt the buffer
mov edx , OFFSET sEncrypt ; display encrypted message
call DisplayMessage
call TranslateBuffer ; decrypt the buffer
mov edx , OFFSET sDecrypt ; display decrypted message
call DisplayMessage
exit
main ENDP
;------------------------------------------------------------------
InputTheString PROC
;
; Asks the user to enter a string from the
; keyboard Saves the string and its length
; in variables.
; Receives : nothing
; Returns : nothing
;------------------------------------------------------------------
pushad
mov edx , OFFSET sPrompt ;display a prompt
call WriteString
mov ecx,BUFMAX ; maximum character count
mov edx,OFFSET buffer ; point to the buffer
call ReadString ; input the string
mov bufsize , eax ; save length
call Crlf
popad
ret
InputTheString ENDP
;------------------------------------------------------------------
DisplayMessage PROC
;
; Display the encrypted or decrypted message
; Receives : EDX points to the message
; Returns : nothing
;------------------------------------------------------------------
pushad
call WriteString
mov edx , OFFSET buffer ;display the buffer
call WriteString
call Crlf
call Crlf
popad
ret
DisplayMessage ENDP
;------------------------------------------------------------------
TranslateBuffer PROC
;
; Translate the string by exclusive-ORing each
; byte with the same integer .
; Receives : nothing
; Returns : nothing
;------------------------------------------------------------------
pushad
mov ecx , bufsize ; loop counter
mov esi , 0 ; index 0 in buffer
L1:
xor buffer[esi] , KEY ; translate a byte
inc esi ; point to next byte
loop L1
popad
ret
TranslateBuffer ENDP
END main
让我们来逐句分析这段程序的代码:
首先,程序包含了作者的一个inc文件,里面有一些常量的定义,随后定义了一个用来加密的数字,这里是239,和一个缓冲长度值,这里是128:
INCLUDE Irvine32.inc
KEY = 239 ; any value between 1-255
BUFMAX = 128 ; maximum buffer size
随后,数据段如下:
.data
sPrompt BYTE "Enter the plain text : ",0
sEncrypt BYTE "Cypher text : ",0
sDecrypt BYTE "Decrypted : ",0
buffer BYTE BUFMAX dup(0)
bufsize DWORD ?
定义了三个字符串,用于程序中的显示,一个buffer数组,还有一个用来存储长度的bufsize变量
接下来的是主程序段,这里有一个main函数和三个子函数,分别是:
InputTheString
DisplayMessage
TranslateBuffer
让我们先看一下三个子函数。
首先是InputTheString ,这个函数用来提示用户输入值,并且将值保存到buffer中,看一下代码:
pushad ; 首先保存所有寄存器的值
mov edx , OFFSET sPrompt ; 将sPrompt的地址赋给edx(用于下面的显示)
call WriteString ; 显示edx中的值
mov ecx,BUFMAX ; 将字符串的数量赋给ecx,因为ecx将用于循环的计数器
mov edx,OFFSET buffer ; 将edx寄存器指向buffer数组的地址
call ReadString ; 读取用户输入的字符串到buffer中
mov bufsize , eax ; 将用户输入字符串的长度值(此时保存在eax寄存器中),赋值给bufsize
call Crlf ; 将光标输出到下一行的开始
popad ; 重新得到所有寄存器的值
ret ; EIP 跳回
整个过程很简单。
然后我们再来看DisplayMessage :
pushad ; 首先保存所有寄存器的值
call WriteString ; 显示edx寄存器中的值,显然这需要在调用函数之前对edx赋值
mov edx , OFFSET buffer ; 将buffer 中保存的值赋值到edx中准备显示
call WriteString ; 显示edx中的值
call Crlf ; 将光标输出到下一行的开始
call Crlf ; 将光标输出到下一行的开始
popad ; 重新得到所有寄存器的值
ret ; EIP 跳回
然后再来看一下 TranslateBuffer :
pushad ; 首先保存所有寄存器的值
mov ecx , bufsize ; 将长度赋值给ecx,用于循环计数
mov esi , 0 ; esi作为数组的index值,从零开始
L1:
xor buffer[esi] , KEY ; 使用key值对每一个字节进行异或操作
inc esi ; 将index值加1
loop L1 ; 重复执行L1,此时ecx值自减1
popad ; 异或操作完成后,重新得到所有寄存器的值
ret ; EIP 跳回
此函数时比较核心的部分,用于执行异或操作。
最后让我们看一下main函数:
call InputTheString ; 得到用户的输入,放到buffer数组中
call TranslateBuffer ; 将buffer数组中的每一个字节进行异或操作,即“加密”操作
mov edx , OFFSET sEncrypt ; 因为DisplayMessage需要用到edx值,所以为edx赋值
call DisplayMessage ; 显示用户输入字符串的加密值
call TranslateBuffer ; 对buffer数组进行第二次异或操作,即“解密”操作
mov edx , OFFSET sDecrypt ; 为edx赋值
call DisplayMessage ; 显示解密后的字符串
exit ; 退出(此函数并不是MASM伪指令,而是作者库中的函数)
以上便是最简单的汇编加密程序的代码分析。
发表评论
-
IA-32处理器内存管理学习总结?
2009-10-23 14:58 1377内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2306本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1826本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2216来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2628内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言32位控制台读取用户输入字符程序代码分析(17)
2009-10-22 15:00 4148来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1843来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言醉汉走路代码分析(15)
2009-10-22 10:50 1357来自于《Intel汇编语言 ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2187代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1921来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4218来自于《Intel汇编 ... -
汇编语言裁剪字符串代码分析(11)?
2009-10-20 15:27 1362来自于《Intel汇编语言程序设计》(第四版 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2226来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1593来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3729来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 1032215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1449来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1225来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言AAA指令多字节加法代码分析(5)
2009-10-18 10:44 4412来自于《Intel汇编语言程序设计》(第五版)第七章的代 ... -
汇编语言表格驱动分支选择代码分析(4)
2009-10-16 14:48 1492来自于《Intel汇编语言程序设计》(第四版)第六章。 ...
相关推荐
下面是一个汇编语言(x86架构)的示例代码,演示了如何使用异或操作进行字符串的加密和解密。 这段汇编代码将原始字符串进行加密,并将加密后的字符串打印出来。然后,它将使用相同的密钥对加密后的字符串进行解密,...
2. **数据处理**:汇编语言中如何处理各种数据类型,如整数、浮点数、字符串等。包括加载、存储、算术运算、逻辑运算以及比较操作。 3. **控制流程**:如何通过转移指令(如JMP、CALL、RET等)实现程序的流程控制,...
《汇编语言源代码大全》这个压缩包可能包含了各种示例代码,涵盖了上述的各个知识点,读者可以通过阅读和分析这些代码,加深对汇编语言的理解,提高编程能力。在实践中,可以尝试修改和运行这些代码,以达到更好的...
本示例中,我们探讨的是如何使用MASM32来编写一个自定义函数,判断一个字符串(字符串1)是否为另一个字符串(字符串2)的子串,同时考虑大小写的区别。 首先,我们需要了解`repe cmpsb`指令。这是汇编语言中的一个...
本节将重点分析给出的汇编语言程序,该程序的功能是从键盘输入一系列数字并计算它们的平均值。 **3.1 主程序流程** 1. **初始化环境**: - 清除数据段和代码段的指针。 - 设置数据段地址。 2. **主循环**: - ...
- `Prompt_Str` 和 `Prompt_Str1` 分别用于提示用户输入字符串和显示加密后的字符串。 - `Buffer` 用于存储用户输入的字符串。 2. **代码段实现**: - 首先显示提示信息,要求用户输入一个字符串。 - 使用BIOS...
课程设计的目标是通过查阅相关资料,学习和分析汇编语言程序设计,设计并实现一个能够对数据和字符串进行加密解密的程序,同时具备用户友好的界面管理。设计过程中,学生需要理解加密算法的基本原理,选择合适的加密...
汇编语言实现字符串反转通常涉及以下步骤: - 首先,程序需要加载字符串的首地址到一个寄存器,例如,AX或BX。 - 然后,通过递减指针(如BX)来访问字符串的每个字符,因为字符串通常以空字符'\0'结束,所以可以...
在本汇编实验报告中,我们将探讨四个主要的编程任务:判断闰年、字符串处理、数据加密以及四则运算。这些任务涵盖了汇编语言的基本应用和一些高级概念,旨在提高学生对计算机底层操作的理解和实践能力。 ### 一、...
2. **程序设计**:教授如何使用汇编语言编写简单的程序,如数值计算、字符串处理和流程控制等。 3. **内存管理**:讲解内存组织和数据在内存中的存储方式,以及如何通过指针操作内存。 4. **I/O操作**:介绍如何通过...
《汇编语言精品源代码27个经典案例》是一份集合了多个实用程序的资源,旨在帮助学习者深入了解和掌握汇编语言编程。汇编语言是计算机科学的基础,它允许程序员直接与硬件进行交互,执行特定任务。这些案例涵盖了从...
2. **非数值处理**:非数值处理包括字符串操作、逻辑运算等。例如,处理ASCII码的字符操作,可以通过汇编语言实现高效地查找、比较和修改字符序列。 3. **字符图形设计**:在汇编语言中,可以直接控制显示器的像素...
2. **汇编指令集**:学习汇编语言,必须熟悉特定架构(如x86或ARM)的指令集,包括数据操作指令、转移控制指令、I/O操作指令等。这些指令直接对应于计算机硬件的操作,是编写汇编程序的基础。 3. **程序设计**:...
5. **处理字符串和数组的指令**:如REP、LEA,用于处理连续的数据序列。 **三、汇编程序设计** 编写汇编程序通常包括以下几个步骤: 1. **源代码编写**:使用汇编语言编写程序,定义变量、标签和过程。 2. **汇编...
在修改软件或程序的特征码时,通常需要使用到汇编语言指令,特别是那些涉及程序内部结构或加密算法的部分。例如,使用条件跳转指令(如`JE`, `JNE`)可以实现特定条件下的代码执行路径更改;而通过修改某些指令(如...
- **安全领域**:分析汇编语言在网络安全、加密算法等方面的应用案例。 - **逆向工程**:探讨如何使用汇编语言技能进行软件逆向工程,理解并修改已有的二进制程序。 #### 六、总结 《Linux汇编语言设计》是一本非常...
- **加密算法实现**:设计并实现一种基本的加密算法,展示汇编语言在处理位运算方面的优势。 - **游戏开发**:介绍如何运用汇编语言提高游戏引擎中关键模块的性能。 5. **工具与资源推荐** - **开发环境搭建**:...
- 输出加密结果:输出加密后的字符串。 #### 练习题23:设计一个口令设置与测试程序:先由一个用户设置口令,然后由另一个用户输入口令,检测是否正确,用户有3次输入机会。 - **知识点**: - 用户输入:接收用户...
《汇编语言课程设计案例精编》的源代码是一份宝贵的学习资源,涵盖了汇编语言编程的多个核心领域。这份资料包含8个精心设计的案例,每个案例都针对不同的功能和应用,旨在帮助学习者深入理解和掌握汇编语言的基本...