基本上我试图创建一个加密输入字符串的程序&然后使用ASM x86将其解密回原来的状态。
程序接受加密密钥(在程序中称为EKey),这是一个随机字符,然后加密到目前为止的6个字符串。
我在编写解密功能时遇到问题。我开始只是反转加密的每一行(推动ecx更改为pop ecx等),但已被告知这不正确。
这是主要的加密功能:
void encrypt_chars (int length, char EKey){
char temp_char; // char temporary store
for (int i = 0; i < length; i++) // encrypt characters one at a time
{
temp_char = OChars [i]; //
__asm { //
push eax // save register values on stack to be safe
push ecx //
//
movzx ecx,temp_char // set up registers (Nb this isn't StdCall or Cdecl)
lea eax,EKey //
call encrypt // encrypt the character
mov temp_char,al //
//
pop ecx // restore original register values from stack
pop eax //
}
EChars [i] = temp_char; // Store encrypted char in the encrypted chars array
}
返回;
子程序&#39;加密&#39;:
encrypt: push esi
push ecx
mov esi, eax
and dword ptr[esi], 0xFF
ror byte ptr[esi], 1
ror byte ptr[esi], 1
add byte ptr[esi], 0x01
mov ecx, [esi]
pop edx
x17 : ror dl, 1
dec ecx
jnz x17
mov eax, edx
add eax, 0x20
xor eax, 0xAA
pop esi
ret
输入: 注册EAX = Ekey的32位地址, 注册ECX =要加密的字符(在低8位字段中,CL)
输出: 寄存器EAX =源字符的加密值(在低8位字段AL中)。
有人可以告诉我(或指向我可以找到的某个地方)哪些线路需要逆转解密功能?
提前感谢您的任何答案!
答案 0 :(得分:1)
试试这个:
decrypt: push esi
push ecx
mov esi, eax
and dword ptr [esi], 0xFF
ror byte ptr [esi], 1
ror byte ptr [esi], 1
add byte ptr [esi], 1
mov ecx, [esi]
pop eax
xor eax, 0xAA
sub eax, 0x20
and eax, 0xFF
x18: rol al, 1
dec ecx
jnz x18
pop esi
ret
为什么要在装配中这样做?您可以使用移位运算符或表查找来模拟左右位旋转。