Assembly 如何还原加密过程

Assembly 如何还原加密过程,assembly,encryption,x86,reverse-engineering,Assembly,Encryption,X86,Reverse Engineering,作为一项任务,我得到了一些汇编代码,从用户那里获取一个输入(加密密钥),然后获取一个字母数字字符字符串,然后通过简单地扰乱EAX、EDX和EXD寄存器中字节的顺序(据我所知)对其进行加密 我的任务是将加密的字符串解密回原始字符串输入 我第一次尝试反转加密过程的步骤(即将rol更改为ror等),但很快意识到这不起作用 如果有人能花时间解释解密过程/代码是如何产生的,我将非常感激 __asm { encryptX: push ecx xchg eax, ecx

作为一项任务,我得到了一些汇编代码,从用户那里获取一个输入(加密密钥),然后获取一个字母数字字符字符串,然后通过简单地扰乱EAX、EDX和EXD寄存器中字节的顺序(据我所知)对其进行加密

我的任务是将加密的字符串解密回原始字符串输入

我第一次尝试反转加密过程的步骤(即将rol更改为ror等),但很快意识到这不起作用

如果有人能花时间解释解密过程/代码是如何产生的,我将非常感激

    __asm {
    encryptX:  push ecx
        xchg eax, ecx               
        neg  al                     
        ror  al, 1                  
        xor  al, byte ptr[ecx]      
        push edx                    
        mov  edx, eax               
        xchg eax, ecx               
        rol  byte ptr[eax], 3       
        xor  dl, byte ptr[eax]      
        rol  dl, 2                  
        mov  eax, edx               
        pop  edx                    
        pop  ecx                    
        ret                         
    }

您没有发布它,但因为这是第三次有人请求发布 这个精确的类型的练习需要解决,我假设
EAX
持有一个指针 指向当前密钥字符,并按住当前消息字符(即要显示的字符 加密的)

1.反向引擎算法 这是一个非常简单的无状态算法,我注释了所有有用的指令。
我假设你懂汇编,如果你不懂,你可以在线学习教程。
没有更多的东西可以添加到这个反向工程中,代码是等效的(甚至 由于垂直拆分为简单操作,因此更清晰)到较高级别 简单的源代码

;EAX = ptr to current key char, k
;ECX = current message char, c

encryptX:  
        push ecx

        xchg eax, ecx             ;EAX = c, ECX = ptr k
 
        neg  al                   ;AL = NEG(c)       
        ror  al, 1                ;AL = ROL(NEG(c), 1)
        xor  al, byte ptr[ecx]    ;AL =  ROL(NEG(c), 1) xor k
   
        push edx                    

        mov  edx, eax             ;EDX =  ROL(NEG(c), 1) xor k    
        xchg eax, ecx             ;EAX = ptr k, ECX = ROL(NEG(c), 1) xor k 

        rol  byte ptr[eax], 3     ;K = ROL(k, 3)  
        xor  dl, byte ptr[eax]    ;DL = (ROL(NEG(c), 1) XOR k)  XOR ROL(k, 3)  
        rol  dl, 2                ;DL = ROL((ROL(NEG(c), 1) XOR k)  XOR ROL(k, 3), 2)

        mov  eax, edx         ;Return
             
        pop  edx                    
        pop  ecx                    
        ret  
算法是
e=ROL((ROR(NEG(c),1)XOR k)XOR ROL(k,3),2)

我用
e
表示加扰字符,用
c
表示原始字符,用
k
表示键字符

2.反转函数 您必须知道所使用的每个函数的倒数,这很简单,但下面是列表

 f     |  f^-1
-------+-------
  XOR  |  XOR
  NEG  |  NEG
  ROL  |  ROR
  ROR  |  ROL
然后从外部函数向内部函数开始,记住您的目标是
c

0. e = ROL((ROR(NEG(c), 1) XOR k)  XOR ROL(k, 3), 2)

1. ROR(e, 2) = (ROR(NEG(c), 1) XOR k)  XOR ROL(k, 3)

2. ROR(e, 2) XOR ROL(k, 3) = ROR(NEG(c), 1) XOR k

3. ROR(e, 2) XOR ROL(k, 3) XOR K = ROR(NEG(c), 1)

4. ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1) = NEG(c)

5. NEG(ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1)) = c
解扰是
c=NEG(ROL(ROR(e,2)XOR ROL(k,3)XOR k,1))

3.装配式机具 您可以在汇编中轻松地编写上面的表达式


警告 仔细检查上面的语句,我既没有运行代码也没有进行任何测试。
您应该检查是否有细微的更正,使用您的批判性判断力,不要复制粘贴任何公式。
如果您盲目地相信另一个代码,那么如果您的测试失败,则由您决定



我可以问你这个练习的背景是什么吗?这是你的汇编编程课程中的作业吗?

你没有发布,但因为这是第三次有人请求 这个精确的类型的练习需要解决,我假设
EAX
持有一个指针 指向当前密钥字符,并按住当前消息字符(即要显示的字符 加密的)

1.反向引擎算法 这是一个非常简单的无状态算法,我注释了所有有用的指令。
我假设你懂汇编,如果你不懂,你可以在线学习教程。
没有更多的东西可以添加到这个反向工程中,代码是等效的(甚至 由于垂直拆分为简单操作,因此更清晰)到较高级别 简单的源代码

;EAX = ptr to current key char, k
;ECX = current message char, c

encryptX:  
        push ecx

        xchg eax, ecx             ;EAX = c, ECX = ptr k
 
        neg  al                   ;AL = NEG(c)       
        ror  al, 1                ;AL = ROL(NEG(c), 1)
        xor  al, byte ptr[ecx]    ;AL =  ROL(NEG(c), 1) xor k
   
        push edx                    

        mov  edx, eax             ;EDX =  ROL(NEG(c), 1) xor k    
        xchg eax, ecx             ;EAX = ptr k, ECX = ROL(NEG(c), 1) xor k 

        rol  byte ptr[eax], 3     ;K = ROL(k, 3)  
        xor  dl, byte ptr[eax]    ;DL = (ROL(NEG(c), 1) XOR k)  XOR ROL(k, 3)  
        rol  dl, 2                ;DL = ROL((ROL(NEG(c), 1) XOR k)  XOR ROL(k, 3), 2)

        mov  eax, edx         ;Return
             
        pop  edx                    
        pop  ecx                    
        ret  
算法是
e=ROL((ROR(NEG(c),1)XOR k)XOR ROL(k,3),2)

我用
e
表示加扰字符,用
c
表示原始字符,用
k
表示键字符

2.反转函数 您必须知道所使用的每个函数的倒数,这很简单,但下面是列表

 f     |  f^-1
-------+-------
  XOR  |  XOR
  NEG  |  NEG
  ROL  |  ROR
  ROR  |  ROL
然后从外部函数向内部函数开始,记住您的目标是
c

0. e = ROL((ROR(NEG(c), 1) XOR k)  XOR ROL(k, 3), 2)

1. ROR(e, 2) = (ROR(NEG(c), 1) XOR k)  XOR ROL(k, 3)

2. ROR(e, 2) XOR ROL(k, 3) = ROR(NEG(c), 1) XOR k

3. ROR(e, 2) XOR ROL(k, 3) XOR K = ROR(NEG(c), 1)

4. ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1) = NEG(c)

5. NEG(ROL(ROR(e, 2) XOR ROL(k, 3) XOR K, 1)) = c
解扰是
c=NEG(ROL(ROR(e,2)XOR ROL(k,3)XOR k,1))

3.装配式机具 您可以在汇编中轻松地编写上面的表达式


警告 仔细检查上面的语句,我既没有运行代码也没有进行任何测试。
您应该检查是否有细微的更正,使用您的批判性判断力,不要复制粘贴任何公式。
如果您盲目地相信另一个代码,那么如果您的测试失败,则由您决定


我可以问你这个练习的背景是什么吗?这是你的汇编编程课程的作业吗