Assembly 如何还原加密过程
作为一项任务,我得到了一些汇编代码,从用户那里获取一个输入(加密密钥),然后获取一个字母数字字符字符串,然后通过简单地扰乱EAX、EDX和EXD寄存器中字节的顺序(据我所知)对其进行加密 我的任务是将加密的字符串解密回原始字符串输入 我第一次尝试反转加密过程的步骤(即将rol更改为ror等),但很快意识到这不起作用 如果有人能花时间解释解密过程/代码是如何产生的,我将非常感激Assembly 如何还原加密过程,assembly,encryption,x86,reverse-engineering,Assembly,Encryption,X86,Reverse Engineering,作为一项任务,我得到了一些汇编代码,从用户那里获取一个输入(加密密钥),然后获取一个字母数字字符字符串,然后通过简单地扰乱EAX、EDX和EXD寄存器中字节的顺序(据我所知)对其进行加密 我的任务是将加密的字符串解密回原始字符串输入 我第一次尝试反转加密过程的步骤(即将rol更改为ror等),但很快意识到这不起作用 如果有人能花时间解释解密过程/代码是如何产生的,我将非常感激 __asm { encryptX: push ecx xchg eax, ecx
__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.装配式机具
您可以在汇编中轻松地编写上面的表达式
警告 仔细检查上面的语句,我既没有运行代码也没有进行任何测试。
您应该检查是否有细微的更正,使用您的批判性判断力,不要复制粘贴任何公式。
如果您盲目地相信另一个代码,那么如果您的测试失败,则由您决定
我可以问你这个练习的背景是什么吗?这是你的汇编编程课程的作业吗