(编辑:jimmy 日期: 2024/12/24 浏览:2)
author:永恒陌
date:2021年6月23日本贴仅用于学习交流,禁止用于商业用途
起因
为什么想起来尝试破解这个呢,这是公司用的写字机的上位机,发现里边的程序时java的,插着加密狗,有点好奇java是怎么读狗的,到最后也没研究明白,只研究到了它是调用dll的某个函数读狗的,dll逆向还看不懂
也是因为它是java的,会写java,有初步的了解,才敢下手尝试的。前言
破解的过程中也是取巧了,没有对解密函数进行分析(实在看不懂),提取了了已有的一个加密狗的生成的值,硬编码到了程序里边,令读狗函数固定返回这个硬编码。
废话也会很多,很详细的记录了过程心得
勇于尝试,车到山前必有路。
中途遇到了一些小麻烦,反正是解决了。后边详述
- winrar(足够了)
- jd-gui-1.6.6.jar
- jadx-gui-1.2.0-no-jre-win.exe
- luyten-0.5.4.exe(没用上)
- jclasslib_win64_5_8.exe
- 010Editor v11.0.1 汉化特别版
- IDA_Pro_v7.0_Portable
最后,写java代码的idea就不用介绍了吧,各位爱用啥用啥就是了
下载安装跳过
由于不会exe的逆向,而且体积这么大的一个jar,很值得打开瞧瞧。
直接用jar反编译工具打开,先找main函数(java的入口函数)
2.png
3.png
4.png
5.png
6.png
然后我还尝试用IDA查看了这个jsyunew3.dll的NewReadString,嗯,压根看不懂。就更没办法写注册机了(加密狗写注册机有毛用!摔!)
这个类上边有这个名字,这应该就是java加载dll的方式,但是还没研究明白,知道它加载了dll,调用了dll的函数,研究破解来说知道这些够用了,
就是这行调用了dll,确信,下边这些肯定就是形如接口一样的东西了。
static { System.load(b.e(String.valueOf(String.valueOf(Platform.is64Bit() ? "x64" : "x86")) + "/jsyunew3.dll").getAbsolutePath()); } public static native int GetVersion(final String p0); public static native int GetVersionEx(final String p0); public static native long GetID_1(final String p0); public static native long GetID_2(final String p0); public static native long get_LastError(); public static native String FindPort(final int p0); public static native String NewReadString(final int p0, final int p1, final String p2, final String p3, final String p4); public static native int ReSet(final String p0);
然后我就想到了第二个破解思路:能不能让这个return直接返回这个硬编码的字符串,以及那个FindPort函数能不能直接返回一个正确的值,这样就可以比较小的修改了,然后结果就是,不会!然后当场放弃。
7.png
8.png
9.png
10.png
11.png
12.png
13.png
14.png
15.png
17.png
18.png
19.png
20.png
21.png
导出成文件写的代码也比较水,凑合看,这就是上边图例收起来的代码
也是通过导出s,判断出来传进来的s就是类的包名+类名,然后就这样输出了所有文件
//尝试输出byteString d = s.replace(".","\\");File file3 = new File("testtest\\"+d+"class");if (!file3.getParentFile().exists()) { file3.getParentFile().mkdirs();}else { file3.renameTo(new File("testtest\\" + d + ".class1"));}file3.createNewFile();OutputStream out3 = new FileOutputStrea(file3);InputStream is3 = new ByteArrayInputStrea(a);byte[] buff3 = new byte[1024];int len3 = 0;while((len3=is3.read(buff3))!=-1){ out3.write(buff3, 0, len3);}is3.close();out3.close();
为啥要判断文件是否存在,是因为! core这个jar同路径下有大小写不同的两个同名class(混淆过)! 在windows下不区分大小写!然后我就装了个linux虚拟机,又是一上午。下了个arm64的 咋都装不进vmware,后来发现下错了,然后才下了个x86_x64的。然后问百度找linux替换class的命令,鼓捣jdk之类的,放进去了。
22.png
24.png
26.png
27.png
一边写一边复盘了整个过程,发现有很多地方确实是运气好,比如一开始,壳都没有查,混淆也没看,结果就是没有混淆没有壳,然后我才能很顺利的将第一个jar给反编译之后修改并编译回去。
提供下载链接
源文件:
链接:https://pan.baidu.com/s/1L-eCjF739AQD9BDml6_tCQ
提取码:gvhz