随着逆向工程的深入,越来越多的代码被整理,
vhly
其中有一些代码基本相似,类似于如下代码:
这段代码最开始看,感觉有点乱,但是只要仔细看看就可以明白了
这段代码中唯一一个有问题的地方就是 if(!flag) goto _L2; else goto _L1了,
这一句可以说是ZKM处理流程时的关键,
实际上 flag永远 = false也就是,相当于 goto 首先到 _L2 之后 通过 hasNext()条件 来 定位到_L1
当_L1执行到 _L2的时候再判断, 这段代码就可以认为是 一个 do{}while(xxx)
或者更清楚地看作 while(xxx.hasNext()){}的处理。
整理后的代码如下:
从上述代码可以看出 Zelix KlassMaster
实际上在针对for while switch的混淆时候,采用的是跳转代替来转换,但是执行逻辑保持不变,
因此,混淆器应该采用类似的手段来进行代码的保护
其中有一些代码基本相似,类似于如下代码:
gy gy1;
Iterator iterator;
boolean flag;
flag = ec.b;
gy1 = (gy)hashmap.get(ou1);
if(gy1 != null)
break MISSING_BLOCK_LABEL_153;
gy1 = new gy(27, 5, 5);
HashMap hashmap1 = new HashMap(27);
ou1.a(hashmap1);
iterator = hashmap1.entrySet().iterator();
if(!flag) goto _L2; else goto _L1
_L1:
java.util.Map.Entry entry = (java.util.Map.Entry)iterator.next();
ss ss1 = (ss)entry.getKey();
Integer integer = (Integer)entry.getValue();
String s = ss1.b();
mt mt1 = yo1.a(s);
gy1.a(ss1.s(), mt1, integer, integer);
_L2:
if(iterator.hasNext()) goto _L1; else goto _L3
_L3:
hashmap.put(ou1, gy1);
return gy1;
这段代码最开始看,感觉有点乱,但是只要仔细看看就可以明白了
这段代码中唯一一个有问题的地方就是 if(!flag) goto _L2; else goto _L1了,
这一句可以说是ZKM处理流程时的关键,
实际上 flag永远 = false也就是,相当于 goto 首先到 _L2 之后 通过 hasNext()条件 来 定位到_L1
当_L1执行到 _L2的时候再判断, 这段代码就可以认为是 一个 do{}while(xxx)
或者更清楚地看作 while(xxx.hasNext()){}的处理。
整理后的代码如下:
gy gy1;
Iterator iterator;
gy1 = (gy) hashmap.get(ou1);
if (gy1 == null) { // 此处作了条件判断的转义
gy1 = new gy(27, 5, 5);
HashMap hashmap1 = new HashMap(27);
ou1.a(hashmap1);
iterator = hashmap1.entrySet().iterator();
while (iterator.hasNext()) { // 此处通过while(...)的转换
java.util.Map.Entry entry = (java.util.Map.Entry) iterator.next();
ss ss1 = (ss) entry.getKey();
Integer integer = (Integer) entry.getValue();
String s = ss1.b();
mt mt1 = yo1.a(s);
gy1.a(ss1.s(), mt1, integer, integer);
}
hashmap.put(ou1, gy1);
}
return gy1;
从上述代码可以看出 Zelix KlassMaster
实际上在针对for while switch的混淆时候,采用的是跳转代替来转换,但是执行逻辑保持不变,
因此,混淆器应该采用类似的手段来进行代码的保护