反编译过来的JAVA代码中有GOTO、break lable1类似的语句该如何解决? Java不是抛弃了goto语句吗。是否有两种可能:一是你反编译的类文件是很老的版本(这种可能性好象不大),二是此Java类被作者加密了,既就是为防止反编译而加入goto语句,让别人无法反编译。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多谢两位老兄.下面的内容是带BREAK的反编译之后的代码:URL url1; url1 = null; if(s.startsWith("str1")) { url1 = new URL(url, s.substring(4)); break MISSING_BLOCK_LABEL_1; } if(s.startsWith("str2:")) { url1 = new URL(url, s.substring(4)); break MISSING_BLOCK_LABEL_1; }而且在整个那个JAVA文件中,再也找不到第三个地方有:MISSING_BLOCK_LABEL_1这个东东了.还有这种情况出错的:break MISSING_BLOCK_LABEL_2; IOException ioexception; ioexception;(无缘无故多了个这行,肯定是出错的).这样,我反编译过后就无法再编译过去了.不知是不是我的反编译工具不够利害还是JAVA的反编译确实不是那么简单顺利的就能完全反编译过来了? TO tengyuandao(无名) 兄:先谢谢你的回复了1、第一种可能是不会的,他的代码用了SWING,是用的JDK1。4。1的版本的。2、加密应该也不是,JAR包里有几十个文件,只有三四个文件有那种情况出现的。而且我以前在CSDN上看到过一篇介绍JAVA反编译的文章,说是如果FOR循环嵌套多了几层后,反编译过来的就可能会出现GOTO了,郁闷的是,我刚刚找那篇文章找了半天,居然没找到了 改成return之类的试试看。反正你已经知道它的业务逻辑,自己修改一下应该差不多。带有GOTO的循环语句很容易理解的,也可以贴出来看。 整个的代码有差不多4000行,贴出来可能也没有人有耐心全部看下去吧.我刚刚又仔细看了看,那些不正常的代码都是出现在一些方法里面的,我贴出一个完整的方法大家帮我看看:private boolean check() { String s; if((s = getParameter("GB")) == null) break MISSING_BLOCK_LABEL_237;/////////第一个不正常的地方????? boolean flag; long al[] = { 0L, 0L, 0L, 0L, 0L }; InetAddress inetaddress = InetAddress.getByName(getCodeBase().getHost()); StringTokenizer stringtokenizer = new StringTokenizer(inetaddress.getHostAddress(), "."); al[0] = Long.parseLong(stringtokenizer.nextToken()); al[1] = Long.parseLong(stringtokenizer.nextToken()); al[2] = Long.parseLong(stringtokenizer.nextToken()); al[3] = Long.parseLong(stringtokenizer.nextToken()); al[4] = al[0] + (al[2] << 8) + (al[1] << 16) + (al[3] << 24); stringtokenizer = new StringTokenizer(s, ";"); String s1; for(flag = al[4] == 0x100007fL; !flag && stringtokenizer.hasMoreTokens(); flag = (Long.parseLong(s1, 16) ^ 0x29dbda2dL) == al[4]) s1 = stringtokenizer.nextToken(); m_bCopyright = flag; return flag; Exception exception; exception;/////////////第二个不正常的地方?????????? System.out.println(exception.getMessage()); m_bCopyright = false; return true; return false;////////这两个return有点莫明其妙???????????? }还有其它几处地方的都是类似这种的,上面的这个方法是独立的,在上面的方法中,共有三处我觉得不正常的地方,都已经标出来了.另外一点:那个:break MISSING_BLOCK_LABEL_237的MISSING_BLOCK_LABEL_237在整个全文都找不到第二个地方的了?还烦各位老兄帮忙看看,谢谢! 我也用JAD反编译过很多这样的文件,你遇到多少GOTO,我遇到这种情况一般都遇到几百个GOTO,读是肯定读不懂的。连函数都搞不清楚有几个 第一处显然就是return或者exit,参数不正确的处理。第二处应该是异常处理。 这个类文件是用了混淆器处理过了,我也曾经反编译了好几个 软件,里面不乏有上面的这种情况,这是由于在Java类文件中删除了许多无关的信息,如行号表等,因此呢反编译时有些就不可以还原成原来的样子, 不过,也不要紧, 分析一下,你就会发现一些规律.你的上面一段代码大致可改成: private boolean check() { String s; if((s = getParameter("GB")) == null) return;// break MISSING_BLOCK_LABEL_237;/////////第一个不正常的地方????? boolean flag; long al[] = { 0L, 0L, 0L, 0L, 0L }; try{ InetAddress inetaddress = InetAddress.getByName(getCodeBase().getHost()); StringTokenizer stringtokenizer = new StringTokenizer(inetaddress.getHostAddress(), "."); al[0] = Long.parseLong(stringtokenizer.nextToken()); al[1] = Long.parseLong(stringtokenizer.nextToken()); al[2] = Long.parseLong(stringtokenizer.nextToken()); al[3] = Long.parseLong(stringtokenizer.nextToken()); al[4] = al[0] + (al[2] << 8) + (al[1] << 16) + (al[3] << 24); stringtokenizer = new StringTokenizer(s, ";"); String s1; for(flag = al[4] == 0x100007fL; !flag && stringtokenizer.hasMoreTokens(); flag = (Long.parseLong(s1, 16) ^ 0x29dbda2dL) == al[4]) s1 = stringtokenizer.nextToken(); m_bCopyright = flag; return flag; }catch(Exception exception){ System.out.println(exception.getMessage()); m_bCopyright = false; return true; } //Exception exception; //exception;/////////////第二个不正常的地方?????????? return false;////////这两个return有点莫明其妙???????????? }}这个混淆的还不算历害,我反编译的一个项目,每个类的每个方法都混淆过了, 总共160多个类,做了一个星期也给做完,真的好辛苦. 多谢各位老兄的相助,尤其感谢Djava(Djava) 兄给我分析的代码,以前没有过这方面的经验,听你这么一分析,还真是有点规律,我今天晚上先照Djava(Djava) 兄的规律好好改一改,看看如何,不行明天再向各位请教. 经过各位的帮助后,那个BREAK LABLE差不多处理好了,不过另外的GOTO的情况,我看了半天还没找出规律来,各位再帮小弟看看这个包含GOTO的语句,指点指点其中的反编译的规律,不胜感激!public boolean create(GSLine gsline, double d, double d1) { GDot gdot4; GDot gdot5; double d2; int i; int l; int i1; boolean flag2; boolean flag3; boolean flag = false; gdot4 = null; gdot5 = null; d2 = 0.0D; l = -1; i1 = -2; flag2 = d >= 0.0D; flag3 = d1 >= 0.0D; d = flag2 ? d : -d; d1 = flag3 ? d1 : -d1; if(flag2 == flag3) if(!flag2); i = flag2 ? 0 : gsline.m_Data.size() - 1; goto _L1 ////////////第一处goto_L3: GDot gdot = gsline.m_Data.dotAt(i); GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1); double d3 = gdot.distance(gdot2.m_x, gdot2.m_y); if(d3 == 0.0D) continue; /* Loop/switch isn't completed */ d2 += d3; if(d == 0.0D) { l = flag2 ? i + 1 : i - 1; gdot4 = new GDot(gdot.m_x, gdot.m_y); break; /* Loop/switch isn't completed */ } if(d2 == d) { l = flag2 ? i + 1 : i - 1; gdot4 = new GDot(gdot2.m_x, gdot2.m_y); break; /* Loop/switch isn't completed */ } if(d2 <= d) continue; /* Loop/switch isn't completed */ l = flag2 ? i + 1 : i - 1; d2 = d - (d2 - d3); gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y)); break; /* Loop/switch isn't completed */ i = flag2 ? i + 1 : i - 1;_L1: if(flag2 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L3; /////第二处goto else goto _L2 //////////第三处goto_L2: l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0; i = flag3 ? 0 : gsline.m_Data.size() - 1; goto _L4 ///////第四处goto_L6: GDot gdot1 = gsline.m_Data.dotAt(i); GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1); double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y); if(d4 == 0.0D) continue; /* Loop/switch isn't completed */ d2 += d4; if(d1 == 0.0D) { i1 = flag3 ? i + 1 : i - 1; gdot5 = new GDot(gdot1.m_x, gdot1.m_y); break; /* Loop/switch isn't completed */ } if(d2 == d1) { i1 = flag3 ? i + 1 : i - 1; gdot5 = new GDot(gdot3.m_x, gdot3.m_y); break; /* Loop/switch isn't completed */ } if(d2 <= d1) continue; /* Loop/switch isn't completed */ i1 = flag3 ? i + 1 : i - 1; d2 = d1 - (d2 - d4); gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y)); break; /* Loop/switch isn't completed */ i = flag3 ? i + 1 : i - 1;_L4: if(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L6;//////第五处goto else goto _L5 /////////////////第六处goto_L5: i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0; GDots gdots = new GDots(); if(l < i1) { System.out.println("iIndex1 " + l + " iIndex2 " + i1); gdots.addDot(gdot4); for(int j = l; j < i1; j++) gdots.addDot(gsline.m_Data.dotAt(j)); gdots.addDot(gdot5); } else { System.out.println("iIndex1 " + l + " iIndex2 " + i1); gdots.addDot(gdot4); for(int k = i1; k < l; k++) gdots.addDot(gsline.m_Data.dotAt(k)); gdots.addDot(gdot5); } m_pLine = gsline; m_dLength1 = d; m_dLength2 = d1; add(gdots); adjustRect(); m_lID = gsline.m_lID; m_sName = gsline.m_sName; boolean flag1 = true; return flag1; } 感觉是while循环,goto语句是循环条件的判断。 感谢上面几位老兄抽时间看了那段代码.应该是用了混淆器的,goto也应该是在循环中条件判断,可这样一来,这代码反编译过来后不知如何去还原了,其中的规律硬是看不出来各位帮忙看看.感觉感谢!我的反编译工具是JAD 这还不算是混淆, 看看永中office中的java代码,你就知道什么是真正的混淆了除非必须要修改,否则放弃吧! 先在上面加了注释性质的块分割:public boolean create(GSLine gsline, double d, double d1) { GDot gdot4; GDot gdot5; double d2; int i; int l; int i1; boolean flag2; boolean flag3; boolean flag = false; gdot4 = null; gdot5 = null; d2 = 0.0D; l = -1; i1 = -2; flag2 = d >= 0.0D; flag3 = d1 >= 0.0D; d = flag2 ? d : -d; d1 = flag3 ? d1 : -d1; if(flag2 == flag3) if(!flag2); i = flag2 ? 0 : gsline.m_Data.size() - 1; goto _L1 ////////////第一处goto//while(flag2 ? i < gsline.m_Data.size() - 1 : i > 0); //{=============================================================== _L3: GDot gdot = gsline.m_Data.dotAt(i); GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1); double d3 = gdot.distance(gdot2.m_x, gdot2.m_y); if(d3 == 0.0D) continue; /* Loop/switch isn't completed */ d2 += d3; if(d == 0.0D) { l = flag2 ? i + 1 : i - 1; gdot4 = new GDot(gdot.m_x, gdot.m_y); break; /* Loop/switch isn't completed */ } if(d2 == d) { l = flag2 ? i + 1 : i - 1; gdot4 = new GDot(gdot2.m_x, gdot2.m_y); break; /* Loop/switch isn't completed */ } if(d2 <= d) continue; /* Loop/switch isn't completed */ l = flag2 ? i + 1 : i - 1; d2 = d - (d2 - d3); gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y)); break; /* Loop/switch isn't completed */ i = flag2 ? i + 1 : i - 1;_L1: if(flag2 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L3; /////第二处goto//}=============================================================== else goto _L2 //////////第三处goto_L2: l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0; i = flag3 ? 0 : gsline.m_Data.size() - 1; goto _L4 ///////第四处goto//while(flag3 ? i < gsline.m_Data.size() - 1 : i > 0)//{============================================================== _L6: GDot gdot1 = gsline.m_Data.dotAt(i); GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1); double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y); if(d4 == 0.0D) continue; /* Loop/switch isn't completed */ d2 += d4; if(d1 == 0.0D) { i1 = flag3 ? i + 1 : i - 1; gdot5 = new GDot(gdot1.m_x, gdot1.m_y); break; /* Loop/switch isn't completed */ } if(d2 == d1) { i1 = flag3 ? i + 1 : i - 1; gdot5 = new GDot(gdot3.m_x, gdot3.m_y); break; /* Loop/switch isn't completed */ } if(d2 <= d1) continue; /* Loop/switch isn't completed */ i1 = flag3 ? i + 1 : i - 1; d2 = d1 - (d2 - d4); gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y)); break; /* Loop/switch isn't completed */ i = flag3 ? i + 1 : i - 1;_L4: if(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L6;//////第五处goto//}====================================================================================== else goto _L5 /////////////////第六处goto_L5: i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0; GDots gdots = new GDots(); if(l < i1) { System.out.println("iIndex1 " + l + " iIndex2 " + i1); gdots.addDot(gdot4); for(int j = l; j < i1; j++) gdots.addDot(gsline.m_Data.dotAt(j)); gdots.addDot(gdot5); } else { System.out.println("iIndex1 " + l + " iIndex2 " + i1); gdots.addDot(gdot4); for(int k = i1; k < l; k++) gdots.addDot(gsline.m_Data.dotAt(k)); gdots.addDot(gdot5); } m_pLine = gsline; m_dLength1 = d; m_dLength2 = d1; add(gdots); adjustRect(); m_lID = gsline.m_lID; m_sName = gsline.m_sName; boolean flag1 = true; return flag1; } 以下是我按上面的逻辑修改好的,估计问题不会很多了。请看我的部分注释。public boolean create(GSLine gsline, double d, double d1){ GDot gdot4; GDot gdot5; double d2; int i; int l; int i1; boolean flag2; boolean flag3; boolean flag = false; gdot4 = null; gdot5 = null; d2 = 0.0D; l = -1; i1 = -2; flag2 = d >= 0.0D; flag3 = d1 >= 0.0D; d = flag2 ? d : -d; d1 = flag3 ? d1 : -d1; if(flag2 == flag3) if(!flag2);//=============================>这里有问题!! i = flag2 ? 0 : gsline.m_Data.size() - 1; //=============================================================== while(flag2 ? i < gsline.m_Data.size() - 1 : i > 0); { GDot gdot = gsline.m_Data.dotAt(i); GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1); double d3 = gdot.distance(gdot2.m_x, gdot2.m_y); if(d3 == 0.0D) continue; /* Loop/switch isn't completed */ d2 += d3; if(d == 0.0D) { l = flag2 ? i + 1 : i - 1; gdot4 = new GDot(gdot.m_x, gdot.m_y); break; /* Loop/switch isn't completed */ } if(d2 == d) { l = flag2 ? i + 1 : i - 1; gdot4 = new GDot(gdot2.m_x, gdot2.m_y); break; /* Loop/switch isn't completed */ } if(d2 <= d) continue; /* Loop/switch isn't completed */ l = flag2 ? i + 1 : i - 1; d2 = d - (d2 - d3); gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y)); break; /* Loop/switch isn't completed */ i = flag2 ? i + 1 : i - 1; } //=============================================================== l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0; i = flag3 ? 0 : gsline.m_Data.size() - 1; //=============================================================== while(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) { GDot gdot1 = gsline.m_Data.dotAt(i); GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1); double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y); if(d4 == 0.0D) continue; /* Loop/switch isn't completed */ d2 += d4; if(d1 == 0.0D) { i1 = flag3 ? i + 1 : i - 1; gdot5 = new GDot(gdot1.m_x, gdot1.m_y); break; /* Loop/switch isn't completed */ } if(d2 == d1) { i1 = flag3 ? i + 1 : i - 1; gdot5 = new GDot(gdot3.m_x, gdot3.m_y); break; /* Loop/switch isn't completed */ } if(d2 <= d1) continue; /* Loop/switch isn't completed */ i1 = flag3 ? i + 1 : i - 1; d2 = d1 - (d2 - d4); gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y)); break; /* Loop/switch isn't completed */ i = flag3 ? i + 1 : i - 1; } //================================================================ i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0; GDots gdots = new GDots(); if(l < i1) { System.out.println("iIndex1 " + l + " iIndex2 " + i1); gdots.addDot(gdot4); for(int j = l; j < i1; j++) gdots.addDot(gsline.m_Data.dotAt(j)); gdots.addDot(gdot5); } else { System.out.println("iIndex1 " + l + " iIndex2 " + i1); gdots.addDot(gdot4); for(int k = i1; k < l; k++) gdots.addDot(gsline.m_Data.dotAt(k)); gdots.addDot(gdot5); } m_pLine = gsline; m_dLength1 = d; m_dLength2 = d1; add(gdots); adjustRect(); m_lID = gsline.m_lID; m_sName = gsline.m_sName; boolean flag1 = true; return flag1;} 求指点。。。 大量数据导出到XLS ,内存溢出 ,期待高手解决 StreamTokenizer 输入字符串问题 关于如何让SWT中的ProgressBar的进度条颜色多样化,顺带散分 请问学j2ee什么书比较经典? 求助!!高手来!!急~~~ 请问如何将Applet的标签转为IE<Object>标签 JInternalFrame怎么用 ? 下面程序是照着书打的 可是无法正常显示结果 java怎么判断电脑是否有音频输出设备? 在APPLET怎么弹出对话框! scjp求助,这道题应该选什么,以及原因,谢谢 如何输出一个String变量的Unicode字符串
URL url1;
url1 = null;
if(s.startsWith("str1"))
{
url1 = new URL(url, s.substring(4));
break MISSING_BLOCK_LABEL_1;
}
if(s.startsWith("str2:"))
{
url1 = new URL(url, s.substring(4));
break MISSING_BLOCK_LABEL_1;
}
而且在整个那个JAVA文件中,再也找不到第三个地方有:MISSING_BLOCK_LABEL_1这个东东了.还有这种情况出错的:
break MISSING_BLOCK_LABEL_2;
IOException ioexception;
ioexception;(无缘无故多了个这行,肯定是出错的).
这样,我反编译过后就无法再编译过去了.不知是不是我的反编译工具不够利害还是JAVA的反编译确实不是那么简单顺利的就能完全反编译过来了?
先谢谢你的回复了
1、第一种可能是不会的,他的代码用了SWING,是用的JDK1。4。1的版本的。
2、加密应该也不是,JAR包里有几十个文件,只有三四个文件有那种情况出现的。而且我以前在CSDN上看到过一篇介绍JAVA反编译的文章,说是如果FOR循环嵌套多了几层后,反编译过来的就可能会出现GOTO了,郁闷的是,我刚刚找那篇文章找了半天,居然没找到了
带有GOTO的循环语句很容易理解的,也可以贴出来看。
我刚刚又仔细看了看,那些不正常的代码都是出现在一些方法里面的,我贴出一个完整的方法大家帮我看看:
private boolean check()
{
String s;
if((s = getParameter("GB")) == null)
break MISSING_BLOCK_LABEL_237;/////////第一个不正常的地方?????
boolean flag;
long al[] = {
0L, 0L, 0L, 0L, 0L
};
InetAddress inetaddress = InetAddress.getByName(getCodeBase().getHost());
StringTokenizer stringtokenizer = new StringTokenizer(inetaddress.getHostAddress(), ".");
al[0] = Long.parseLong(stringtokenizer.nextToken());
al[1] = Long.parseLong(stringtokenizer.nextToken());
al[2] = Long.parseLong(stringtokenizer.nextToken());
al[3] = Long.parseLong(stringtokenizer.nextToken());
al[4] = al[0] + (al[2] << 8) + (al[1] << 16) + (al[3] << 24);
stringtokenizer = new StringTokenizer(s, ";");
String s1;
for(flag = al[4] == 0x100007fL; !flag && stringtokenizer.hasMoreTokens(); flag = (Long.parseLong(s1, 16) ^ 0x29dbda2dL) == al[4])
s1 = stringtokenizer.nextToken(); m_bCopyright = flag;
return flag;
Exception exception;
exception;/////////////第二个不正常的地方??????????
System.out.println(exception.getMessage());
m_bCopyright = false;
return true;
return false;////////这两个return有点莫明其妙????????????
}
还有其它几处地方的都是类似这种的,上面的这个方法是独立的,在上面的方法中,共有三处我觉得不正常的地方,都已经标出来了.
另外一点:那个:break MISSING_BLOCK_LABEL_237的MISSING_BLOCK_LABEL_237在整个全文都找不到第二个地方的了?
还烦各位老兄帮忙看看,谢谢!
几百个GOTO,读是肯定读不懂的。连函数都搞不清楚有几个
第二处应该是异常处理。
软件,里面不乏有上面的这种情况,这是由于在Java类文件中
删除了许多无关的信息,如行号表等,因此呢反编译时有些就不
可以还原成原来的样子, 不过,也不要紧, 分析一下,你就会发现
一些规律.你的上面一段代码大致可改成: private boolean check()
{
String s;
if((s = getParameter("GB")) == null) return;
// break MISSING_BLOCK_LABEL_237;/////////第一个不正常的地方?????
boolean flag;
long al[] = {
0L, 0L, 0L, 0L, 0L
};
try{
InetAddress inetaddress = InetAddress.getByName(getCodeBase().getHost());
StringTokenizer stringtokenizer = new StringTokenizer(inetaddress.getHostAddress(), ".");
al[0] = Long.parseLong(stringtokenizer.nextToken());
al[1] = Long.parseLong(stringtokenizer.nextToken());
al[2] = Long.parseLong(stringtokenizer.nextToken());
al[3] = Long.parseLong(stringtokenizer.nextToken());
al[4] = al[0] + (al[2] << 8) + (al[1] << 16) + (al[3] << 24);
stringtokenizer = new StringTokenizer(s, ";");
String s1;
for(flag = al[4] == 0x100007fL; !flag && stringtokenizer.hasMoreTokens(); flag = (Long.parseLong(s1, 16) ^ 0x29dbda2dL) == al[4])
s1 = stringtokenizer.nextToken(); m_bCopyright = flag;
return flag;
}catch(Exception exception){
System.out.println(exception.getMessage());
m_bCopyright = false;
return true;
}
//Exception exception;
//exception;/////////////第二个不正常的地方??????????
return false;////////这两个return有点莫明其妙????????????
}}这个混淆的还不算历害,我反编译的一个项目,每个类的每个方法都混淆过了,
总共160多个类,做了一个星期也给做完,真的好辛苦.
{
GDot gdot4;
GDot gdot5;
double d2;
int i;
int l;
int i1;
boolean flag2;
boolean flag3;
boolean flag = false;
gdot4 = null;
gdot5 = null;
d2 = 0.0D;
l = -1;
i1 = -2;
flag2 = d >= 0.0D;
flag3 = d1 >= 0.0D;
d = flag2 ? d : -d;
d1 = flag3 ? d1 : -d1;
if(flag2 == flag3)
if(!flag2);
i = flag2 ? 0 : gsline.m_Data.size() - 1;
goto _L1 ////////////第一处goto
_L3:
GDot gdot = gsline.m_Data.dotAt(i);
GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1);
double d3 = gdot.distance(gdot2.m_x, gdot2.m_y);
if(d3 == 0.0D)
continue; /* Loop/switch isn't completed */
d2 += d3;
if(d == 0.0D)
{
l = flag2 ? i + 1 : i - 1;
gdot4 = new GDot(gdot.m_x, gdot.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 == d)
{
l = flag2 ? i + 1 : i - 1;
gdot4 = new GDot(gdot2.m_x, gdot2.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 <= d)
continue; /* Loop/switch isn't completed */
l = flag2 ? i + 1 : i - 1;
d2 = d - (d2 - d3);
gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y));
break; /* Loop/switch isn't completed */
i = flag2 ? i + 1 : i - 1;
_L1:
if(flag2 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L3; /////第二处goto
else goto _L2 //////////第三处goto
_L2:
l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0;
i = flag3 ? 0 : gsline.m_Data.size() - 1;
goto _L4 ///////第四处goto
_L6:
GDot gdot1 = gsline.m_Data.dotAt(i);
GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1);
double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y);
if(d4 == 0.0D)
continue; /* Loop/switch isn't completed */
d2 += d4;
if(d1 == 0.0D)
{
i1 = flag3 ? i + 1 : i - 1;
gdot5 = new GDot(gdot1.m_x, gdot1.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 == d1)
{
i1 = flag3 ? i + 1 : i - 1;
gdot5 = new GDot(gdot3.m_x, gdot3.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 <= d1)
continue; /* Loop/switch isn't completed */
i1 = flag3 ? i + 1 : i - 1;
d2 = d1 - (d2 - d4);
gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y));
break; /* Loop/switch isn't completed */
i = flag3 ? i + 1 : i - 1;
_L4:
if(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L6;//////第五处goto
else goto _L5 /////////////////第六处goto
_L5:
i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0;
GDots gdots = new GDots();
if(l < i1)
{
System.out.println("iIndex1 " + l + " iIndex2 " + i1);
gdots.addDot(gdot4);
for(int j = l; j < i1; j++)
gdots.addDot(gsline.m_Data.dotAt(j)); gdots.addDot(gdot5);
} else
{
System.out.println("iIndex1 " + l + " iIndex2 " + i1);
gdots.addDot(gdot4);
for(int k = i1; k < l; k++)
gdots.addDot(gsline.m_Data.dotAt(k)); gdots.addDot(gdot5);
}
m_pLine = gsline;
m_dLength1 = d;
m_dLength2 = d1;
add(gdots);
adjustRect();
m_lID = gsline.m_lID;
m_sName = gsline.m_sName;
boolean flag1 = true;
return flag1;
}
应该是用了混淆器的,goto也应该是在循环中条件判断,可这样一来,这代码反编译过来后不知如何去还原了,其中的规律硬是看不出来各位帮忙看看.感觉感谢!
我的反编译工具是JAD
除非必须要修改,否则放弃吧!
public boolean create(GSLine gsline, double d, double d1)
{
GDot gdot4;
GDot gdot5;
double d2;
int i;
int l;
int i1;
boolean flag2;
boolean flag3;
boolean flag = false;
gdot4 = null;
gdot5 = null;
d2 = 0.0D;
l = -1;
i1 = -2;
flag2 = d >= 0.0D;
flag3 = d1 >= 0.0D;
d = flag2 ? d : -d;
d1 = flag3 ? d1 : -d1;
if(flag2 == flag3)
if(!flag2);
i = flag2 ? 0 : gsline.m_Data.size() - 1;
goto _L1 ////////////第一处goto
//while(flag2 ? i < gsline.m_Data.size() - 1 : i > 0);
//{===============================================================
_L3:
GDot gdot = gsline.m_Data.dotAt(i);
GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1);
double d3 = gdot.distance(gdot2.m_x, gdot2.m_y);
if(d3 == 0.0D)
continue; /* Loop/switch isn't completed */
d2 += d3;
if(d == 0.0D)
{
l = flag2 ? i + 1 : i - 1;
gdot4 = new GDot(gdot.m_x, gdot.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 == d)
{
l = flag2 ? i + 1 : i - 1;
gdot4 = new GDot(gdot2.m_x, gdot2.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 <= d)
continue; /* Loop/switch isn't completed */
l = flag2 ? i + 1 : i - 1;
d2 = d - (d2 - d3);
gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y));
break; /* Loop/switch isn't completed */
i = flag2 ? i + 1 : i - 1;
_L1:
if(flag2 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L3; /////第二处goto
//}===============================================================
else goto _L2 //////////第三处goto
_L2:
l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0;
i = flag3 ? 0 : gsline.m_Data.size() - 1;
goto _L4 ///////第四处goto
//while(flag3 ? i < gsline.m_Data.size() - 1 : i > 0)
//{==============================================================
_L6:
GDot gdot1 = gsline.m_Data.dotAt(i);
GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1);
double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y);
if(d4 == 0.0D)
continue; /* Loop/switch isn't completed */
d2 += d4;
if(d1 == 0.0D)
{
i1 = flag3 ? i + 1 : i - 1;
gdot5 = new GDot(gdot1.m_x, gdot1.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 == d1)
{
i1 = flag3 ? i + 1 : i - 1;
gdot5 = new GDot(gdot3.m_x, gdot3.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 <= d1)
continue; /* Loop/switch isn't completed */
i1 = flag3 ? i + 1 : i - 1;
d2 = d1 - (d2 - d4);
gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y));
break; /* Loop/switch isn't completed */
i = flag3 ? i + 1 : i - 1;
_L4:
if(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L6;//////第五处goto
//}======================================================================================
else goto _L5 /////////////////第六处goto
_L5:
i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0;
GDots gdots = new GDots();
if(l < i1)
{
System.out.println("iIndex1 " + l + " iIndex2 " + i1);
gdots.addDot(gdot4);
for(int j = l; j < i1; j++)
gdots.addDot(gsline.m_Data.dotAt(j)); gdots.addDot(gdot5);
} else
{
System.out.println("iIndex1 " + l + " iIndex2 " + i1);
gdots.addDot(gdot4);
for(int k = i1; k < l; k++)
gdots.addDot(gsline.m_Data.dotAt(k)); gdots.addDot(gdot5);
}
m_pLine = gsline;
m_dLength1 = d;
m_dLength2 = d1;
add(gdots);
adjustRect();
m_lID = gsline.m_lID;
m_sName = gsline.m_sName;
boolean flag1 = true;
return flag1;
}
请看我的部分注释。
public boolean create(GSLine gsline, double d, double d1)
{
GDot gdot4;
GDot gdot5;
double d2;
int i;
int l;
int i1;
boolean flag2;
boolean flag3;
boolean flag = false;
gdot4 = null;
gdot5 = null;
d2 = 0.0D;
l = -1;
i1 = -2;
flag2 = d >= 0.0D;
flag3 = d1 >= 0.0D;
d = flag2 ? d : -d;
d1 = flag3 ? d1 : -d1;
if(flag2 == flag3)
if(!flag2);//=============================>这里有问题!!
i = flag2 ? 0 : gsline.m_Data.size() - 1;
//===============================================================
while(flag2 ? i < gsline.m_Data.size() - 1 : i > 0);
{
GDot gdot = gsline.m_Data.dotAt(i);
GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1);
double d3 = gdot.distance(gdot2.m_x, gdot2.m_y);
if(d3 == 0.0D)
continue; /* Loop/switch isn't completed */
d2 += d3;
if(d == 0.0D)
{
l = flag2 ? i + 1 : i - 1;
gdot4 = new GDot(gdot.m_x, gdot.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 == d)
{
l = flag2 ? i + 1 : i - 1;
gdot4 = new GDot(gdot2.m_x, gdot2.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 <= d)
continue; /* Loop/switch isn't completed */
l = flag2 ? i + 1 : i - 1;
d2 = d - (d2 - d3);
gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y));
break; /* Loop/switch isn't completed */
i = flag2 ? i + 1 : i - 1;
}
//=============================================================== l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0;
i = flag3 ? 0 : gsline.m_Data.size() - 1; //===============================================================
while(flag3 ? i < gsline.m_Data.size() - 1 : i > 0)
{
GDot gdot1 = gsline.m_Data.dotAt(i);
GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1);
double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y);
if(d4 == 0.0D)
continue; /* Loop/switch isn't completed */
d2 += d4;
if(d1 == 0.0D)
{
i1 = flag3 ? i + 1 : i - 1;
gdot5 = new GDot(gdot1.m_x, gdot1.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 == d1)
{
i1 = flag3 ? i + 1 : i - 1;
gdot5 = new GDot(gdot3.m_x, gdot3.m_y);
break; /* Loop/switch isn't completed */
}
if(d2 <= d1)
continue; /* Loop/switch isn't completed */
i1 = flag3 ? i + 1 : i - 1;
d2 = d1 - (d2 - d4);
gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y));
break; /* Loop/switch isn't completed */
i = flag3 ? i + 1 : i - 1;
}
//================================================================
i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0;
GDots gdots = new GDots();
if(l < i1)
{
System.out.println("iIndex1 " + l + " iIndex2 " + i1);
gdots.addDot(gdot4);
for(int j = l; j < i1; j++)
gdots.addDot(gsline.m_Data.dotAt(j)); gdots.addDot(gdot5);
}
else
{
System.out.println("iIndex1 " + l + " iIndex2 " + i1);
gdots.addDot(gdot4);
for(int k = i1; k < l; k++)
gdots.addDot(gsline.m_Data.dotAt(k)); gdots.addDot(gdot5);
}
m_pLine = gsline;
m_dLength1 = d;
m_dLength2 = d1;
add(gdots);
adjustRect();
m_lID = gsline.m_lID;
m_sName = gsline.m_sName;
boolean flag1 = true;
return flag1;
}