首页
社区
课程
招聘
[旧帖] [原创]一款Java软件的爆破 0.00雪花
2011-3-27 10:15 2803

[旧帖] [原创]一款Java软件的爆破 0.00雪花

2011-3-27 10:15
2803
软件: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

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞6
打赏
分享
最新回复 (7)
雪    币: 435
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
tornodo 1 2011-3-27 10:37
2
0
说的不详细
雪    币: 416
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wrxinfo 2011-4-17 14:33
3
0
楼主是强人,最近也搞class文件,头都大了。
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MOJIAYI 2011-4-17 14:37
4
0
厉害~~~~~~~~~~
雪    币: 242
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pkptzx 2011-4-17 15:29
5
0
那要是class经过混淆呢?你反编译的话什么都看不到的这种情况怎么办呢?
雪    币: 265
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
omni 2011-5-1 09:56
6
0
楼主,写的不错,期待佳作
雪    币: 18
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yuxinfei 2011-5-2 05:57
7
0
保存class,切换至虚拟机,把修改好的所有文件打包成zip,再改名为jar,双击运行,pro版本
雪    币: 0
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chesion 2011-5-2 07:13
8
0
楼主继续努力
游客
登录 | 注册 方可回帖
返回