Люди, ОЧЕНЬ ПРОШУ, помогите разобраться с алгоритмом расшифровки. Код (Text): 004D06D4 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX ; COUNTER:=3 004D06D7 >|> 8D8D ECFEFFFF /LEA ECX,DWORD PTR SS:[EBP-114] 004D06DD 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8] 004D06E0 |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 004D06E3 |. E8 60FAFFFF |CALL <Ccalc.PROC1> ; PROC1 (TMP_str, OUT_str, OUT_srt) 004D06E8 |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 004D06EB |. 8DB5 ECFEFFFF |LEA ESI,DWORD PTR SS:[EBP-114] 004D06F1 |. 8BF8 |MOV EDI,EAX 004D06F3 |. B9 41000000 |MOV ECX,41 004D06F8 |. F3:A5 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; COPY from TMP_str to OUT_str 004D06FA |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C] 004D06FD |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 004D0700 |. E8 FBFDFFFF |CALL <Ccalc.PROC2> ; PROC2 (MASK_?, OUT_str) 004D0705 |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8] 004D0708 |. 8B45 F0 |MOV EAX,DWORD PTR SS:[EBP-10] 004D070B |. E8 78F8FFFF |CALL <Ccalc.PROC3> 004D0710 |. 3C 01 |CMP AL,1 004D0712 75 2E JNZ SHORT <Ccalc.SKIP> ; if PROC3(0D_?, COUNTER)==1 { 004D0714 |. 8D8D ECFEFFFF |LEA ECX,DWORD PTR SS:[EBP-114] 004D071A |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4] 004D071D |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 004D0720 |. E8 23FAFFFF |CALL <Ccalc.PROC1> ; PROC1 (TMP_str, IN_str, OUT_str) 004D0725 |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 004D0728 |. 8DB5 ECFEFFFF |LEA ESI,DWORD PTR SS:[EBP-114] 004D072E |. 8BF8 |MOV EDI,EAX 004D0730 |. B9 41000000 |MOV ECX,41 004D0735 |. F3:A5 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; COPY from TMP_str to OUT_str 004D0737 |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C] 004D073A |. 8B45 08 |MOV EAX,DWORD PTR SS:[EBP+8] 004D073D |. E8 BEFDFFFF |CALL <Ccalc.PROC2> ; PROC2 (MASK_?, OUT_str) } 004D0742 >|> FF4D F0 |DEC DWORD PTR SS:[EBP-10] 004D0745 |. 837D F0 FF |CMP DWORD PTR SS:[EBP-10],-1 004D0749 |.^75 8C \JNZ SHORT <Ccalc.WHILE> ; if (COUNTER-->=0) loop [00CF8550] IN_str – зашифрованная строка. [0012F6B4] TMP_str – промежуточная строка. [0012F7D6] OUT_str – после этого цикла тут расшифрованная строка. [00CACA98] MASK_? – unknown [00CAC994] 0D_? - unknown Пришёл к выводу что самому не разобраться, не хватает опыта. Мозги пухнут , уже три дня это шагаю… Подскажите в каком направлении копать. Может кто опознает в этом какой-то из стандартных алгоритмов. Буду благодарен за любую подсказку. Открывал тему на краклабе, но там пока никто не помог... Вот не запакованная прога. 1.4 Mb http://rapidshare.com/files/42092523/Ccalc_6.98.56_Dealer.zip.html Выше приведённая процедура в TXT файле. 2 Kb http://rapidshare.com/files/42093299/proc.txt.html
Ну лично я алгоритма шифрования собственно не увидел. Что помогать расшифровать то ? Содержимое CALL-ов я не умею пока предугадывать :-(
На входе зашифрованная строка IN_str, которая читается из ини файла (96 байт). На выходе строка OUT_str. В ней название фирмы, телефон и HardwareID. Прога написана на делфи и ничем не запакована. Задача разобраться как расшивровываеться IN_str. ПОМОГИТЕ !
SergX А алгоритм тебе зачем? Грузи в дебуггер и смотри, что получается. IceStudent Ему на кряклабе еще не помогли (#1)
Что получается я знаю. Как бы я без отладчика вообще эту процедуру нашёл... Подозревать не надо. Нужно мне это именно для написания кейгена. На кряклабе все смотрят, но помочь не хотят или не могут... Я не прошу готового решения, мне нужны хотя бы подсказки. И не так важен результат как процесс.
Хех, подозреваю, что он ключ для расшифровки вычисляет из имени компьютера. Иначе нафига там мелькает местами имя компа и реализовано в коде CRC32, Adler32, MD4 и MD5. Да уж, тут имхо долго париться надо. Вряд ли кто за "так" возьмется.
Нет ключ фиксированный ! Он лежит в самом ехе. [00CACA98] MASK_? – это вроде ключ. После выполнения выше приведённой процедуры на любом компе в OUT_str будет одинаковый результат независимо от того зарегеная прога или нет. Прога начинает думать подходит ей ключ или нет уже после расшифровки !
SergX Похоже там оригинальный алгоритм автора. Используются битовые поля (ассемблерные процедуры с адресами, близкими к 4D0000 и выше). Ассемблерные, ИМХО, поскольку в них используются инструкции bt, bts, br, которые Builder (а программа написана на Builder 5) практически не использует при компиляции. Мой тебе совет: бери IDA, загружай в нее свою программу и пытайся реверсить алгоритм, написанный на С. Еще тебе может помочь DeDe (в плане определения системных процедур). Выдели сразу процедуры работы с битовыми полями (они стандартные - инициализировать битовое поле, установить бит с данным индексом, очистить бит с данным индексом, проверить бит с данным индексом). Остальной алгоритм будет как-бы постепенно нанизываться на эти процедуры "нижнего уровня".