Код (Text): @L00000001: PUSH EBX PUSH ESI PUSH EDI PUSH EBP ADD ESP, -18 XOR EBX, EBX MOV DWORD PTR [ESP], EBX MOV DWORD PTR [ESP+4], EAX MOV DWORD PTR [ESP+8], EDX XOR ESI, ESI XOR EDI, EDI TEST ECX, ECX JNS SHORT @L00000002 ADD ECX, 7 @L00000002: SAR ECX, 3 TEST ECX, ECX JLE @L00000008 MOV DWORD PTR [ESP+14], ECX @L00000003: MOV EBP, 8 LEA EAX, DWORD PTR [ESP+C] @L00000004: MOV EDX, DWORD PTR [ESP+4] MOV DL, BYTE PTR [EDX+ESI] MOV ECX, EDX ADD CL, 0D7 SUB CL, 32 JNB SHORT @L00000005 AND EDX, 0FF MOV DL, BYTE PTR [EDX+5D56F3] MOV BYTE PTR [EAX], DL JMP SHORT @L00000006 @L00000005: MOV BYTE PTR [EAX], 0 @L00000006: INC ESI INC EAX DEC EBP JNZ SHORT @L00000004 MOV AL, BYTE PTR [ESP+C] SHL EAX, 3 XOR EDX, EDX MOV DL, BYTE PTR [ESP+D] SHR EDX, 2 OR AL, DL MOV EDX, DWORD PTR [ESP+8] MOV BYTE PTR [EDX+EDI], AL INC DWORD PTR [ESP] INC EDI MOV AL, BYTE PTR [ESP+E] CMP AL, 0FF JE @L00000007 MOV DL, BYTE PTR [ESP+D] SHL EDX, 6 ADD EAX, EAX OR DL, AL XOR EAX, EAX MOV AL, BYTE PTR [ESP+F] SHR EAX, 4 OR DL, AL MOV EAX, DWORD PTR [ESP+8] MOV BYTE PTR [EAX+EDI], DL INC DWORD PTR [ESP] INC EDI MOV AL, BYTE PTR [ESP+10] CMP AL, 0FF JE SHORT @L00000007 MOV DL, BYTE PTR [ESP+F] SHL EDX, 4 AND EAX, 0FF SHR EAX, 1 OR DL, AL MOV EAX, DWORD PTR [ESP+8] MOV BYTE PTR [EAX+EDI], DL INC DWORD PTR [ESP] INC EDI MOV AL, BYTE PTR [ESP+11] CMP AL, 0FF JE SHORT @L00000007 MOV DL, BYTE PTR [ESP+10] SHL EDX, 7 SHL EAX, 2 OR DL, AL XOR EAX, EAX MOV AL, BYTE PTR [ESP+12] SHR EAX, 3 OR DL, AL MOV EAX, DWORD PTR [ESP+8] MOV BYTE PTR [EAX+EDI], DL INC DWORD PTR [ESP] INC EDI MOV AL, BYTE PTR [ESP+13] CMP AL, 0FF JE SHORT @L00000007 MOV EDX, DWORD PTR [ESP+8] MOV CL, BYTE PTR [ESP+12] SHL ECX, 5 OR CL, AL MOV BYTE PTR [EDX+EDI], CL INC DWORD PTR [ESP] INC EDI @L00000007: DEC DWORD PTR [ESP+14] JNZ @L00000003 @L00000008: MOV EAX, DWORD PTR [ESP] ADD ESP, 18 POP EBP POP EDI POP ESI POP EBX RET и дамп Код (Text): 005D56F3 00 38 88 57 00 A4 88 57 00 38 94 57 00 A4 94 57 .8?W.¤?W.8”W.¤”W 005D5703 00 3C A2 57 00 A8 A2 57 00 10 B9 57 00 7C B9 57 .<ўW.ЁўW.№W.|№W 005D5713 00 E8 B9 57 00 6C D0 57 00 00 00 00 00 00 00 00 .и№W.lРW........ 005D5723 19 1A 00 1B 00 1C 00 1D 1E 1F 00 00 00 00 00 00 ......... 005D5733 00 FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D .я..... 005D5743 0E 0F 10 11 12 13 14 15 16 17 18 8B C0 00 8D 40 ‹А.Ќ@ 005D5753 00 E4 08 58 00 10 09 58 00 3C 09 58 00 68 09 58 .дX..X.<.X.h.X 005D5763 00 94 09 58 00 C0 09 58 00 EC 09 58 00 18 0A 58 .”.X.А.X.м.X..X 005D5773 00 44 0A 58 00 70 0A 58 00 9C 0A 58 00 C8 0A 58 .D.X.p.X.њ.X.И.X 005D5783 00 F4 0A 58 00 20 0B 58 00 4C 0B 58 00 78 0B 58 .ф.X. X.LX.xX 005D5793 00 A4 0B 58 00 D0 0B 58 00 FC 0B 58 00 28 0C 58 .¤X.РX.ьX.(.X 005D57A3 00 54 0C 58 00 80 0C 58 00 AC 0C 58 00 D8 0C 58 .T.X.Ђ.X.¬.X.Ш.X 005D57B3 00 04 0D 58 00 30 0D 58 00 5C 0D 58 00 88 0D 58 ..X.0.X.\.X.?.X 005D57C3 00 B4 0D 58 00 E0 0D 58 00 0C 0E 58 00 38 0E 58 .ґ.X.а.X..X.8X 005D57D3 00 64 0E 58 00 90 0E 58 00 BC 0E 58 00 E8 0E 58 .dX.ђX.јX.иX 005D57E3 00 14 0F 58 00 40 0F 58 00 6C 0F 58 00 98 0F 58 .X.@X.lX.˜X 005D57F3 00 C4 0F 58 00 F0 0F 58 00 1C 10 58 00 48 10 58 .ДX.рX.X.HX 005D5803 00 74 10 58 00 A0 10 58 00 CC 10 58 00 F8 10 58 .tX. X.МX.шX 005D5813 00 24 11 58 00 50 11 58 00 7C 11 58 00 A8 11 58 .$X.PX.|X.ЁX 005D5823 00 D4 11 58 00 00 12 58 00 2C 12 58 00 58 12 58 .ФX..X.,X.XX 005D5833 00 84 12 58 00 B0 12 58 00 DC 12 58 00 08 13 58 .„X.°X.ЬX.X 005D5843 00 34 13 58 00 60 13 58 00 00 8D 40 00 00 8D 40 .4X.`X..Ќ@..Ќ@ 005D5853 00 00 8D 40 00 00 8D 40 00 02 00 00 00 03 00 00 ..Ќ@..Ќ@...... 005D5863 00 01 00 00 00 04 00 00 00 E0 B3 58 00 EC B3 58 .......аіX.міX 005D5873 00 FC B3 58 00 0C B4 58 00 1C B4 58 00 28 B4 58 .ьіX..ґX.ґX.(ґX 005D5883 00 38 B4 58 00 48 B4 58 00 58 B4 58 00 68 B4 58 .8ґX.HґX.XґX.hґX 005D5893 00 78 B4 58 00 88 B4 58 00 98 B4 58 00 A8 B4 58 .xґX.?ґX.˜ґX.ЁґX 005D58A3 00 B8 B4 58 00 C8 B4 58 00 01 00 00 00 02 00 00 .ёґX.ИґX...... 005D58B3 00 04 00 00 00 20 00 00 00 80 00 00 00 00 00 00 .... ...Ђ...... 005D58C3 00 01 8D 40 00 00 00 00 00 02 00 00 00 01 00 00 .Ќ@.......... 005D58D3 00 00 00 00 00 04 00 00 00 08 00 00 00 20 00 00 ........... .. 005D58E3 00 10 00 00 00 00 00 00 00 00 00 80 00 40 5E 59 ..........Ђ.@^Y 005D58F3 00 80 5E 59 00 D0 5E 59 00 24 5F 59 00 8C 5F 59 .Ђ^Y.Р^Y.$_Y.Њ_Y 005D5903 00 A8 5F 59 00 CC 5F 59 00 E8 5F 59 00 10 60 59 .Ё_Y.М_Y.и_Y.`Y 005D5913 00 10 60 59 00 48 60 59 00 98 60 59 00 A8 60 59 .`Y.H`Y.˜`Y.Ё`Y 005D5923 00 BC 60 59 00 CC 60 59 00 DC 60 59 00 EC 60 59 .ј`Y.М`Y.Ь`Y.м`Y 005D5933 00 00 61 59 00 10 61 59 00 20 61 59 00 30 61 59 ..aY.aY. aY.0aY 005D5943 00 40 61 59 00 50 61 59 00 50 61 59 00 60 61 59 .@aY.PaY.PaY.`aY 005D5953 00 70 61 59 00 80 61 59 00 90 61 59 00 00 01 02 .paY.ЂaY.ђaY.. 005D5963 03 04 8D 40 00 00 8D 40 00 00 8D 40 00 00 01 FF Ќ@..Ќ@..Ќ@..я fastcall, три параметра: строка длиной 0x68, длина этой строки, строка длиной 10. судя по контексту предполагаю, что это симметричный шифр, однако понятия не имею какой. подстановка выходного буфера в качестве входного, разумеется, ничего не дала. в окрестностях рефа функций, похожих на setkey, нет. если предположить, что третий параметр - ключ, то для des или 3des длина нестандартная. сабж?
Эквивалент на C++: Код (Text): int __fastcall sub01(char *in_buf, unsigned char *out_but, int in_buf_size) { static unsigned char _data[] = { 0x19, 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x1E, 0x1F, // 0123456789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // :;<=>?@ 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, // ABCDEFGHIJKLM 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 // NOPQRSTUVWXYZ }; int count = 0; unsigned char buf[8]; for (int var_14 = in_buf_size/8; var_14; --var_14) { for (int i = 0; i < 8; ++i) { unsigned char ch = *in_buf++; if (ch >= '0' && ch <= 'Z') buf[i] = _data[ch-'0']; else buf[i] = 0x00; } *out_but++ = (buf[0] << 3) | (buf[1] >> 2); count++; if (buf[2] == 0xFF) continue; *out_but++ = (buf[1] << 6) | (buf[2] << 1) | buf[3] >> 4; count++; if (buf[4] == 0xFF) continue; *out_but++ = (buf[3] << 4) | (buf[4] >> 1); count++; if (buf[5] == 0xFF) continue; *out_but++ = (buf[4] << 7) | (buf[5] << 2) | (buf[6] >> 3); count++; if (buf[7] == 0xFF) continue; *out_but++ = (buf[6] << 5) | (buf[7] >> 0); count++; } return count; }
Алгоритм таков: Входная строка обрабатывается по 8 байт за проход. Каждый символ строки заменяется в соответствии с таблицей на 5-битный код, далее эти коды помещаются в битовый выходной буфер, причем, если во входной строке встречается символ 'A' (код 0xFF) на позициях 3, 5, 6 или 8, то оставшиеся символы в 8-байтном блоке не рассматриваются, и производится переход к следующему блоку. Функция возвращает число пентад, записанных в выходной буфер.