如何还原加密过程

时间:2015-07-16 19:15:35

标签: assembly encryption x86 reverse-engineering

作为一项任务,我已经获得了一些汇编代码,它从用户那里获取输入(加密密钥),然后是一串字母数字字符,然后通过简单地加扰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                         
    }

1 个答案:

答案 0 :(得分:4)

您没有发布,但由于这是第三次有人请求 这个完全类型的练习要解决,我假设EAX有一个指针 到当前密钥char和ECX保持当前消息char(即char为 加密)。

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

然后你从outern函数开始向内部,记住你瞄准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。在汇编中实施

您可以轻松地在汇编中对上面的表达式进行编码。

警告

仔细检查上述陈述,我没有运行代码也没有进行任何测试 你应该检查一些细微的修正,使用你的批判意识,不要复制粘贴任何公式 如果你盲目地相信其他一个代码,那么如果你的测试失败,它就取决于你。

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