如何进行汇编语言加密/解密编程?

时间:2011-03-30 08:50:19

标签: assembly x86

这是加密字符的加密例程:

任何人都可以对解密程序有所启发吗?

编辑(见评论):

3 个答案:

答案 0 :(得分:1)

这是我们可以解密的第一个块:

xor eax,edx 
xor eax,ecx 
rol al,1 

这是因为这些值来自堆栈。这是可逆的,如:

ror al,1
xor eax, ecx (eax = the one we had in the end)
xor eax, edx

然后edx = eax(mov edx,eax)。现在:

dec eax
rol eax, 1
rol eax, 1

并且最后一个AND无法撤消,因为:

? AND 0 = 0
? AND 1 = 1  => ? = 1
? AND 1 = 0  => ? = 0

?除非没有,否则无法识别? AND 0 = 0 组合。

答案 1 :(得分:0)

让我们看看: 为了解密消息,我们想要反转加密过程,所以让我们从方法的最后开始:

转型的最后一部分是rol al, 1。我们可以将其反转为ror al, 1

其余的加密包括两个xors,一个消息和一个修改过的密钥,一个具有立即结果和原始密钥。由于xor是自反转的,我们可以通过使用原始密钥对加密的消息进行一次修改以及使用修改的密钥(使用相同的密钥修改函数)进行一次修改来反转此操作。

总而言之,应该反转加密:

decrypt: ror cl,1 //reverse rol al, 1
         xor ecx, eax //reverse xor message, original key
         and eax,0x3C //calculate modified key
         ror eax,1 
         ror eax,1 
         inc eax      //end calculate modified key
         xor eax, ecx //reverse xor message modified key
         ret 

答案 2 :(得分:0)

如果没有ROL,加密解密也可以用于解密。 假设加密字符在ecx中,而密钥在eax中,则只需要进行少量修改:

  decrypt5: 
      push eax 
      push ecx 

此部分从edx的输入键生成eax中的内部密钥:

      and eax,0x3C 
      ror eax,1 
      ror eax,1 
      inc eax 
      mov edx,eax 

将输入字符从ecx弹出到eax

      pop eax 

撤消ROL AL,1

      ror al,1 

撤消异或。 XOR是一个对合,也就是它自己的逆。 它也是可交换的,所以顺序并不重要:

      xor eax,edx 

将输入键从eax弹出到ecx和XOR:

      pop ecx 
      xor eax,ecx 

      ret 

我希望是正确的,我的x86组件相当生锈。

请注意,调用此加密有点紧张。 它太弱了我宁愿称之为混淆。