Конференция "Прочее" » Есть у нас спецы по гуглевскому Blogger?
 
  • Rouse_ © (08.04.16 10:34) [0]
    Ситуация конечно вообще дикая.
    Короче вчера с Женькой сидели вычитывали статью по поводу виртуальной машины, над которой я бился почти 3 месяца. Правили некоторые моменты.
    А там в этом вебинтерфейсе есть такая штука - автосохранение (раз в минуту чтоль).
    Ну короче что-то мы там не то подправили и я нажал CTRL+Z пару раз.
    В итоге похоже нажал лишний раз и статья полностью очистилась (до чистого листа) и буквально через секунду сработало это автосохранение.
    А команды REDO у них нет.
    И вот собственно говоря у меня есть только заголовок статьи без текста.

    Вопрос:
    Как и с кем связаться чтоб мне восстановили текст статьи? Я вчера облазил весь этот блогер и так и не смог найти адрес технической подержки, чтоб помогли мне в этом. Я ж точно знаю что они хранят всю историю изменений - но вот как бы это сделать?

    Подскажите - люди добрые :)
  • DayGaykin © (08.04.16 11:05) [1]
    Поздно, конечно, наверное, но у меня кнопка Redo доступна и после автосохранения. Только что проверил.
  • pavelnk © (08.04.16 11:48) [2]
    Как вариант посмотреть в гугле старую версию статьи. В поиске.
  • Rouse_ © (08.04.16 11:57) [3]
    я не публиковал - в кеше нет - проверял
  • KSergey © (08.04.16 13:04) [4]
    Только локальный ворд.
    Только 10 копий.

    PS
    Примириться и переписать заново, но уже лучше. Это шанс.
  • KilkennyCat © (08.04.16 13:39) [5]
    support@blogger.com - по крайней мере, с него приходят.
  • Rouse_ © (08.04.16 14:29) [6]

    > KilkennyCat ©   (08.04.16 13:39) [5]

    спс, попробую
  • Rouse_ © (19.04.16 16:05) [7]
    Ладно, не восстановили мне тест статьи - буду писать с нуля.
    А пока что вот подготовленные к публикации исходники: https://dl.dropboxusercontent.com/u/70911765/vm_core_demo.zip
    Чтоб VM заработала в полную силу - собирать в релизе (тогда включатся инлайны).
    Тестировал на Delphi 2010 - ниже не пробовал.

    Если у кого будут вопросы - пишите прямо сюда, буду по ходу объяснять что там такое творится и как оно вообще такой код генерирует.
  • Pavia © (19.04.16 16:24) [8]
    Хочу "крякми.exe", а то у меня в командировки и с инклюдами туго.

    Странная у вас ВМ. Не понимаю что она даёт? Мне казалось цель ВМ
    1) запутать сравнение.
    2) сделать большую задержку, что-бы нельзя было сделать генератор.
    Не первого не второго в коде не вижу.
  • ttUser © (19.04.16 17:06) [9]
    Розыч, ты лучше скажи - VMProtect стоящая вещь или нельзя полагаться?
    А то нужно написать защиту, но времени как ты заморачиваться нет и опыта нету.
  • Rouse_ © (19.04.16 19:05) [10]

    > Pavia ©   (19.04.16 16:24) [8]
    > Хочу "крякми.exe", а то у меня в командировки и с инклюдами
    > туго.
    >
    > Странная у вас ВМ. Не понимаю что она даёт? Мне казалось
    > цель ВМ
    > 1) запутать сравнение.
    > 2) сделать большую задержку, что-бы нельзя было сделать
    > генератор.
    > Не первого не второго в коде не вижу.

    И то и то в коде есть - смотри на кодонегерацию - на асм выхлоп.


    > ttUser ©   (19.04.16 17:06) [9]
    > Розыч, ты лучше скажи - VMProtect стоящая вещь или нельзя
    > полагаться?

    Начиная с третьей версии стоящая, но только если не включать режим просто мутации кода - мутация у нее по сравнении с двойкой слабая.
    Используй виртуализацию или режим - ультра.
  • Rouse_ © (19.04.16 19:06) [11]

    > Pavia ©   (19.04.16 16:24) [8]
    > Хочу "крякми.exe", а то у меня в командировки и с инклюдами
    > туго.

    А, по поводу крякми - лови: http://www.crackmes.de/users/rouse/keygenme_1/
    Это на базе данного движка сделано.
  • Rouse_ © (19.04.16 19:08) [12]
    ЗЫ: не обращай внимания то что там С++ написано - ядро одинаковое (но да - в этом случае было собрано на си).
  • Rouse_ © (19.04.16 19:12) [13]
    ЗЗЫ: будешь анализировать - чтоб не искать - начало работы VM с адреса 00401270
  • Rouse_ © (19.04.16 19:15) [14]
    На вот тебе для помощи алгоритм этого кейгенми, чтоб показать как там все работало:

    void checkSerial()
    {
    char login[9];
    char serial[31];
    INT8 login_len = 0;
    Peirce::MACRO_MOV8((INT8)SendMessageA(hEdLogin, WM_GETTEXT, 9, (LPARAM)(&login)), &login_len);

    SendMessageA(hEdSn, WM_GETTEXT, 31, (LPARAM)(&serial));

    BOOL badCode;
    Peirce::MACRO_MOVB(false, &badCode);

    INT8 outRes[5];
    Peirce::MACRO_MOV8(0, &outRes[4]);

    INT16 crc, tmpCrc;
    Sheffer::MACRO_MOV16(0, &crc);

    // рассчитываем контрольную сумму серийника
    for (int i = 0; i < 26; i = (int)Sheffer::MACRO_INC(i))
    {
     Peirce::MACRO_MOV16((INT16)serial[i], &tmpCrc);
     Sheffer::MACRO_MOV16((INT16)Peirce::vmMul(tmpCrc, i + 1), &tmpCrc);
     Peirce::MACRO_MOV16((INT16)Sheffer::MACRO_ADD(crc, tmpCrc), &crc);
    }


    // берем контрольное значение с конца серийника
    INT16 snCrc;
    Sheffer::MACRO_MOV16((BYTE)char2int((BYTE*)&serial[26]), &snCrc);
    Sheffer::MACRO_MOV16(Peirce::MACRO_SHL16(snCrc, 8), &snCrc);
    Peirce::MACRO_MOV16((INT16)Sheffer::MACRO_ADD(snCrc, (BYTE)char2int((BYTE*)&serial[28])), &snCrc);

    // и проверяем
    Peirce::MACRO_MOVB(Sheffer::MACRO_JMPNE(Peirce::MACRO_CMP16(snCrc, crc)), &badCode);

    // рассчитываем старшую часть серийника
    INT8 start_value;
    Sheffer::MACRO_MOV8((BYTE)char2int((BYTE*)&serial[8]), &start_value);
     
    Peirce::MACRO_MOVB((BOOL)Peirce::MACRO_IFTHEN(true, badCode,
     Sheffer::MACRO_JMPZ(Peirce::MACRO_CMP8(start_value, 0))), &badCode);

    INT32 sn, tmpLoginByte;
    Peirce::MACRO_MOV32((INT32)start_value, &sn);
    for (int i = 0; i < login_len; i = (int)Sheffer::MACRO_INC(i))
    {
     Peirce::MACRO_MOV32((BYTE)login[i], &tmpLoginByte);
     Peirce::MACRO_MOV32((INT32)Sheffer::MACRO_SHL32(tmpLoginByte, 1), &tmpLoginByte);
     Sheffer::MACRO_MOV32((INT32)Peirce::vmMul(sn, tmpLoginByte), &sn);
     Peirce::MACRO_MOV32((INT32)Sheffer::MACRO_XOR(sn, start_value), &sn);
    }


    // теперь проверяем его с тем что записано в самом серийнике
    INT8 byteCalculated, byteSn;
    Peirce::MACRO_MOV8((BYTE)Sheffer::MACRO_SHR32(sn, 24), &byteCalculated);
    Peirce::MACRO_MOV8((BYTE)char2int((BYTE*)&serial[0]), &byteSn);
    Peirce::MACRO_MOVB((BOOL)Peirce::MACRO_IFTHEN(true, badCode,
      Sheffer::MACRO_JMPNE(Peirce::MACRO_CMP16(byteCalculated, byteSn))), &badCode);

    Peirce::MACRO_MOV8((BYTE)Sheffer::MACRO_SHR32(sn, 16), &byteCalculated);
    Peirce::MACRO_MOV8((BYTE)char2int((BYTE*)&serial[2]), &byteSn);
    Peirce::MACRO_MOVB((BOOL)Peirce::MACRO_IFTHEN(true, badCode,
     Sheffer::MACRO_JMPNE(Peirce::MACRO_CMP16(byteCalculated, byteSn))), &badCode);

    Peirce::MACRO_MOV8((BYTE)Sheffer::MACRO_SHR32(sn, 8), &byteCalculated);
    Peirce::MACRO_MOV8((BYTE)char2int((BYTE*)&serial[4]), &byteSn);
    Peirce::MACRO_MOVB((BOOL)Peirce::MACRO_IFTHEN(true, badCode,
     Sheffer::MACRO_JMPNE(Peirce::MACRO_CMP16(byteCalculated, byteSn))), &badCode);

    Peirce::MACRO_MOV8((BYTE)Sheffer::MACRO_AND(sn, 0xFF), &byteCalculated);
    Peirce::MACRO_MOV8((BYTE)char2int((BYTE*)&serial[6]), &byteSn);
    Peirce::MACRO_MOVB((BOOL)Peirce::MACRO_IFTHEN(true, badCode,
     Sheffer::MACRO_JMPNE(Peirce::MACRO_CMP16(byteCalculated, byteSn))), &badCode);

    // теперь можно выводить результат
    INT8 outCursor, tmpCursor, tmpSnByte;
    Peirce::MACRO_MOV8((INT8)Sheffer::MACRO_IFTHEN(18, 10, badCode), &outCursor);

    for (int i = 0; i < 4; i = (int)Sheffer::MACRO_INC(i))
    {
     Peirce::MACRO_MOV8((INT8)Sheffer::MACRO_ADD(Peirce::MACRO_SHL8(i, 1), outCursor), &tmpCursor);
     Peirce::MACRO_MOV8((INT8)char2int((BYTE*)&serial[tmpCursor]), &tmpSnByte);
     Peirce::MACRO_MOV8((INT8)Peirce::MACRO_XOR(tmpSnByte, serial[i]), &outRes[i]);
    }


    Peirce::MACRO_MOV8((INT8)Sheffer::MACRO_INC(start_value), &start_value);
    Peirce::MACRO_MOV8((INT8)Peirce::MACRO_XOR(outRes[0], start_value), &outRes[0]);
    Peirce::MACRO_MOV8((INT8)Sheffer::MACRO_INC(start_value), &start_value);
    Peirce::MACRO_MOV8((INT8)Peirce::MACRO_XOR(outRes[1], start_value), &outRes[1]);
    Peirce::MACRO_MOV8((INT8)Sheffer::MACRO_INC(start_value), &start_value);
    Peirce::MACRO_MOV8((INT8)Peirce::MACRO_XOR(outRes[2], start_value), &outRes[2]);
    Peirce::MACRO_MOV8((INT8)Sheffer::MACRO_INC(start_value), &start_value);
    Peirce::MACRO_MOV8((INT8)Peirce::MACRO_XOR(outRes[3], start_value), &outRes[3]);

    INT32 outXorValue;
    Sheffer::MACRO_MOV32(*(DWORD*)(&outRes[0]), &outXorValue);

    // проверка что у нас в выходном буфере
    BOOL validBad, validGood;
    Sheffer::MACRO_MOVB((BOOL)Peirce::MACRO_JMPE(Peirce::MACRO_CMP32(outXorValue, 0x7B78718F)), &validBad);
    Sheffer::MACRO_MOVB((BOOL)Peirce::MACRO_JMPE(Peirce::MACRO_CMP32(outXorValue, 0x72317B98)), &validGood);

    Sheffer::MACRO_MOV32((INT32)Peirce::MACRO_IFTHEN(0x7B78718F, outXorValue,
     (!validBad && badCode) || (!badCode && !validGood)), &outXorValue);

    Sheffer::MACRO_MOV32((INT32)Peirce::MACRO_XOR(outXorValue, 0x53421EC1), &outXorValue);

    *(DWORD*)(&outRes[0]) = outXorValue;

    char msg[120];
    sprintf_s(msg, "Checked -> %s ", &outRes[0]);
    MessageBoxA(hMain, msg, "Check serial", MB_ICONINFORMATION);
    }

 
Конференция "Прочее" » Есть у нас спецы по гуглевскому Blogger?
Есть новые Нет новых   [134434   +29][b:0][p:0.006]