软件:Shape Collage

Shape Collage是一款免费的图片拼贴制作工具,可以轻松制作任意形状的图片拼图,如矩形、心形、圆形、字母形状,甚至绘制自定义形状。

但是免费版会有水印。而pro版本则没有,而且可能保存工程为PSD格式文件,并且开放了许多功能。

首先使用 jd-gui 进行反编译,通过观察可以发现这个jar被ProGuard保护过了,典型的就是超过了26个class,然后文件通过改变文件名大小写的方式存在。所以在Windows上是不能直接解压出来的,出动虚拟机,开上ubuntu进行打包。

因为pro版本会在标题显示一个pro,所以直接搜索即可。

在ca\vincentcheung\shapecollage\ShapeCollageGUI.class文件中将能找到这么一段。

代码:
  private void H()
  {
    if (this.jdField_f_of_type_Boolean)
    {
      setTitle("Shape Collage Pro 2.5.3");
      this.jdField_p_of_type_JavaxSwingJMenuItem.setText(jdField_a_of_type_JavaUtilResourceBundle.getString("Open_Project"));
      this.jdField_x_of_type_JavaxSwingJMenuItem.setText(jdField_a_of_type_JavaUtilResourceBundle.getString("Save_Project"));
      this.jdField_a_of_type_JavaUtilHashtable.put(this.jdField_p_of_type_JavaxSwingJMenuItem, jdField_a_of_type_JavaUtilResourceBundle.getString("Status_menu_open_project"));
      this.jdField_a_of_type_JavaUtilHashtable.put(this.jdField_x_of_type_JavaxSwingJMenuItem, jdField_a_of_type_JavaUtilResourceBundle.getString("Status_menu_save_project"));
      this.jdField_p_of_type_JavaxSwingJMenuItem.setEnabled(true);
      this.jdField_x_of_type_JavaxSwingJMenuItem.setEnabled(true);
      this.jdField_z_of_type_JavaxSwingJMenuItem.setText(jdField_a_of_type_JavaUtilResourceBundle.getString("Registration_Info"));
      this.jdField_a_of_type_JavaUtilHashtable.put(this.jdField_z_of_type_JavaxSwingJMenuItem, this.jdField_z_of_type_JavaxSwingJMenuItem.getText());
      this.jdField_b_of_type_JavaxSwingJDialog.setTitle(jdField_a_of_type_JavaUtilResourceBundle.getString("Shape_Collage_Pro_Registration_Info"));
      return;
    }
    setTitle("Shape Collage 2.5.3");
    this.jdField_p_of_type_JavaxSwingJMenuItem.setText("(Pro) " + jdField_a_of_type_JavaUtilResourceBundle.getString("Open_Project"));
    this.jdField_x_of_type_JavaxSwingJMenuItem.setText("(Pro) " + jdField_a_of_type_JavaUtilResourceBundle.getString("Save_Project"));
    this.jdField_a_of_type_JavaUtilHashtable.put(this.jdField_p_of_type_JavaxSwingJMenuItem, jdField_a_of_type_JavaUtilResourceBundle.getString("Status_menu_open_project") + " (" + jdField_a_of_type_JavaUtilResourceBundle.getString("Upgrade_To_Pro") + ")");
    this.jdField_a_of_type_JavaUtilHashtable.put(this.jdField_x_of_type_JavaxSwingJMenuItem, jdField_a_of_type_JavaUtilResourceBundle.getString("Status_menu_save_project") + " (" + jdField_a_of_type_JavaUtilResourceBundle.getString("Upgrade_To_Pro") + ")");
    this.jdField_p_of_type_JavaxSwingJMenuItem.setEnabled(false);
    this.jdField_x_of_type_JavaxSwingJMenuItem.setEnabled(false);
    this.jdField_z_of_type_JavaxSwingJMenuItem.setText(jdField_a_of_type_JavaUtilResourceBundle.getString("Upgrade_To_Pro"));
    this.jdField_a_of_type_JavaUtilHashtable.put(this.jdField_z_of_type_JavaxSwingJMenuItem, this.jdField_z_of_type_JavaxSwingJMenuItem.getText());
    this.jdField_b_of_type_JavaxSwingJDialog.setTitle(jdField_a_of_type_JavaUtilResourceBundle.getString("Upgrade_To_Pro"));
    this.jdField_h_of_type_JavaxSwingJTextField.setText(jdField_a_of_type_JavaUtilResourceBundle.getString("Unregistered"));
  }
显然this.jdField_f_of_type_Boolean就是那个关键变量了,我们寻找一下这个变量是在哪里初始化的。可以找到:
代码:
    localObject5 = ch.a("SC25", (String)localObject5);//这行贴出来是为了方便搜索
    ((ShapeCollageGUI)localObject2).jdField_f_of_type_Boolean = (localObject5 != null);
    ((ShapeCollageGUI)localObject2).H();//这行代码无视
    this.jdField_f_of_type_Boolean = ((ShapeCollageGUI)localObject2).jdField_f_of_type_Boolean;
于是你懂的,其实就是 this.jdField_f_of_type_Boolean = (localObject5 != null);

那么把!=的结果始终修改为true就行了。使用 JBE 打开这个class文件,选择init函数。搜索SC25,于是发现:
代码:
2581 ldc_w "SC25"
2582 aload_3
2583 invokestatic ch/a(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
2584 astore_3
2585 aload_2
2586 aload_3
2587 ifnull 2590
2588 iconst_1
2589 goto 2591
2590 iconst_0
2591 putfield ca/vincentcheung/shapecollage/ShapeCollageGUI/f Z
如果长期看Java字节码的话,是能够明白一些代码意义的。比如这里的ifnull 2590就是说,如果是null,则跳转到2590行,不是null则执行下一行,最后goto,其实和汇编的JZ差不多吧。我们把这两个压入的常量都改成1就好了,也就是把iconst_0改成iconst_1。

保存class,切换至虚拟机,把修改好的所有文件打包成zip,再改名为jar,双击运行,pro版本啦


本文需要的一些工具
jd-gui:http://u.115.com/file/f0fea0394c
jbe:http://u.115.com/file/f06aac67f0