`
qdujunjie
  • 浏览: 110370 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

汇编语言字符串加密代码分析(2)

 
阅读更多

 

来自于《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伪指令,而是作者库中的函数)

 

 

 以上便是最简单的汇编加密程序的代码分析。

0
0
分享到:
评论

相关推荐

    汇编语言实现对加密的字符串进行解密

    下面是一个汇编语言(x86架构)的示例代码,演示了如何使用异或操作进行字符串的加密和解密。 这段汇编代码将原始字符串进行加密,并将加密后的字符串打印出来。然后,它将使用相同的密钥对加密后的字符串进行解密,...

    汇编语言源代码大全汇编语言源代码大全

    2. **数据处理**:汇编语言中如何处理各种数据类型,如整数、浮点数、字符串等。包括加载、存储、算术运算、逻辑运算以及比较操作。 3. **控制流程**:如何通过转移指令(如JMP、CALL、RET等)实现程序的流程控制,...

    《汇编语言源代码大全》.rar

    《汇编语言源代码大全》这个压缩包可能包含了各种示例代码,涵盖了上述的各个知识点,读者可以通过阅读和分析这些代码,加深对汇编语言的理解,提高编程能力。在实践中,可以尝试修改和运行这些代码,以达到更好的...

    用MASM32来DIY一个判断字符串1是否为字符串2的子串的函数演示代码(源码+exe)(应用repe cmpsb指令,区分大小写)

    本示例中,我们探讨的是如何使用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个经典案例

    《汇编语言精品源代码27个经典案例》是一份集合了多个实用程序的资源,旨在帮助学习者深入了解和掌握汇编语言编程。汇编语言是计算机科学的基础,它允许程序员直接与硬件进行交互,执行特定任务。这些案例涵盖了从...

    汇编语言课程设计案例源代码

    2. **非数值处理**:非数值处理包括字符串操作、逻辑运算等。例如,处理ASCII码的字符操作,可以通过汇编语言实现高效地查找、比较和修改字符序列。 3. **字符图形设计**:在汇编语言中,可以直接控制显示器的像素...

    csdn上的,汇编语言课程设计

    2. **汇编指令集**:学习汇编语言,必须熟悉特定架构(如x86或ARM)的指令集,包括数据操作指令、转移控制指令、I/O操作指令等。这些指令直接对应于计算机硬件的操作,是编写汇编程序的基础。 3. **程序设计**:...

    汇编语言 电子科技大学 PPT

    5. **处理字符串和数组的指令**:如REP、LEA,用于处理连续的数据序列。 **三、汇编程序设计** 编写汇编程序通常包括以下几个步骤: 1. **源代码编写**:使用汇编语言编写程序,定义变量、标签和过程。 2. **汇编...

    汇编语言命令全部汇编知识

    在修改软件或程序的特征码时,通常需要使用到汇编语言指令,特别是那些涉及程序内部结构或加密算法的部分。例如,使用条件跳转指令(如`JE`, `JNE`)可以实现特定条件下的代码执行路径更改;而通过修改某些指令(如...

    linux 汇编语言设计

    - **安全领域**:分析汇编语言在网络安全、加密算法等方面的应用案例。 - **逆向工程**:探讨如何使用汇编语言技能进行软件逆向工程,理解并修改已有的二进制程序。 #### 六、总结 《Linux汇编语言设计》是一本非常...

    汇编语言视频教程77讲

    - **加密算法实现**:设计并实现一种基本的加密算法,展示汇编语言在处理位运算方面的优势。 - **游戏开发**:介绍如何运用汇编语言提高游戏引擎中关键模块的性能。 5. **工具与资源推荐** - **开发环境搭建**:...

    汇编语言程序设计练习题

    - 输出加密结果:输出加密后的字符串。 #### 练习题23:设计一个口令设置与测试程序:先由一个用户设置口令,然后由另一个用户输入口令,检测是否正确,用户有3次输入机会。 - **知识点**: - 用户输入:接收用户...

    《汇编语言课程设计案例精编》源代码

    《汇编语言课程设计案例精编》的源代码是一份宝贵的学习资源,涵盖了汇编语言编程的多个核心领域。这份资料包含8个精心设计的案例,每个案例都针对不同的功能和应用,旨在帮助学习者深入理解和掌握汇编语言的基本...

Global site tag (gtag.js) - Google Analytics