lumou 发表于 2017-5-3 18:39

陕西省网络空间安全技术大赛安卓破解试题分析(五)

ok, 我来接棒第五题。
先上题目链接:http://pan.baidu.com/s/1slM1hCT密码:twfq

现在开始解题:
文件是jar格式,我们用jd-gui来打开,如图:

我们可以看到,代码被混淆了。但是好在代码量不是很多,而且混淆是有一定规律的,所以我的做法是直接复制代码到notepad++,然后用替换来解决这些看上去不那么协调的东西。(如若诸位有更好的去混淆的法子,请不吝赐教。)

这样看上去比较好看一点了。然后我用的还是比较笨的法子,我在eclipse里新建了一个java项目,把这四个类都复制进去。从刚刚那个截图中我们也可以看到,它是一个java swing。所以运行的结果是这样的:

其实能运行了,解决问题也就不远了,无非就是看看程序的执行过程,让它吐出key。既然是写帖子,我就写全套吧。
我们先来看UnitTests里面的main函数:
public static void main(String[] args)
{
    JFrame frame = new JFrame("Key check");
    JButton button = new JButton("Click to activate");
   
    button.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent ae)
      {
      String str = JOptionPane.showInputDialog(null, "Enter the product key: ",
          "xxxx-xxxx-xxxx-xxxx", 1);
      if (VV.BB(str)) {
          JOptionPane.showMessageDialog(null, "Well done that was the correct key",
            "Key check", 1);
      } else {
          JOptionPane.showMessageDialog(null, "               Sorry that was the incorrect key \nRemember it is a crime to use software without paying for it",
            "Key check", 1);
      }
      }
    });
很清晰,主要是判断VV.BB(str)是否为true。
再来看VV.BB(String str)是做什么的
public static boolean BB(String ss)
{
    if ((ss != null) && (ss.length() == 19))
    {
      s1 = System.arraycopy(s2, 0, s1, 5, 5);
      
      boolean keyGuessWrong = true;
      int i = 0;
      for (int x = 0; x < 4; x++)
      {
      for (int y = 0; y < 4; y++) {
          if (ss.charAt(i + y) != s1.charAt(Start.VV(i + y, s1))) {
            keyGuessWrong = false;
          }
      }
      i += 5;
      }
      return keyGuessWrong;
    }
    return false;
}

里面有一个全局的s1,s2
static String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static String s2 = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
但是并没有用。用不上它们,因为System.arraycopy这个函数直接调用Start.main(null)
public static String arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
{
    return Start.main(null);
}
再来看Start.main(null):
public static String main(String... args)
{
    String x = "";
    for (int i : "v辤êê¬ÆÆêvì¤ê2ê2àΤ¨¸¬".toCharArray()) {
      x = x + (char)((i >> 1) + 15);
    }
    return x;
}
这一串乱码也不知道是什么,直接把这个函数抽出来运行好了,得到下面的字符串:

也就是说,s1=“JsnatterrtJuaththovacke”
用s1=“JsnatterrtJuaththovacke”替换s1 = System.arraycopy(s2, 0, s1, 5, 5)再把VV.BB以及相关的函数抽出来,再在验证key处输出key,最后再运行就可以了。

这里要说的是,因为前面有判断说字符串长度需要19,所以在运行BB()的时候也要写长度为19的字符串,不然不能吐出key的。最后密码就是:sssntrtktceaakJr,用它给的格式写进去sssn-trtk-tcea-akJr就好了。
结果图:

lumou 发表于 2017-5-4 10:48

wnagzihxain 发表于 2017-5-3 23:10
对于这种混淆,可以使用Jar2Dex工具转为Dex文件,然后使用JEB打开,使用JEB提供的修改变量名的功能修改为有 ...

谢谢指点。

lumou 发表于 2017-5-4 20:45

myouter 发表于 2017-5-4 20:09
我也是拿eclipse做的。这个题eclipse就挺好的,工程小,也有重命名快捷键。

啊,没有注意到它有重命名快捷键。。谢谢~

gunxsword 发表于 2017-5-3 19:13

历害,看不懂,赞一个!

wanghai123 发表于 2017-5-3 20:11

马锦慧 发表于 2017-5-3 20:19

谢谢分享,赞一个!

挥汗如雨 发表于 2017-5-3 22:10

@Enigma_G   不好意思,又拉了一个人写。。。嘿嘿,不过五帖全了

wnagzihxain 发表于 2017-5-3 23:10

对于这种混淆,可以使用Jar2Dex工具转为Dex文件,然后使用JEB打开,使用JEB提供的修改变量名的功能修改为有意义的变量名即可

海蓝浪花 发表于 2017-5-3 23:49

分析的不错

chenjingyes 发表于 2017-5-4 00:10

非常感谢楼主的耐心分享!

真爱贤 发表于 2017-5-4 08:08

感谢大佬分享!!!

qingliang87 发表于 2017-5-4 10:29

只能膜拜大神了
页: [1] 2 3 4
查看完整版本: 陕西省网络空间安全技术大赛安卓破解试题分析(五)