我很高兴向大家知会一声,scioworks Camino的基于Struts的Web Application开发工具已经可以破解了。因为Struts不错,我才想这样,目的只有一个,用来测试检验Struts。 
这个工具使用注册码,并使用注册码进行日期判断。让我有点恼火的是,程序会想一个地址发送UDP包,不管怎样,我不希望这样的事情发生。 
我想这个工具的破解有两种方式, 
1, 认真钻研其算法,然后给出一个KeyGen程序。这种方式对程序本身不会有什么影响,但是研读算法比较费时间。 
2, 改写程序控制,然后给出一个替代的class文件。这种方式因为改写了程序控制流程,需要特别小心,不小心的话,原来的程序就会崩溃。 
这两种方式各有千秋,取决于你的兴趣所在。因为这个工具经过了代码优化以及别的处理,所以,改写代码稍嫌麻烦。 
要做改写代码方式破解的话,你需要一个反编译工具,我推荐你使用jshrink,因为jad好像已经不再做下去了。(别说你还有好多反编译工具,错,大多使用jad Engine。)其次你需要了解一点java虚拟机规范,没有也行,那么你需要熟悉java语言,或者加上一些windows汇编语言知识。 
我没有更多耐心所更多的东西。给出源代码,你爱谁谁去。 
// Main.java; class file size 15569 bytes 
package scioworks.camino; 
/* import BindingSchemaLoader; import CaminoApp; import CaminoModel; import Config; import ContextPathUtil; import ExpressException; import FileReadWriteException; import InvalidResourceException; import Main$CMon; import Main$SMon; import Navigatable; import ParseException; import StrutsSubApp; */ import com.jxml.quick.QDoc; import scioworks.camino.event.ProjectReadyEvent; import scioworks.camino.gui.LcPanel; import scioworks.camino.io.DirtyStatusLookup; import java.awt.Color; import java.awt.Frame; import java.io.File; import java.io.IOException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.StringTokenizer; import java.util.TreeMap; import javax.swing.JOptionPane; import scioworks.camino.prjModel.CaminoProject; import scioworks.camino.prjModel.SubApp; import scioworks.aspen.BaseDialog; import scioworks.aspen.HelpManager; import scioworks.aspen.SwingUtil; import scioworks.aspen.progress.ProgressListener; import scioworks.common.io.FileUtil; import scioworks.common.io.filemonitor.FileMonitor; import scioworks.common.logging.Logger; import scioworks.common.logging.LoggerFactory; import scioworks.common.message.Message; import scioworks.common.message.MessageCategory; import scioworks.util.crypto.TransformerRev; import scioworks.camino.strutsModel.Action; import scioworks.camino.strutsModel.StrutsConfig; import scioworks.camino.webdd.Servlet; import scioworks.camino.webdd.ServletMapping; import scioworks.camino.webdd.WebApp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.InetAddress; 
 class Main implements   CaminoModel {   final static private String _$159506 = "VGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW52YWxpZA==";   final static private String _$115780 = "Q2FtaW5vIExpY2Vuc2UgSW5mbw==";   final static private String _$159525 = "VHJpYWwgbGljZW5zZSBleHBpcmVzIGluIHswfSBkYXlz";   final static private String _$159544 = "WW91ciB0cmlhbCBsaWNlbnNlIGhhcyBleHBpcmVkLiBWaXNpdCBodHRwOi8vd3d3LnNjaW93b3Jrcy5jb20gdG8gcHVyY2hhc2UgYSBsaWNlbnNlZCBjb3B5IG9mIFNjaW93b3JrcyBDYW1pbm8=";   final static private String _$159561 = "VW5yZWdpc3RlcmVkIFRyaWFsIENvcHk=";   final static private String _$159583 = "usitPzelhkTNlTcaSpAIIiuaalidM";   final static private String _$159605 = "U3RhbmRhcmQ=";   final static private String _$159621 = "RW50ZXJwcmlzZQ==";   static private scioworks.common.logging.Logger _$3187 = scioworks.common.logging.LoggerFactory.getLogger(Main.class);   // scioworks.common.logging.LoggerFactory.getLogger((class$scioworks$camino$Main == null) ? (class$scioworks$camino$Main = Main.class$("scioworks.camino.Main")) : class$scioworks$camino$Main);   private int _$159639;   private String _$159651;   //private Main$CMon _$159668;   //private Main$SMon _$159676;   private int _$159680;   private String _$59575;   private long _$159700;   private String _$59588;   private String _$115870;   private CaminoProject _$62680;   private WebApp _$126484;   private java.util.Map _$159711; 
   public Main() throws InvalidResourceException {     _$159639 = 12345;     _$159651 = "230.10.10.11";     //_$159668 = null;     //_$159676 = null;     _$159680 = 1;     _$59575 = "";     _$159700 = -1;     _$59588 = "";     _$115870 = "";     _$62680 = null;     _$126484 = null;     _$159711 = new java.util.TreeMap();     getLc(javax.swing.JOptionPane.getRootFrame(), true);     _$3187.info("License Count = ".concat(String.valueOf(_$159680)));     _$3187.info("Serial Number = ".concat(_$59575));     _$115870 = _$159725();     //_$159744();     BindingSchemaLoader.getProjectBindingSchema();     BindingSchemaLoader.getStrutsConfigBindingSchema();     BindingSchemaLoader.getWebDDBindingSchema();     scioworks.aspen.HelpManager.instance();   } 
  public java.util.List findGlobalForwardsByTarget(Navigatable n1) {     ArrayList a2;     Iterator i3;     StrutsSubApp s4;     List l5;     a2 = new java.util.ArrayList();     i3 = _$159711.values().iterator();     while (i3.hasNext()) {       s4 = (StrutsSubApp) i3.next();       l5 = s4.getStrutsConfig().findGlobalForwardsByTarget(n1);       a2.addAll(l5);     }     return a2;   } 
  public Navigatable findNavigatable(String s1) {     Iterator i2;     StrutsSubApp s3 = null;     i2 = _$159711.values().iterator();     {       do {         if (i2.hasNext()) {           s3 = (StrutsSubApp) i2.next();         }       }       while (s3.isInSubApp(s1) == false);       return s3.findSubAppNavigatable(s3.makeSubAppRelative(s1));     }     //return null;   } 
  public Action findAction(String s1) {     Iterator i2;     StrutsSubApp s3 = null;     i2 = _$159711.values().iterator();     {       do {         if (i2.hasNext()) {           s3 = (StrutsSubApp) i2.next();         }       }       while (s3.isInSubApp(s1) == false);       return s3.findSubAppAction(ContextPathUtil.makeSubAppRelative(s3.getPrefix(), s1));     }     //return null;   } 
  public CaminoProject getProject() {     return _$62680;   } 
  public WebApp getWebApp() {     return _$126484;   } 
  public StrutsSubApp getSubApp(String s1) {     return (StrutsSubApp) _$159711.get(s1);   } 
  public java.util.Set getSubAppPrefixes() {     return _$159711.keySet();   } 
  java.util.Map getAllSubApps() {     return _$159711;   } 
  public void initNewProject(CaminoProject c1, scioworks.aspen.progress.ProgressListener p2) throws InvalidResourceException, ParseException, FileReadWriteException {     _$62680 = c1;     initProject(p2);   } 
  public void initProject(scioworks.aspen.progress.ProgressListener p1) throws InvalidResourceException, ParseException, FileReadWriteException {     List l2;     Iterator i3;     String s4;     String s5;     _$62680.init(this, p1);     _$159775(p1);     verifyWebXml(p1);     _$159711.clear();     l2 = _$126484.getSubAppPrefixes();     i3 = l2.iterator();     while (i3.hasNext()) {       s4 = (String) i3.next();       if (_$62680.getSubApp(s4) != null) {         _$159796(s4, p1);         continue;       }       s5 = java.text.MessageFormat.format("SubApp \"{0}\" is not configured correctly in the project. Please correct it in Project Properties and reload the project.", new String []{s4});       p1.showError(scioworks.common.message.MessageCategory.getCategory("Main"), s5);     }     ProjectReadyEvent.fire(this, true);   } 
  private void _$159796(String s1, scioworks.aspen.progress.ProgressListener p2) throws InvalidResourceException, ParseException, FileReadWriteException {     StrutsSubApp s3;     s3 = new StrutsSubApp(this, s1);     _$159711.put(s1, s3);     s3.load(p2);   } 
  public void loadProject(String s1, scioworks.aspen.progress.ProgressListener p2) throws InvalidResourceException, ParseException, FileReadWriteException {     p2.setDescription("Loading project...");     p2.notifyProgress(s1, 0);     _$62680 = CaminoProject.load(s1, p2);     initProject(p2);   } 
  private void _$159775(scioworks.aspen.progress.ProgressListener p1) throws InvalidResourceException, ParseException, FileReadWriteException {     String s2;     File f3;     s2 = _$62680.getAbsoluteWebAppConfig();   L164:     {       if (s2 != null) {         f3 = scioworks.common.io.FileUtil.getAbsolutePath(_$62680.getFile().getParentFile(), s2);         if (f3.isFile()) {           p1.setDescription("Loading web.xml...");           p1.notifyProgress(String.valueOf(new StringBuffer("web.xml '").append(s2).append("'")), 0);           _$126484 = WebApp.load(_$62680, f3);           break L164;         }         _$3187.error(String.valueOf(new StringBuffer("web.xml '").append(s2).append("' not found")));         throw new FileReadWriteException("Web Deployment Descriptor", s2, 0, null);       }       _$3187.error("web.xml filename is empty.");       throw new FileReadWriteException("Web Deployment Descriptor", s2, 0, null);     }   } 
  public void clearProject() {     CaminoApp.getInstance().getDirtyStatusLookup().clearDirtyAll();     CaminoApp.getInstance().resetModelEventBroker();     scioworks.common.io.filemonitor.FileMonitor.getInstance().unregisterAll();     _$62680 = null;     _$126484 = null;     _$159711.clear();     ProjectReadyEvent.fire(this, false);   } 
  public void saveProject() throws ParseException, FileReadWriteException, ExpressException, InvalidResourceException {     Iterator i1;     StrutsSubApp s2;     _$126484.save();     _$62680.save();     i1 = _$159711.values().iterator();     while (i1.hasNext()) {       s2 = (StrutsSubApp) i1.next();       s2.save();     }   } 
  public void refreshProject(scioworks.aspen.progress.ProgressListener p1) {     verifyWebXml(p1);   } 
  public void verifyWebXml(scioworks.aspen.progress.ProgressListener p1) {     scioworks.common.message.Message o2;     ServletMapping s3;     String s5;     o2 = null;     if (_$126484.findServlet(_$62680.getActionServletName()) == null) {       _$3187.warn(String.valueOf(new StringBuffer("ActionServlert ").append(_$62680.getActionServletName()).append(" not found")));       o2 = _$159827(o2, p1);       p1.showWarning(scioworks.common.message.MessageCategory.getCategory("Main"), String.valueOf(new StringBuffer("ActionServlet '").append(_$62680.getActionServletName()).append("' not found")), o2);     }     s3 = _$126484.findServletMapping(_$62680.getActionServletName());     if (s3 == null) {       _$3187.warn(String.valueOf(new StringBuffer("Servlet mapping for ").append(_$62680.getActionServletName()).append(" not found")));       o2 = _$159827(o2, p1);       p1.showWarning(scioworks.common.message.MessageCategory.getCategory("Main"), String.valueOf(new StringBuffer("Servlet mapping for servlet '").append(_$62680.getActionServletName()).append("' not found. Assume URI pattern for Actions = '").append("*.do").append("'.")), o2);     }     if ((s3 != null) && ((s3.getUrlExtension() == null) && (s3.getUrlPath() == null))) {       o2 = _$159827(o2, p1);       Object l4 = (s3.getRawUrlPattern() == null) ? "<null>" : s3.getRawUrlPattern();       s5 = java.text.MessageFormat.format("URL Pattern \"{0}\" of the ActionServlet is invalid.", new Object[] {l4}        );       _$3187.warn(s5);       p1.showError(scioworks.common.message.MessageCategory.getCategory("Main"), s5, o2);     }   } 
  public String getTitleMessage() {     StringBuffer s1;     s1 = new StringBuffer("Scioworks Camino ");     s1.append(Config.getVersion());     /*     if ((_$159700 - ((long) 0)) != 0) {       s1.append(" - ");       s1.append(scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("VW5yZWdpc3RlcmVkIFRyaWFsIENvcHk="));       return s1.toString();     }     */     s1.append("---破解 xy@2002-11-22");     return s1.toString();   } 
  public int monitorStatus() {     int i1 = 1;     //i1 = _$159676.gc();     //_$159676.slap();     /*     if (i1 >= _$159680) {       return -(_$159680);     }     return _$159680;     */     return i1;   } 
  public int lp() {     return _$159639;   } 
  public String lg() {     return _$159651;   } 
  public int numOfLc() {     return _$159680;   } 
  public String sn() {     return _$59575;   } 
  String sk() {     return _$115870;   } 
  public String ed(boolean b1) {     if (_$59588.equals("E")) {       if (b1) {         return scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("RW50ZXJwcmlzZQ==");       }       return _$59588;     }     if (b1) {       return scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("U3RhbmRhcmQ=");     }     return "S";   } 
  public boolean getLc(java.awt.Frame f1, boolean b2) {     int i3;     int i4;     java.util.HashMap o5;     String s6;     String s7;     String s8;     int i7;     LcPanel l10;     BaseDialog b11 = null;     int i12;     i3 = 0;     i4 = 1;     o5 = null;     s6 = Config.getLcKey();     s7 = Config.getLcCompany();     s8 = Config.getLcUser();     {       for (int i=0; i<1; i++) {         if (i3 == 0) {           if ((b2) && (_$159937(s8, s7, s6))) {             i3 = 1;             Config.setLcUser(s8);             Config.setLcCompany(s7);             Config.setLcKey(s6);             Config.saveLicense();             continue;           }           i7 = 1;           o5 = new java.util.HashMap();           o5.put("k", s6);           o5.put("u", s8);           o5.put("c", s7);           l10 = new scioworks.camino.gui.LcPanel();           l10.setModel(o5);           b11 = new scioworks.aspen.BaseDialog(f1, scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("Q2FtaW5vIExpY2Vuc2UgSW5mbw=="), true, l10, l10, true);           try {             if (i4 != 0) {               i4 = 0;               l10.setMessage(scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("Q2FtaW5vIExpY2Vuc2UgSW5mbw=="),Color.black);             }             else {               l10.setMessage(scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("VGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW52YWxpZA=="), Color.red);             }             b11.show();             if (b11.isOk()) {               o5 = (java.util.HashMap) l10.getModel();               s8 = o5.get("u").toString();               s7 = o5.get("c").toString();               s6 = o5.get("k").toString();             }             else {               return true;             }             continue;           }           finally {             break;           }         }       }       //l14 = throw l13;       scioworks.aspen.SwingUtil.dispose(b11);       return true;     }     //return true;   } 
  private String _$159954() {     int[] i1;     char[] c2;     int i3;     i1 = new int[] {6,10,24,18,13,28,21,20,5,2,11,23,16,19,4,26,8,0,3,14,1,7,12,22,9,27,17,15,25};     c2 = new char[29];     i3 = 0;     while (i3 < "usitPzelhkTNlTcaSpAIIiuaalidM".length()) {       c2[i1[i3]] = "usitPzelhkTNlTcaSpAIIiuaalidM".charAt(i3);       i3++;     }     return new String(c2).concat(Config.getRelease());   } 
  private boolean _$159937(String s1, String s2, String s3) {     String s4;     String o5;     String o6;     String o7;     String o8;     String o9;     StringTokenizer s10;     int i12;     boolean b1;     s4 = scioworks.util.crypto.TransformerRev.getInstance().decrypt(s3, _$159954());     if (s4 == null) {       return false;     }     o5 = null;     o6 = null;     o7 = null;     o8 = null;     o9 = null;     s10 = new java.util.StringTokenizer(s4, "|");     try {       o5 = s10.nextToken();       o6 = s10.nextToken();       o8 = s10.nextToken();       o7 = s10.nextToken();       o9 = s10.nextToken();     }     catch (NoSuchElementException n11) { 
      return true;     }     try {       _$159680 = Integer.parseInt(o6);     }     catch (NumberFormatException n2) {       _$159680 = 1;     }     try {       _$59575 = String.valueOf(new StringBuffer(s3.substring(8, 12)).append("-").append(o8).append("-").append(s3.substring(0, 4)));     }     catch (IndexOutOfBoundsException i1) { 
      return true;     }     try {       _$159700 = Long.parseLong(o7);     }     catch (NumberFormatException n1) {       _$159700 = -1;     }     _$59588 = o9;     b1 = scioworks.util.crypto.TransformerRev.getInstance().compare(o5, s1, s2);     if ((b1) && ((_$159680 >= 0) && ((_$159700 - ((long) 0)) >= 0))) {       return true;     }     return true;   } 
  /*   private void _$159744() {     double d1;     long l2;     Object[] o3;     if ((_$159700 - ((long) 0)) == 0) {       return;     }     d1 = (double) ((_$159700 - System.currentTimeMillis()) / ((long) 86400000));     l2 = (long) Math.floor(d1);     if (((l2 - ((long) 0)) >= 0) && ((l2 - ((long) 15)) <= 0)) {       o3 = {new Long(l2 + ((long) 1))};       javax.swing.JOptionPane.showMessageDialog(javax.swing.JOptionPane.getRootFrame(), java.text.MessageFormat.format(scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("VHJpYWwgbGljZW5zZSBleHBpcmVzIGluIHswfSBkYXlz"), o3), scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("Q2FtaW5vIExpY2Vuc2UgSW5mbw=="), 1);     }     else {       javax.swing.JOptionPane.showMessageDialog(javax.swing.JOptionPane.getRootFrame(), scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("WW91ciB0cmlhbCBsaWNlbnNlIGhhcyBleHBpcmVkLiBWaXNpdCBodHRwOi8vd3d3LnNjaW93b3Jrcy5jb20gdG8gcHVyY2hhc2UgYSBsaWNlbnNlZCBjb3B5IG9mIFNjaW93b3JrcyBDYW1pbm8="), scioworks.util.crypto.TransformerRev.getInstance().simpleDecode("Q2FtaW5vIExpY2Vuc2UgSW5mbw=="), 1);       //System.exit(1);     }   }   */   private String _$159725() {     String s1;     int i2;     InterruptedException i3;     IOException i1;     s1 = Long.toString(System.currentTimeMillis());     i2 = _$159639 + 1;     /*     try {       _$159676 = new Main$SMon(this, i2);       _$159676.start();       _$159668 = new Main$CMon(this, i2, Config.getLcKey(), s1, _$159639, _$159651);       _$159668.start();       try {         Thread.sleep(500);       }       catch (i3) {       }     }     catch (i1) {     }     */     return s1;   } 
  private scioworks.common.message.Message _$159827(scioworks.common.message.Message m1, scioworks.aspen.progress.ProgressListener p2) {     Message m2 = null;     if (m1 == null) {       m2 = p2.showWarning(scioworks.common.message.MessageCategory.getCategory("Main"), "Encounter problem parsing web.xml. Please correct the problem via the menu item Project|Web.xml Properties");     }     return m2;   } 
  static scioworks.common.logging.Logger access$0() {     return _$3187;   } 
} 
/* class Main$CMon extends Thread {   private boolean _$160186;   private int _$160198;   private String _$160211;   private String _$115870;   private int _$159639;   private String _$159651; 
  public Main$CMon(Main m1, int i2, String s3, String s4, int i5, String s6) throws java.io.IOException {     _$160186 = true;     _$160186 = true;     _$160198 = i2;     _$160211 = s3;     _$115870 = s4;     _$159639 = i5;     _$159651 = s6;   } 
  public void run() {     java.net.MulticastSocket o1;     InetAddress i2;     int i3;     java.net.DatagramSocket o4;     byte[] b5;     DatagramPacket d6;     String s7;     String s8;     String s9;     InetAddress i10;     DatagramPacket d5;     IOException i7;     IOException i13;     o1 = null;     try {       o1 = new java.net.MulticastSocket(_$159639);       i2 = java.net.InetAddress.getByName(_$159651);       o1.joinGroup(i2);       i3 = _$160211.length();       {         for (;;) {           if (_$160186) {             o4 = null;             try {               b5 = new byte[256];               d6 = new java.net.DatagramPacket(b5, b5.length);               o1.receive(d6);               s7 = new String(d6.getData());               s8 = s7.substring(0, i3);               if (s8.equals(_$160211) == false) {                 continue;               }               s9 = s7.substring(i3).trim();               if (s9.equals(_$115870)) {                 continue;               }               if (Main.access$0().isDebug()) {                 Main.access$0().debug("Received req: ".concat(d6.getAddress().getHostAddress()));               }               i10 = d6.getAddress();               d5 = new java.net.DatagramPacket(b5, b5.length, i10, _$160198);               o4 = new java.net.DatagramSocket();               o4.send(d5);             }             continue;             catch (i7) {               _$160186 = false;             }           }         }         finally {           if (o4 != null) {             o4.close();           }         }       }       o1.leaveGroup(i2);     }     catch (i13) {     }     finally {       if (o1 != null) {         o1.close();       }     }   } } class Main$SMon extends Thread {   private boolean _$160186;   private int _$160198;   private int _$59562; 
  public Main$SMon(Main m1, int i2) throws java.io.IOException {     _$160186 = true;     _$160198 = i2;     _$59562 = 0;   } 
  public int gc() {     return _$59562;   } 
  public void slap() {     InetAddress i1;     byte[] b2;     DatagramPacket d3;     DatagramSocket d4;     IOException i4;     _$160186 = false;     try {       i1 = java.net.InetAddress.getLocalHost();       b2 = new byte[256];       b2 = "KoL".getBytes();       d3 = new java.net.DatagramPacket(b2, b2.length, i1, _$160198);       d4 = new java.net.DatagramSocket();       d4.send(d3);     }     catch (i4) {       Main.access$0().warn("s/rmon not available");     }   } 
  public void run() {     java.net.DatagramSocket o1;     byte[] b2;     DatagramPacket d3;     DatagramPacket d1;     IOException i4;     o1 = null;     try {       o1 = new java.net.DatagramSocket(_$160198);       b2 = new byte[256];       d3 = new java.net.DatagramPacket(b2, b2.length);       d1 = new java.net.DatagramPacket(b2, b2.length);       while (_$160186) {         l5 = this;         synchronized (l5) {           o1.receive(d1);           if (Main.access$0().isDebug()) {             Main.access$0().debug("Ack: ".concat(d1.getAddress().getHostAddress()));           }           _$59562 = _$59562 + 1;         }         continue;       }     }     catch (i4) {       i4.printStackTrace();     }     finally {       if (o1 != null) {         o1.close();       }     }   } } 
*/
   
 
  |