Сейчас на форуме: Rio, YDS (+10 невидимых)

 eXeL@B —› Основной форум —› Нужно расдекодировать файло. $ Part 2
Посл.ответ Сообщение

Ранг: 9.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 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



Ранг: 9.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2006 02:13
· Личное сообщение · #2

Увеличте размер атачча раза в два.

5c48_ARH.part2.rar.zip



Ранг: 9.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 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();
}




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 20 февраля 2006 07:31
· Личное сообщение · #4

juicy_emad пишет:
Расскажете может.

Нифига. Заплати людям деньги за прошлую работу, потом проси уже ...



Ранг: 9.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2006 08:44
· Личное сообщение · #5

Что-то ни одного номера кошелька на своём мыле я не видел. 8-)
Да хватит уже может, а?
К тому же... Может кто-нить высказаться по вопросу эффективности предложенного мною методу взлома?




Ранг: 332.0 (мудрец)
Активность: 0.180
Статус: Участник
•Pr0tEcToRs KiLLeR•

Создано: 20 февраля 2006 10:05
· Личное сообщение · #6

Что-то много стало кодеров которые пытаются нахаляву тестить тут свои "неломаемые" защиты, надоели... а этот, как я понял, вообще наебал людей на деньги. Так что топик закрыт.


 eXeL@B —› Основной форум —› Нужно расдекодировать файло. $ Part 2
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати