Код (Text): int __thiscall sub_45AA20(int this, LPCSTR lpFileName) { HANDLE v2; // eax@1 int v3; // edi@1 signed int v4; // esi@1 char v5; // bl@5 const CHAR *v6; // ebp@5 DWORD v7; // ecx@6 signed int v8; // edi@7 const CHAR v9; // al@8 int v10; // eax@14 void *v11; // esi@14 int v12; // edi@15 void *v13; // esi@20 int v14; // eax@28 void *v15; // esi@28 int v16; // edi@29 void *v17; // esi@34 int v19; // ecx@15 const CHAR *v20; // eax@23 int v21; // ecx@29 DWORD NumberOfBytesRead; // [sp+14h] [bp-A34h]@1 unsigned int v23; // [sp+A34h] [bp-14h]@1 int v24; // [sp+20h] [bp-A28h]@1 LONG Buffer; // [sp+24h] [bp-A24h]@2 __int16 v26; // [sp+15Ch] [bp-8ECh]@5 char Dst; // [sp+15Eh] [bp-8EAh]@5 __int16 v28; // [sp+54h] [bp-9F4h]@5 char v29; // [sp+56h] [bp-9F2h]@5 const CHAR *v30; // [sp+18h] [bp-A30h]@5 _BYTE v31[2000]; // [sp+264h] [bp-7E4h]@5 signed int v32; // [sp+1Ch] [bp-A2Ch]@7 int v33; // [sp+2Ch] [bp-A1Ch]@12 unsigned __int8 *Src; // [sp+30h] [bp-A18h]@14 signed int v35; // [sp+A44h] [bp-4h]@14 int v36; // [sp+28h] [bp-A20h]@15 char v37; // [sp+38h] [bp-A10h]@17 signed int v38; // [sp+50h] [bp-9F8h]@17 void *Memory; // [sp+3Ch] [bp-A0Ch]@18 int v40; // [sp+4Ch] [bp-9FCh]@31 v23 = (unsigned int)&NumberOfBytesRead ^ dword_4B7028; v4 = 0; v3 = this; v24 = this; v2 = CreateFileA(lpFileName, 0x80000000u, 1u, 0, 3u, 0x80u, 0); *(_DWORD *)(v3 + 4) = v2; if ( v2 && ReadFile(v2, &Buffer, 4u, &NumberOfBytesRead, 0) && NumberOfBytesRead == 4 && SetFilePointer(*(HANDLE *)(v3 + 4), Buffer, 0, 0) != -1 ) { v5 = 1; v26 = 0; memset(&Dst, 0, 0x103u); v28 = 0; memset(&v29, 0, 0x103u); v30 = (const CHAR *)&v28; v6 = (const CHAR *)&v26; if ( ReadFile(*(HANDLE *)(v3 + 4), v31, 0x7D0u, &NumberOfBytesRead, 0) ) { do { v7 = NumberOfBytesRead; if ( !NumberOfBytesRead ) break; v8 = 0; v32 = 0; if ( (signed int)NumberOfBytesRead > 0 ) { do { v9 = v31[v8]; if ( v5 ) { if ( !v9 ) { v6[v4] = v9; v5 = 0; LABEL_24: v4 = 0; goto LABEL_25; } v6[v4] = v9 ^ (unsigned __int8)((-(v4 % 2 != 0) & 0xF6) - 47); ++v4; } else { *((_BYTE *)&v33 + v4++) = v9; if ( v4 == 4 ) { if ( *v30 ) { sub_43E340(v30, (int)&Src); v35 = 0; sub_43E210(); v11 = Src; _mbsupr(Src); v10 = operator new(8u); if ( v10 ) { v19 = v33 - v36; *(_DWORD *)v10 = v36; *(_DWORD *)(v10 + 4) = v19; v12 = v10; } else { v12 = 0; } sub_4097A0(v11); LOBYTE(v35) = 1; *(_DWORD *)sub_45B180(&v37) = v12; if ( (unsigned int)v38 >= 0x10 ) j__free(Memory); v35 = -1; if ( (_UNKNOWN *)((char *)v11 - 12) != &unk_4BE1D8 ) { v13 = (char *)v11 - 12; if ( InterlockedDecrement((LPLONG)v13) <= 0 ) j_j__free(v13); } v8 = v32; } v20 = v6; v6 = v30; v36 = v33; v7 = NumberOfBytesRead; v5 = 1; v30 = v20; goto LABEL_24; } } LABEL_25: ++v8; v32 = v8; } while ( v8 < (signed int)v7 ); } } while ( ReadFile(*(HANDLE *)(v24 + 4), v31, 0x7D0u, &NumberOfBytesRead, 0) ); } if ( *v30 ) { sub_43E340(v30, (int)&Src); v35 = 2; sub_43E210(); v15 = Src; _mbsupr(Src); v14 = operator new(8u); if ( v14 ) { v21 = Buffer - v36; *(_DWORD *)v14 = v36; *(_DWORD *)(v14 + 4) = v21; v16 = v14; } else { v16 = 0; } v38 = 15; v40 = 0; LOBYTE(Memory) = 0; sub_409D10(v15, strlen((const char *)v15)); LOBYTE(v35) = 3; *(_DWORD *)sub_45B180(&v37) = v16; if ( (unsigned int)v38 >= 0x10 ) j__free(Memory); if ( (_UNKNOWN *)((char *)v15 - 12) != &unk_4BE1D8 ) { v17 = (char *)v15 - 12; if ( InterlockedDecrement((LPLONG)v17) <= 0 ) j_j__free(v17); } } } return sub_46A2EC(); } Скажите хотябы - куда копать. Практически полный нуб в плане работы с IDA...
Пока я вижу, что данные читаются блоками по 2000 байтов. Четные и не четные дешифруются по разным принципам. А вот дальше я заглох.
AllexInTheDark Это после HexRays? Да в таком виде вряд-ли кто смотреть будет Тут головой и руками надо сначала поработать: хотя бы постараться дать осмысленные названия переменным и избавиться от меток.
AllexInTheDark А зачем тебе в ИДЕ копаться? Скинь в текстовый файл, благо кода немного, и ковыряйся в нем сколько нужно.