java反编译出来的代码求解,解出后可追加50分 20
这段代码是APK反编译后的代码的某部分,很明显是被混淆过的,搞了很久都没有还原出来,大家帮看看怎么还原,代码如下:_L5:label0:{if(l<k/2)//for循环...
这段代码是APK反编译后的代码的某部分,很明显是被混淆过的,搞了很久都没有还原出来,大家帮看看怎么还原,代码如下:
_L5:
label0:
{
if(l < k / 2) //for循环的条件
break label0;
String s2 = stringbuffer.toString();
String s3 = s2.substring(0, i);
String s4;
if(i > 0)
s4 = (new StringBuilder(String.valueOf(s3))).append(".").append(s2.substring(i, s2.length() - j)).append(".").append(s2.substring(s2.length() - j)).toString();
else
s4 = (new StringBuilder(String.valueOf(s2.substring(i, s2.length() - j)))).append(".").append(s2.substring(s2.length() - j)).toString();
s1 = s4;
}
if(true) return s1; else goto _L3 //for循环的条件
_L3:
stringbuffer.append(s.substring(1 + l * 2, 2 + l * 2));
l++;
goto _L5
这其实就是一个被混淆后的for循环,但是我们怎么都欢迎不对。
给出一个别人还原的的例子,这是三个for循环的,相似度很大:
三个for循环
源码
public void tt()
{
for (int i = 0; i <
array; i++) {
for (int j = 0; j < array; j++) {
for (int k = 0; k < array;k++)
{
System.out.print("xxx");
}
}
}
}
反编译后
public void tt()
{
int i =
null;
_L2:
int k;
int j = array;
if (i >=
j)
return;
k = null;
_L3:
label0:
{
int l =
array;
if (k < l)
break label0;
i++;
}
if
(true) goto _L2; else goto _L1
_L1:
int i1 =
null;
_L4:
label1:
{
int j1 = array;
if (i1 <
j1)
break label1;
k++;
}
goto
_L3
System.out.print("xxx");
i1++;
goto _L4
} 展开
_L5:
label0:
{
if(l < k / 2) //for循环的条件
break label0;
String s2 = stringbuffer.toString();
String s3 = s2.substring(0, i);
String s4;
if(i > 0)
s4 = (new StringBuilder(String.valueOf(s3))).append(".").append(s2.substring(i, s2.length() - j)).append(".").append(s2.substring(s2.length() - j)).toString();
else
s4 = (new StringBuilder(String.valueOf(s2.substring(i, s2.length() - j)))).append(".").append(s2.substring(s2.length() - j)).toString();
s1 = s4;
}
if(true) return s1; else goto _L3 //for循环的条件
_L3:
stringbuffer.append(s.substring(1 + l * 2, 2 + l * 2));
l++;
goto _L5
这其实就是一个被混淆后的for循环,但是我们怎么都欢迎不对。
给出一个别人还原的的例子,这是三个for循环的,相似度很大:
三个for循环
源码
public void tt()
{
for (int i = 0; i <
array; i++) {
for (int j = 0; j < array; j++) {
for (int k = 0; k < array;k++)
{
System.out.print("xxx");
}
}
}
}
反编译后
public void tt()
{
int i =
null;
_L2:
int k;
int j = array;
if (i >=
j)
return;
k = null;
_L3:
label0:
{
int l =
array;
if (k < l)
break label0;
i++;
}
if
(true) goto _L2; else goto _L1
_L1:
int i1 =
null;
_L4:
label1:
{
int j1 = array;
if (i1 <
j1)
break label1;
k++;
}
goto
_L3
System.out.print("xxx");
i1++;
goto _L4
} 展开
展开全部
为什么不用Java Decompiler反编译呢?
不会出现这样的情况
唯一不足的就是反编译后原来的变量会变成数值
不会出现这样的情况
唯一不足的就是反编译后原来的变量会变成数值
更多追问追答
追问
jd-gui更不可读啊
jd-gui,jode,jad都用了,最接近的就是现在这个了,jode反编译出来的和现在这个差不多,都是用的goto
jd-gui反编译出来都是label,而且用法都是错误的,label直接定义在变量声明前面,然后又break到另一个无关的label去
追答
用我说的这个试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
i哪俩的,代码贴全啊亲
追问
超长了哦亲,你可以把s4那段这样看的哦亲
String s4;
if(i > 0)
s4 = "abc";
else
s4 = "def";
s1 = s4;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询