【问题标题】:How to revert an Encryption process如何还原加密过程
【发布时间】:2015-10-06 09:33:30
【问题描述】:

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

【问题讨论】:

    标签: assembly encryption x86 reverse-engineering


    【解决方案1】:

    您没有发布它,但由于这是第三次有人要求 这种确切要解决的练习,我假设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
    

    然后你从外部函数向内部开始,记住你的目标是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。在汇编中实现

    您可以轻松地在汇编中编写上述表达式。


    警告

    仔细检查上面的语句,我没有运行代码,也没有进行任何测试。
    您应该检查细微的更正,使用您的批判意识,不要复制粘贴任何公式。
    如果您盲目地相信其他代码,那么您是否未通过测试取决于您。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多