SmartCVS - защита на жабе

Тема в разделе "WASM.RESEARCH", создана пользователем volodya, 1 июн 2005.

  1. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Я тут все пытаюсь найти НОРМАЛЬНЫЙ cvs-клиент. Рассматривал:



    1. командную строку cvs

    2. tortoisecvs

    3. wincvs



    ну, 1 - это не серьезно, 2 - подвисает в непонятных местах, хреново хендлит некоторые сложные случаи, о 3 всерьез говорить и вообще не стоит - за такие программы убивать надо



    словом, что-то приемлимое найти сложно

    попала мне на глаза недавно smartcvs - написана на жабе. кажется, наконец, нашел я что-то для себя :)

    управление из собственного ГУИ, а не интеграция в Windows Explorer как у tortoisecvs, но тоже ничего! ГУИ приятный, функциональность хорошая. Однако, платить за нее надо.



    Стал смотреть. Дошел до этого класса:



    smartcvs.jar/cm.class



    Декомпилировал jad:


    Код (Text):
    1.  
    2. // Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov.
    3. // Jad home page: [url=http://www.kpdus.com/jad.html
    4. ]http://www.kpdus.com/jad.html
    5. [/url]
    6. // Decompiler options: packimports(3)
    7. // Source File Name:   SourceFile
    8.  
    9. package smartcvs;
    10.  
    11.  
    12. // Referenced classes of package smartcvs:
    13. //            Mf
    14.  
    15. public final class cm
    16. {
    17.  
    18.     public cm()
    19.     {
    20.     }
    21.  
    22.     public static final String a()
    23.     {
    24.         return Mf.d("Register");
    25.     }
    26.  
    27.     public static final String b()
    28.     {
    29.         return "Enter registration data.";
    30.     }
    31.  
    32.     public static final String c()
    33.     {
    34.         return "Register SmartCVS";
    35.     }
    36.  
    37.     public static final String d()
    38.     {
    39.         return "To purchase a commercial Professional license,
    40.            please visit\nhttp://www.smartcvs.com/purchase.html\n\n
    41.            If you downloaded the license file,
    42.            please enter the filename or choose it below.";
    43.     }
    44.  
    45.     public static final String e()
    46.     {
    47.         return "License File";
    48.     }
    49.  
    50.     public static final String f()
    51.     {
    52.         return "Please enter or choose a valid license file!";
    53.     }
    54.  
    55.     public static final String g()
    56.     {
    57.         return "Invalid or corrupted license!\nPlease enter or choose a valid license file!";
    58.     }
    59.  
    60.     public static final String h()
    61.     {
    62.         return "An error occured, while the license file was copied!\n\nDetails: {0}";
    63.     }
    64.  
    65.     public static final String i()
    66.     {
    67.         return "Please restart SmartCVS to continue with the changed license.";
    68.     }
    69. }
    70.  




    Как видим - ничего интересного. И тут возникла проблемка.

    Стал быть, есть какой-то класс, который использует cm. И вызывается нечто вида cm.a(); НО!



    1. если глянуть внутрь smartcvs.jar, то видно, что ребята очень хитро обозвали классы внутри. Например, есть cm, есть cM, есть Cm и есть CM.class. Под виндой, ессно, различия в регистре до лампочки, поэтому классы перезаписываются (о!, пока писал, придумал, что надо распаковать в линухе!)

    2. ну и как искать этот cm.a()? Только полная распаковка под линухом и декомпиляция ВСЕХ файлов? с последующим поиском?



    мне идти в лоб или кто-то посоветует что-нибудь умнее?
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Такс, проблему с именами решил. jar xf под линдузой рулит.

    теперь, видимо надо писать простенький перловый скрипт для вызова jad для каждого файлика...
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Сгрузил линуховский jad (статически скомпиленый, бо динамический у мя на отсутствие либ ругается) и написал офигительно сложный скрипт:


    Код (Text):
    1.  
    2. #!/usr/bin/perl
    3.  
    4. while(<*.class>)
    5. {
    6.     system("./jad $_");
    7. }
    8.  




    ща поглядим, что там получилось :)
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Код (Text):
    1.  
    2. grep 'cm' *.jad
    3.  
    4.  
    5. aO.jad:    public void a(FQ fq, String s, CM cm)
    6. aO.jad:        a.a(fq, s, cm);
    7. aP.jad:    public aP(gE ge, dz dz, dz dz1, CM cm, cS cs, pa pa, dF df,
    8. aP.jad:        nT.a(cm);
    9. aP.jad:        a_smartcvs_CM_fld = cm;
    10. aP.jad:        a_smartcvs_yx_fld = new yx(cm.b);
    11. Ch.jad:        public final void a(FQ fq, String s, CM cm)
    12. cm.jad:public final class cm
    13. cm.jad:    public cm()
    14. iH.jad:    public final void a(FQ fq, String s, CM cm)
    15. iH.jad:        a(file, cm.c, s);
    16. km.jad:                a_smartcvs_uU_fld.a = "cmd.exe";
    17. km.jad:                a_smartcvs_uU_fld.b = "/c start cmd.exe";
    18. MC.jad:    public final void a(FQ fq, String s, CM cm)
    19. NO.jad://            H, Qb, cm, mL,
    20. NO.jad:        a(cm.a());
    21. NO.jad:        b(cm.b());
    22. Qb.jad://            Jk, OC, Ou, cm,
    23. Qb.jad:        a_java_lang_String_fld = cm.c();
    24. Qb.jad:        a_smartcvs_pX_fld = new pX(cm.e(), lz);
    25. Qb.jad:        (oc = OC.a()).a(new xR(cm.d()), 0, 0, 2);
    26. Qb.jad:            a_smartcvs_IX_static_fld.d(cm.g(), ou);
    27. Qb.jad:            throw new uk(a_smartcvs_pX_fld, cm.g());
    28. Qb.jad:            a_smartcvs_IX_static_fld.d(cm.f(), exception);
    29. Qb.jad:        throw new uk(a_smartcvs_pX_fld, cm.f());
    30. Qb.jad:            zC.a(cm.i(), cm.c(), Fl.a(a_smartcvs_Dg_fld));
    31. Qb.jad:            zC.c(dQ.a(cm.h(), ioexception.getMessage()), cm.c(), Fl.a(a_smartcvs_Dg_fld));
    32. rW.jad:    public abstract void a(FQ fq, String s, CM cm)
    33. wD.jad:    public final void a(FQ fq, String s, CM cm)






    вот уроды, мля... анализировать сложновато. :dntknw:
     
  5. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Смущают меня эти a_smartcvs_* - не понимаю, откуда взялись :-/
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Типичная для Proguard обфускация. Такие файлы лучше не декомпилировать, а сразу дизассемблировать идой и править JavaByte'ом. В жабьих бинарниках (класс-файлах), как правило, сравнительно мало кода и их легко реверсить на уровне ассемблера.





    А я их по одному достаю winrar'ом и переименовываю. Если всё аккуратно сделать, то никакой линух не понадобится. Старые версии winrar глючат с такими файлами, последняя - нет!!!
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    volodya



    Декомпилятор - суксь. Если их и в дизассемблированном не видно, то это могут быть локальные переменные.



    ЗЫ: Если надоест и не к спеху, то можешь кинуть в меня этим jar'ом - в субботу разберусь.
     
  8. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Quantum





    Проще один раз программку написать. А поскольку я как раз на работе сижу и делать нечего, то вот она :) (распаковывает jar и запаковывает обратно, написана на Java)





    [​IMG] 173174690__jarmultiname.zip
     
  9. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Посмотрел я из интереса на SmartCVS(сам я pluginoм к Eclipse пользуюсь и вполне доволен :)), в принципе выглядит все достаточно просто. Лицензионный файл читается в классе F, там же проверяется на правильность. Алгоритм на первый взгляд не сильно сложный, если надо, можно написать генератор лицензий.



    В классе g производятся сравнения более высокого уровня, в частности сравнения дат. Пропатчил у себя g, чтобы демо-лицензия не кончалась, пока вроде не ругается. По-настоящему работать с программой правда не пробовал, т.к. сейчас нет CVS сервера под рукой. Во вторник попробую.



    От простого перевода часов назад SmartCVS кстати тоже не защищена :)
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Stiver

    Рульная прога! В хозяйстве, несомненно, пригодится, а то сейчас все обфускаторами балуются, будто это их защитит :)



    На жабе всегда всё просто. Сейчас модно подписывать jar цифровой подписью, чтоб реверсер не смог его так просто пропатчить - это единственное, что хоть как-то помогает от взлома.
     
  11. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    В аттаче генератор лицензий для SmartCVS. Там было RSA-256 в качестве защиты.



    Quantum





    Только тогда еще и подлинность JVM проверять надо, иначе можно подсунуть свой ClassLoader и патчить на лету. Если хранить строки в зашифрованном виде и хотя бы часть функций(процентов 20) вызывать через reflection(чтобы классы в таблице констант не появлялись), то тоже можно здорово усложнить задачу.



    P.S. Модераторам: еще раз перечитал правила, но так и не понял, подпадают ли генераторы ключей и лицензий под определение wareza. Если да, удалите пожалуйста аттач.



    <font color="red]Удалено. А Правила для админов не действительны?</font><!--color-->
     
  12. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Stiver



    Неее :) Не буду :) Он и мне самому пригодится :)))
     
  13. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Stiver

    Конечно удалим :)