LoRyu 发表于 2020-11-10 21:57

Java写的第二个CM

本帖最后由 LoRyu 于 2020-11-11 06:25 编辑

上一次发了cm之后,学习到了很多,发现自己挺多问题的
这次改进了很多,依旧是java写的,易语言打包,不过这次有Native混淆,所以还用上了C++
需要安装并配置MinGW
望大佬们指教 :)

Ravey 发表于 2020-11-12 12:42

LoRyu 发表于 2020-11-12 12:16
厉害啊,能讲下过程吗兄弟

1. 在equals下断点,发现没有调用,我猜可能是遍历数组进行比对
2. 首先随便输入一个字符,在toCharArray下断点,可以看到这个字符被转换成unicode字符,然后unicode字符还会被转义一次,然后出现了一个奇怪的字符串,长度为16,跟unicode字符被转义后的长度一致
3. 看到Check里面有个奇怪的变量,下断点查看一下,看起来也是经过转换,但是长度为288,所以应该是真实长度为18的key
4. 看了一下Frame这个类,可以看出混淆后的常量都被放进了一个int数组变量,下断点记录一下
5. 然后发现checkString里面的流程非常复杂,不过可以先找调用SetCharArrayRegion的地方,然后一直往上找,找到GetIntArrayRegion,这里是从第四步的int数组读取常量,再往上找可以找到switch的跳转表,总共12处地方
6. 最后得出映射表,写个脚本还原一下在第三步得到的字符串即可

云在天 发表于 2020-11-11 19:23



虚拟机没有Java环境就不搞了,只把jar和dll提出来看了看dll

给各位个建议,静态就 不要搞了,一层native就挺恶心的了,还有一层混淆

有 环境的可以下个断点调试看看

Ravey 发表于 2020-11-12 08:36


这混淆也太多层了吧 :lol

75292875 发表于 2020-11-12 11:23

好像运行会自动退掉

小萌新一个 发表于 2020-11-12 11:51

萌新想问问KeyGen所产生的key是试出原先程序就有的key,还是重新生成新的key去“骗过”程序?

LoRyu 发表于 2020-11-12 12:16

Ravey 发表于 2020-11-12 08:36
这混淆也太多层了吧

厉害啊,能讲下过程吗兄弟

LoRyu 发表于 2020-11-12 12:46

Ravey 发表于 2020-11-12 12:42
1. 在equals下断点,发现没有调用,我猜可能是遍历数组进行比对
2. 首先随便输入一个字符,在toCharArra ...

native方法也可以用jdb调试吗

Ravey 发表于 2020-11-12 12:53

LoRyu 发表于 2020-11-12 12:46
native方法也可以用jdb调试吗

不能,这次我用IDE的debugger调试,方便查看char数组
然后native方法我是用ida pro静态分析

LoRyu 发表于 2020-11-12 12:57

Ravey 发表于 2020-11-12 12:53
不能,这次我用IDE的debugger调试,方便查看char数组
然后native方法我是用ida pro静态分析
6,厉害
页: [1] 2
查看完整版本: Java写的第二个CM