我想解压一些文件,并找到了一些关于如何解压的信息。显然,它们在 CFB 模式下使用 AES 128 加密,有时使用 ZLIB 压缩。每个文件的密钥和 IV 应该是根据文件大小生成的。此代码应该让他们:
Generate_Key_IV proc near
mov eax, [ecx]
movzx edx, ax
imul edx, 9069h
shr eax, 10h
add edx, eax
mov eax, [ecx+4]
push esi ; Here file size
movzx esi, ax
imul esi, 4650h
shr eax, 10h
add eax, esi
mov [ecx], edx
mov [ecx+4], eax
pop esi
test edx, edx
jnz short loc_495EA2
mov dword ptr [ecx], 1
loc_495EA2:
test eax, eax
jnz short loc_495EAD
mov dword ptr [ecx+4], 0FFFFFFFFh
loc_495EAD:
mov eax, [ecx]
shl eax, 10h
add eax, [ecx+4]
retn
Generate_Key_IV endp
我知道这是在大会中,但不幸的是我不知道它是如何工作的。我当然可以学习它,但我预计这会花费大量时间,而且我认为除了弄清楚上述含义之外,我不会将它用于更多用途。
所以,是的,如果有人可以概述上述内容的作用以及获取密钥和 IV 的方法和/或算法,我将不胜感激。
还给出了此 C 代码,显然显示了如何使用上述代码:
int __usercall sub_47AFA0<eax>(int a1<eax>, int a2<ebp>, void *a3, size_t a4, __int64 a5)
{
unsigned int v5; // edi@1
unsigned int v6; // edi@3
char v8; // [sp-1A0h] [bp-1ACh]@2
int v9; // [sp-198h] [bp-1A4h]@1
void *v10; // [sp-194h] [bp-1A0h]@1
char v11; // [sp-190h] [bp-19Ch]@5
char v12; // [sp-140h] [bp-14Ch]@5
int v13; // [sp-40h] [bp-4Ch]@6
void *v14; // [sp-3Ch] [bp-48h]@5
char v15; // [sp-34h] [bp-40h]@2
char v16; // [sp-24h] [bp-30h]@4
unsigned int v17; // [sp-14h] [bp-20h]@1
char *v18; // [sp-10h] [bp-1Ch]@1
int v19; // [sp-Ch] [bp-18h]@1
int (__cdecl *v20)(int, int); // [sp-8h] [bp-14h]@1
signed int v21; // [sp-4h] [bp-10h]@1
int v22; // [sp+0h] [bp-Ch]@1
void *v23; // [sp+4h] [bp-8h]@1
char v24; // [sp+8h] [bp-4h]@1
int v25; // [sp+Ch] [bp+0h]@1
v22 = a2;
v23 = (void *)v25;
v21 = -1;
v20 = sub_72CCC6;
v19 = a1;
v18 = &v24;
v17 = (unsigned int)&v22 ^ __security_cookie;
v10 = a3;
v9 = sub_5657C0(a4);
sub_495EC0(a4 * a5, (unsigned __int64)a4 * a5 >> 32);
v5 = 0;
do
*(&v15 + v5++) = Generate_Key_IV((int)&v8); ;Generating KEY
while ( v5 < 0x10 );
v6 = 0;
do
*(&v16 + v6++) = Generate_Key_IV((int)&v8); ;Generating IV
while ( v6 < 0x10 );
sub_47AC20(&v15, 16, &v16); ; AES Routine
v21 = 0;
sub_433E00(v9, v10, a4);
v21 = 1;
sub_4799F0(&v11);
if ( v14 == &v12 + (-(signed int)&v12 & 0xF) )
memset(v14, 0, 4 * v13);
return __security_check_cookie((unsigned int)&v22 ^ v17);
}
我假设这只是使用密钥和 IV 来使用 AES 解码文件。但是,如果它包含我应该知道的任何必要内容,那当然也很棒。