在这里讲述的其实是java反编译,主要是因为我是反编译人家的app源码入手的,就自然的挂起了羊头。
众所周知,通过dex2jar能将Android app的dex解析为class文件jar包,然后通过jd等反编译工具查看源代码,貌似很容易就能对别人的劳动成果拿来主义,可果真如此理想么? 本着实事求是的原则,自己亲手试了下,结果自然是杯具的。
以下是反编译出的结果,我们简单的以一个方法为例:
public double getCORRLN(double[] paramArrayOfDouble)
{
double d1 = 0.0D;
double d2 = 0.0D;
double d3 = 0.0D;
double d4 = 0.0D;
double[] arrayOfDouble1 = new double[this.grayLevel];
double[] arrayOfDouble2 = new double[this.grayLevel];
int i = 0;
int k;
label42: int m;
if (i >= this.grayLevel)
{
k = 0;
if (k < 32)
break label171;
m = 0;
if (m < 32)
break label201;
}
for (int i1 = 0; ; i1++)
{
if (i1 >= 32)
{
if ((d3 != 0.0D) && (d4 != 0.0D))
this.CORRLN = ((this.CORRLN - d1 * d2) / Math.sqrt(d3 * d4));
return this.CORRLN;
for (int j = 0; ; j++)
{
if (j >= this.grayLevel)
{
d1 += (i + 1) * arrayOfDouble1[i];
i++;
break;
}
arrayOfDouble1[i] += paramArrayOfDouble[(j + i * this.grayLevel)];
}
label171: d3 += Math.pow(k + 1 - d1, 2.0D) * arrayOfDouble1[k];
k++;
break label42;
label201: for (int n = 0; ; n++)
{
if (n >= 32)
{
d2 += (m + 1) * arrayOfDouble2[m];
m++;
break;
}
arrayOfDouble2[m] += paramArrayOfDouble[(m + n * this.grayLevel)];
}
}
d4 += Math.pow(i1 + 1 - d2, 2.0D) * arrayOfDouble2[i1];
}
}
是不是感觉狗屁不通?这还是例举的一个相对简单的方法,看看这个
基本每个方法都有错误,基本每个错误都是逻辑混乱,基本没一个方法能用,简单来说,这个文件就是废的。
第一次看到这情况,心里很纳闷,不知道是dex2jar这个过程除了问题还是jd的问题,后来百度了一下(谷歌打不开,懒得折腾,别鄙视,人家度娘一样很敬业),发现这种问题很多,通过jad为核心的反编译工具(jd就是如此)都这副尿性,偏偏jad在java反编译工具中又算最好的,不知道是不是因为太久没更新的缘故,反正就是不给力。
那如何是好呢,嘿 用java开发,就没有不能破解的,工具不给力,那就人工来呗,果断搞起。
首先,找出该类的.class文件,javap隆重登场,在这里 比如该类为xohome.class, 在终端中,切入该文件所在目录,执行命令:
javap -c -private xohome.class
简单扫盲:javap是jdk自带的反编译工具,能简单解析class字节码文件的内容,参数 -c为显示字节码 -private为反编译级别,可开发过程中可见级别一样,一下是上头例举方法的字节码:
相信学过汇编的对这些都不陌生,如果你看得头晕,那就没辙了,因为这只是窗口大小的代码,一个中等方法大概有这样的代码500行。。。
我们开好工作窗口,将jd反编译的代码、字节码、空白文档(用作写反编译的代码用)依次列开:
这就是简单的工作台了