能力值:
( LV1,RANK:0 )
2 楼
次数限制在abr中
能力值:
( LV2,RANK:10 )
3 楼
能力值:
( LV1,RANK:0 )
4 楼
ZKM 13.0.0 https://masterof13fps.com/forum/index.php?threads/zkm-obfuscator-13-0-0-cracked.14/
能力值:
( LV2,RANK:10 )
5 楼
mb_zjwuturb
ZKM 13.0.0
https://masterof13fps.com/forum/index.php?threads/zkm-obfuscator-13-0-0-cracked.14/ 反调试代码在com.zelix.aac.a0()中,可以通过破坏加密字符,导致解密失败,然后无法进行反射,从而过掉反调试。Obfuscate control flow参数流程,可以通过arthas调试
void com.zelix.sk.run()
void com.zelix.auh.k(java.lang.Object[])
watch com.zelix.auh k {params[0][33]} //Obfuscate control flow
com.zelix.i7.watch com.zelix.i7 {params[38]} //Obfuscate control flow,参数为39,搜索ILOAD 39定位
private com.zelix.ih com.zelix.i7.a(java.lang.Object[])
watch com.zelix.i7 a {params[0][1]} 'returnObj!=null&&returnObj instanceof com.zelix.ih' -x 3 //Obfuscate control flow
public void com.zelix.abr.Y(java.lang.Object[])//类
watch com.zelix.abr Y {params[5]} -x 3 //Obfuscate control flow
int com.zelix.a0r.f(java.lang.Object[])//method
watch com.zelix.a0r f {params[0][6]} -x 2
int com.zelix.avb.c(java.lang.Object[])//code属性
watch com.zelix.avb c {method.toString(),params[0][6]} 'params.length==1&¶ms[0].getClass().isArray()&¶ms[0].length==10' -x 3
int com.zelix.a0u.b(java.lang.Object[])//code属性指令部分
watch com.zelix.a0u b {method.toString(),params[0][5]} 'params.length==1&¶ms[0].getClass().isArray()&¶ms[0].length==10' -x 3
Obfuscate control flow参数控制应该在这个方法中
public void com.zelix.abr.Y(java.lang.Object[])
大体可能为,用recaf修改
AL:
LINE AL 2208
ICONST_2
ISTORE 57
修改为
AL:
LINE AL 2208
ALOAD 56
ARRAYLENGTH
ISTORE 57
最后于 2021-4-23 11:56
被guduzhe编辑
,原因:
能力值:
( LV2,RANK:10 )
6 楼
自己写了一个代理类,这个代理类破解了ZKM的反调试功能,因为java代理类不限制个数,可以用这个代理类用在你的代理类前,过掉反调试功能,或者有经验的直接修改class文件。
agent是通用的,还有enable也是通用的,其他都是针对ZKM 15.0版本的。
enable实际就是类似红框里编辑框和按钮、下拉列表等等都可以点击和修改,是有效的了。
用法如下,
比如关闭代理功能
比如关闭时间修改,打开时间修改debug
比如输出动态方法调用,这里可能是方法,也可能属性,属性就是getter和setter方法,这个根据字节码返回类型判断,如果返回是void就是setter,有返回类型就是getter
比如输出字符
输出字符还是有bug,应该是classloader重复加载类
上传的附件:
能力值:
( LV2,RANK:10 )
7 楼
guduzhe
自己写了一个代理类,这个代理类破解了ZKM的反调试功能,因为java代理类不限制个数,可以用这个代理类用在你的代理类前,过掉反调试功能,或者有经验的直接修改class文件。agent是通用的,还有en ...
楼主,请问下,JAVA有啥字节码调试工具吗?类似x64dbg这样的调试的,看到现有的都是可以查看字节码,可以调试,但是不能两个结合起来的,很是头疼。
能力值:
( LV2,RANK:10 )
8 楼
~Katyusha~
楼主,请问下,JAVA有啥字节码调试工具吗?类似x64dbg这样的调试的,看到现有的都是可以查看字节码,可以调试,但是不能两个结合起来的,很是头疼。
没有找到字节码级别的,调试只能根据linenumber下断点,运行也是这样。
能力值:
( LV2,RANK:10 )
9 楼
又加了一个匹配类名前缀和方法名打印调用堆栈的功能
能力值:
( LV2,RANK:10 )
10 楼
看雪的代码显示不如oschina的好看,它的左右不会换行,看起来完整,看雪代码许多都给换行,看起来有些乱。
给出zkm 15.0的类与class文件结构的关系
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
com.zelix.abr
h minor_version
H major_version
R constant_pool_info com.zelix.ok{z:constant_pool_count; j:com.zelix.c5[com.zelix.ok.z]}
l access_flags com.zelix.ab3{l:access_flags}
v this_class com.zelix.c8
F this_class 类的完整路径名
p this_class 上面F的小写
r this_class 上面F
I super_class com.zelix.c8(Object时为null)
k interfaces_count
j interfaces com.zelix.c8[com.zelix.abm.k]
u fields_count
U fields com.zelix.a0t[com.zelix.abr.u] com.zelix.a0t{p:access_flags; n:name_index; j:descriptor_index; o:attributes_count; k:attributes=com.zelix.ab_[com.zelix.a0t.o]}
K methods_count
P methods com.zelix.a0r[com.zelix.abr.K] com.zelix.a0r{p:access_flags; v:name_index s:descriptor_index o:attributes_count; k:attributes=com.zelix.ab_[com.zelix.a0p.o]}
s attributes_count
A attributes com.zelix.ab_[com.zelix.abr.s]
能力值:
( LV2,RANK:10 )
11 楼
mb_zjwuturb
次数限制在abr中
三个字符对应意义
faUA1FjlOXbd1->1600955743799 到期时间
WbGOSe0eeA->2764800000 172800000*4*4=2764800000也就是32天
Vbgm0ee0A->172800000 1000*3600*24*2=172800000也就是两天 放一段时间转换的函数,这个是com.zelix.em类里的,
public static long a(String var3) {
char[] var5 = var3.toCharArray();
char[] var6 = new char[var5.length];
for (int var7 = 0; var7 < var5.length; ++var7) {
char var8 = var5[var7];
//System.out.print(var8 + ":");
//等于0时不处理,实际运行最后var6[var7] = var8;
if (var8 > '0' && var8 <= '9') {//48-57
var8 = (char) (58 - var8 + 48);//58-48+48=58=':' 58-49+48=57='9'....58-56+48=50='2' 58-57+48=49='1'
//System.out.println(var8);
}
if (var8 >= 'A' && var8 <= 'J') {//65-74
var8 = (char) (var8 - 17);//65-17=48='0' 74-17=57='9'
//System.out.println(var8);
}
if (var8 >= 'K' && var8 <= 'T') {//75-84
var8 = (char) (var8 - 27);//75-27=48='0' 84-27=57='9'
//System.out.println(var8);
}
if (var8 >= 'U' && var8 <= 'Z') {//85-90
var8 = (char) (var8 - 37);//85-37=48='0' 90-37=53='5'
//System.out.println(var8);
}
if (var8 >= 'a' && var8 <= 'd') {//97-100
var8 = (char) (var8 - 43);//97-43=54='6' 100-43=57='9'
//System.out.println(var8);
}
if (var8 >= 'e' && var8 <= 'n') {//101-110
var8 = (char) (var8 - 53);//101-53=48='0' 110-53=57='9'
//System.out.println(var8);
}
if (var8 >= 'o' && var8 <= 'x') {//111-120
var8 = (char) (var8 - 63);//111-63=48='0' 120-63=57='9'
//System.out.println(var8);
}
var6[var7] = var8;
}
return Long.parseLong(new String(var6));
}
逆算法,由long转String
public static String a(long l) {
char[][] chars = new char[][]{
{'0', '9', '8', '7', '6', '5', '4', '3', '2', '1'},
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
{'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
{'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd'},
{'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'},
{'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x'}
};
char[] var5=(l+"").toCharArray();
Random rom=new Random();
for (int i = 0; i < var5.length; i++) {
var5[i]= chars[rom.nextInt(chars.length)][Integer.parseInt(var5[i]+"")];
}
return new String(var5);
}
能力值:
( LV2,RANK:10 )
12 楼
不懂就问,虚心请教,这些包中的类是干什么用的?