陕西省网络空间安全技术大赛安卓破解试题分析(五)
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就好了。
结果图:
wnagzihxain 发表于 2017-5-3 23:10
对于这种混淆,可以使用Jar2Dex工具转为Dex文件,然后使用JEB打开,使用JEB提供的修改变量名的功能修改为有 ...
谢谢指点。 myouter 发表于 2017-5-4 20:09
我也是拿eclipse做的。这个题eclipse就挺好的,工程小,也有重命名快捷键。
啊,没有注意到它有重命名快捷键。。谢谢~ 历害,看不懂,赞一个! 谢谢分享,赞一个! @Enigma_G 不好意思,又拉了一个人写。。。嘿嘿,不过五帖全了 对于这种混淆,可以使用Jar2Dex工具转为Dex文件,然后使用JEB打开,使用JEB提供的修改变量名的功能修改为有意义的变量名即可 分析的不错
非常感谢楼主的耐心分享! 感谢大佬分享!!! 只能膜拜大神了