Я тут все пытаюсь найти НОРМАЛЬНЫЙ cvs-клиент. Рассматривал: 1. командную строку cvs 2. tortoisecvs 3. wincvs ну, 1 - это не серьезно, 2 - подвисает в непонятных местах, хреново хендлит некоторые сложные случаи, о 3 всерьез говорить и вообще не стоит - за такие программы убивать надо словом, что-то приемлимое найти сложно попала мне на глаза недавно smartcvs - написана на жабе. кажется, наконец, нашел я что-то для себя управление из собственного ГУИ, а не интеграция в Windows Explorer как у tortoisecvs, но тоже ничего! ГУИ приятный, функциональность хорошая. Однако, платить за нее надо. Стал смотреть. Дошел до этого класса: smartcvs.jar/cm.class Декомпилировал jad: Код (Text): // Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov. // Jad home page: [url=http://www.kpdus.com/jad.html ]http://www.kpdus.com/jad.html [/url] // Decompiler options: packimports(3) // Source File Name: SourceFile package smartcvs; // Referenced classes of package smartcvs: // Mf public final class cm { public cm() { } public static final String a() { return Mf.d("Register"); } public static final String b() { return "Enter registration data."; } public static final String c() { return "Register SmartCVS"; } public static final String d() { return "To purchase a commercial Professional license, please visit\nhttp://www.smartcvs.com/purchase.html\n\n If you downloaded the license file, please enter the filename or choose it below."; } public static final String e() { return "License File"; } public static final String f() { return "Please enter or choose a valid license file!"; } public static final String g() { return "Invalid or corrupted license!\nPlease enter or choose a valid license file!"; } public static final String h() { return "An error occured, while the license file was copied!\n\nDetails: {0}"; } public static final String i() { return "Please restart SmartCVS to continue with the changed license."; } } Как видим - ничего интересного. И тут возникла проблемка. Стал быть, есть какой-то класс, который использует cm. И вызывается нечто вида cm.a(); НО! 1. если глянуть внутрь smartcvs.jar, то видно, что ребята очень хитро обозвали классы внутри. Например, есть cm, есть cM, есть Cm и есть CM.class. Под виндой, ессно, различия в регистре до лампочки, поэтому классы перезаписываются (о!, пока писал, придумал, что надо распаковать в линухе!) 2. ну и как искать этот cm.a()? Только полная распаковка под линухом и декомпиляция ВСЕХ файлов? с последующим поиском? мне идти в лоб или кто-то посоветует что-нибудь умнее?
Такс, проблему с именами решил. jar xf под линдузой рулит. теперь, видимо надо писать простенький перловый скрипт для вызова jad для каждого файлика...
Сгрузил линуховский jad (статически скомпиленый, бо динамический у мя на отсутствие либ ругается) и написал офигительно сложный скрипт: Код (Text): #!/usr/bin/perl while(<*.class>) { system("./jad $_"); } ща поглядим, что там получилось
Код (Text): grep 'cm' *.jad aO.jad: public void a(FQ fq, String s, CM cm) aO.jad: a.a(fq, s, cm); aP.jad: public aP(gE ge, dz dz, dz dz1, CM cm, cS cs, pa pa, dF df, aP.jad: nT.a(cm); aP.jad: a_smartcvs_CM_fld = cm; aP.jad: a_smartcvs_yx_fld = new yx(cm.b); Ch.jad: public final void a(FQ fq, String s, CM cm) cm.jad:public final class cm cm.jad: public cm() iH.jad: public final void a(FQ fq, String s, CM cm) iH.jad: a(file, cm.c, s); km.jad: a_smartcvs_uU_fld.a = "cmd.exe"; km.jad: a_smartcvs_uU_fld.b = "/c start cmd.exe"; MC.jad: public final void a(FQ fq, String s, CM cm) NO.jad:// H, Qb, cm, mL, NO.jad: a(cm.a()); NO.jad: b(cm.b()); Qb.jad:// Jk, OC, Ou, cm, Qb.jad: a_java_lang_String_fld = cm.c(); Qb.jad: a_smartcvs_pX_fld = new pX(cm.e(), lz); Qb.jad: (oc = OC.a()).a(new xR(cm.d()), 0, 0, 2); Qb.jad: a_smartcvs_IX_static_fld.d(cm.g(), ou); Qb.jad: throw new uk(a_smartcvs_pX_fld, cm.g()); Qb.jad: a_smartcvs_IX_static_fld.d(cm.f(), exception); Qb.jad: throw new uk(a_smartcvs_pX_fld, cm.f()); Qb.jad: zC.a(cm.i(), cm.c(), Fl.a(a_smartcvs_Dg_fld)); Qb.jad: zC.c(dQ.a(cm.h(), ioexception.getMessage()), cm.c(), Fl.a(a_smartcvs_Dg_fld)); rW.jad: public abstract void a(FQ fq, String s, CM cm) wD.jad: public final void a(FQ fq, String s, CM cm) вот уроды, мля... анализировать сложновато.
Типичная для Proguard обфускация. Такие файлы лучше не декомпилировать, а сразу дизассемблировать идой и править JavaByte'ом. В жабьих бинарниках (класс-файлах), как правило, сравнительно мало кода и их легко реверсить на уровне ассемблера. А я их по одному достаю winrar'ом и переименовываю. Если всё аккуратно сделать, то никакой линух не понадобится. Старые версии winrar глючат с такими файлами, последняя - нет!!!
volodya Декомпилятор - суксь. Если их и в дизассемблированном не видно, то это могут быть локальные переменные. ЗЫ: Если надоест и не к спеху, то можешь кинуть в меня этим jar'ом - в субботу разберусь.
Quantum Проще один раз программку написать. А поскольку я как раз на работе сижу и делать нечего, то вот она (распаковывает jar и запаковывает обратно, написана на Java) 173174690__jarmultiname.zip
Посмотрел я из интереса на SmartCVS(сам я pluginoм к Eclipse пользуюсь и вполне доволен ), в принципе выглядит все достаточно просто. Лицензионный файл читается в классе F, там же проверяется на правильность. Алгоритм на первый взгляд не сильно сложный, если надо, можно написать генератор лицензий. В классе g производятся сравнения более высокого уровня, в частности сравнения дат. Пропатчил у себя g, чтобы демо-лицензия не кончалась, пока вроде не ругается. По-настоящему работать с программой правда не пробовал, т.к. сейчас нет CVS сервера под рукой. Во вторник попробую. От простого перевода часов назад SmartCVS кстати тоже не защищена
Stiver Рульная прога! В хозяйстве, несомненно, пригодится, а то сейчас все обфускаторами балуются, будто это их защитит На жабе всегда всё просто. Сейчас модно подписывать jar цифровой подписью, чтоб реверсер не смог его так просто пропатчить - это единственное, что хоть как-то помогает от взлома.
В аттаче генератор лицензий для SmartCVS. Там было RSA-256 в качестве защиты. Quantum Только тогда еще и подлинность JVM проверять надо, иначе можно подсунуть свой ClassLoader и патчить на лету. Если хранить строки в зашифрованном виде и хотя бы часть функций(процентов 20) вызывать через reflection(чтобы классы в таблице констант не появлялись), то тоже можно здорово усложнить задачу. P.S. Модераторам: еще раз перечитал правила, но так и не понял, подпадают ли генераторы ключей и лицензий под определение wareza. Если да, удалите пожалуйста аттач. <font color="red]Удалено. А Правила для админов не действительны?</font><!--color-->