eXeL@B —› Основной форум —› Нужно расдекодировать файло. $ Part 2 |
Посл.ответ | Сообщение |
|
Создано: 20 февраля 2006 02:11 · Личное сообщение · #1 Итак, хочу задать некоторый вопрос. Всё это время я думал, и пытался взломать собственнонаписанный (а также его писал ХЕЁС) шифратор файлов EHCodeFile. Никто мне так и не сказал как именно это делать. И у меня появилась следующая идея: Написать проект EHCodeFileCracker, который работает примерно так: Введим некоторые символы, которые будут использоваться для подбора пароля, и начинаем брутфорсный подбор, при каждой генерации мы передаём в функцию декодирования файла собственно данный Кодированный файл, сгенерированный пароль. На каждом этапе получения след. символа в функции декодера сравниваем этот символ с символом файла, часть которого предположительно похожа (идентична) той, над которой мы про- водим процесс декодинга. Дело в том, что у файлов WORD'а очень много повторяющихся блоков, возмём начальный, и увидим, что практически 10 килобай совпадают у разных файлов. Это основной подход. Но дело в том, что программа даёт что-то около 2-х миллионов парлей в сек. на 1 466 MHZ (1700+ ATHLON). Такой подбор малоэффективен при пароле больше 6-ти символов. У меня процесс подбора пароля (qaz50134) к тому же файлу занял у меня где-то часов 30. Так что я не представляю как вы это сделали менее чем за 12 часов. Расскажете может. Кому интересно. 8-) : (* В архиве проект EHCodeFileCracker и EHCodeFile + кодированные/ декодированные файлы + скриншот) Вторая часть в след. сообщении. e92c_ARH.part1.rar.zip |
|
Создано: 20 февраля 2006 02:13 · Личное сообщение · #2 |
|
Создано: 20 февраля 2006 02:16 · Личное сообщение · #3 Ах... да... А исходник выглядет так: #include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h> #define INT_EMPTY -1 #define SIZE_OF_PASS_MASS 256 #define randminmax(a,b,c) (((c) == (1)) ? (min(a,b)) : (max(a,b))) void main(void) { //## Создание переменных ###################################################################### int i, l, b, b1, i2, left, left2, left3, left4, left5, tmp; unsigned __int16 USES_BYTES; int str2[SIZE_OF_PASS_MASS]; char str[SIZE_OF_PASS_MASS], str3[SIZE_OF_PASS_MASS], STR4[MAX_PATH], STR5[1024], STR6[MAX_PATH], STR7[1024], STR8[1024]; DWORD suc; HANDLE EncFile, UsesFile; int j, PassCode = 23; int SizeOfNewPass=0; char NewPass[256]; i=l=b=b1=i2=left=left2=left3=left4=left5=0; //## Ввод данных ###################################################################### ######## printf("‚ўҐ¤ЁвҐ бЁ¬ў®«л, Є®в®алҐ Ўг¤гв гз бвў®ў вм ў Ї®¤Ў®аҐ Ї а®«п:\n->"); gets(str); printf("Љ®«ЁзҐбвў® бЁ¬ў®«®ў ў Ї а®«Ґ: \n->"); scanf("%d", &l); UK_ERR1: printf("‚ўҐ¤ЁвҐ Їгвм Є д ©«г, Є®в®ал© пў«пҐвбп § иЁда®ў л¬: \n->"); fflush(stdin); gets(STR4); EncFile = CreateFile(STR4, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(EncFile == INVALID_HANDLE_VALUE){ printf("Ћ€ЃЉЂ! ’ Є®Ј® д ©« Ґвг.\n"); goto UK_ERR1;} USES_BYTES=l*2; UK_ERR2: printf("‚ўҐ¤ЁвҐ Їгвм Є д ©«г, з «м п з бвм Є®в®а®Ј® Ї®е®¦ ЇаҐ¤Ї®«®¦ЁвҐ«м® а бЄ®¤Ёа®ў л©: \n->"); fflush(stdin); gets(STR6); UsesFile = CreateFile(STR6, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(UsesFile == INVALID_HANDLE_VALUE){ printf("Ћ€ЃЉЂ! ’ Є®Ј® д ©« Ґвг.\n"); goto UK_ERR2;} printf("Џа®ЈаҐбб:\n"); //## Обработка данных ###################################################################### ### ReadFile(EncFile, STR5, USES_BYTES, &suc, NULL); STR5[USES_BYTES]='\0'; ReadFile(UsesFile, STR7, USES_BYTES, &suc, NULL); STR7[USES_BYTES]='\0'; while(str[b]) b++; for(i=0;i<SIZE_OF_PASS_MASS;i++) str2[i]=INT_EMPTY; printf("- 1-th SYMB -\n"); while(true) { N1: if(i2==l) break; str2[i2]=left; left++; i=0; while(str2[i]!=INT_EMPTY) str3[i]=str[str2[i]], i++; str3[i]='\0'; for(tmp=0;tmp<USES_BYTES;tmp++) STR8[tmp]=STR5[tmp];STR8[tmp]='\0'; SizeOfNewPass=0; PassCode=23; while(str3[SizeOfNewPass]) SizeOfNewPass++; SizeOfNewPass *= 2; for(i=j=0;str3[i];i++,j++) { PassCode += str3[i]; NewPass[j] = str3[i] + PassCode + j++; NewPass[j] = str3[i] + j; } for(i=0;i<SizeOfNewPass;i++) { NewPass[i] += PassCode; } NewPass[SizeOfNewPass] = '\0'; for(i=SizeOfNewPass, j=0;i>0;i--, j--) { do { if(NewPass[j] <= -55 && NewPass[0] <= -60) { STR5[i] -= STR5[i-1] - NewPass[j] + randminmax(i,j,(i+j)%2) + (i/(j+1)) + i/3 + 7*j; break; } if(NewPass[j] > 70) { if(STR5[i-1]%2) STR5[i] -= STR5[i-1] - NewPass[j] + i + j + (i/(j+1)); else STR5[i] -= STR5[i-1] - NewPass[j] + (i/(j+1)) + i/3; break; } if(NewPass[1] >= 120 || NewPass[j] < 10) { if(STR5[i-1]%2) STR5[i] -= STR5[i-1] - NewPass[j] + j + (i/(j+1)) + i/3; else STR5[i] -= STR5[i-1] - NewPass[j] + i + j + (i/(j+3)) + i/2; break; } if(NewPass[j] < 50 || NewPass[1] <= -3) { if(STR5[i-1]%2) STR5[i] -= STR5[i-1] - NewPass[j] + i + j + i/3; else STR5[i] -= STR5[i-1] - NewPass[j] + i + 7 + (i/(j+1)) + i/3; break; } // DEFAULT: if(STR5[i-1]%2) STR5[i] += STR5[i-1] - NewPass[j] - NewPass[j] + i + j + i/3; else STR5[i] += randminmax(STR5[i-1], randminmax(NewPass[j], i, j%2), (i-j-1)%2)- max(i,j*j) + (i*(-1)) + 7 + (i/(j+1)) + i/3; } while(false); if(STR5[i]!=STR7[i] && i!=SizeOfNewPass) goto UK_NOT; if(!j) j=SizeOfNewPass; } STR5[0] = STR5[0] - str3[0] - PassCode; for(tmp=0;STR5[tmp]==STR7[tmp];tmp++); //## Вывод обработанной информации ########################################################### if(tmp>=SizeOfNewPass){ printf("Џ а®«Ґ¬, Є®в®ал¬ § Є®¤Ёа®ў д ©« %s, ў®§¬®¦®, пў«пҐвбп '%s'\n",STR4,str3);} //#################################################################### ######################## UK_NOT: for(tmp=0;tmp<USES_BYTES;tmp++) STR5[tmp]=STR8[tmp];STR5[tmp]='\0'; while(str2[left2]!=INT_EMPTY) { if(str2[left2]==b-1) left2++; else{ left2=0; break;} } if(left2-1==i2 && i2!=0) { while(str2[left3]!=INT_EMPTY) str2[left3]=0, left3++; if(i2==1) printf("- 2-th SYMB -\n"); i2++; if(i2!=l) printf("- %d-th SYMB -\n",i2+1); left3=0; left=0; goto N1; } if(left==b) { if(i2!=0) { while(str2[left3]!=INT_EMPTY) left3++; left4=str2[left3-1]; while(str2[left3-1]==left4) left4=str2[left3-1], str2[left3-1]=0, left3--; str2[left3-1]++; } else i2++, str2[i2-1]=0; left3=0; left=0; goto N1; } } printf("Џ® 室㠤Ґ« нв® ўбс...\n"); getch(); } |
|
Создано: 20 февраля 2006 07:31 · Личное сообщение · #4 |
|
Создано: 20 февраля 2006 08:44 · Личное сообщение · #5 |
|
Создано: 20 февраля 2006 10:05 · Личное сообщение · #6 |
eXeL@B —› Основной форум —› Нужно расдекодировать файло. $ Part 2 |
Эта тема закрыта. Ответы больше не принимаются. |