软件: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"));
}
代码:
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;
那么把!=的结果始终修改为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
。我们把这两个压入的常量都改成1就好了,也就是把iconst_0改成iconst_1。保存class,切换至虚拟机,把修改好的所有文件打包成zip,再改名为jar,双击运行,pro版本啦

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