国语视界

标题: 关于重编译混淆过的class [打印本页]

作者: filmfans    时间: 20-5-8 10:46
标题: 关于重编译混淆过的class
      玩转BD-J,得先把基础都搞明白。大家知道BD-J的代码是经过混淆的,目前研究一部影片的BD-J,在包的根目录里有很多class,我现在想重编译这个包里面某个目录下的class,但需要重编译的这个class要引用这个包内根目录下的很多class,经过反编译,我看到根目录下的class根本没有package设定,这样,根据java编译要求,其他目录下的要想引用这些class根本不可能,因为没有包名,我现在就是用javac命令行编译无论如何都编译不过去,怎么办?

     或许有人问我怎么不用eclipse(大金BD-J模块),都试过了,不成,也不想用那个,另外环境变量,javac的 -classpath该引用的包都加了,不是小白,这些最基础的问题都不是问题,另外还有人问怎么不直接字节码修改,要改的代码很多,不太现实,总之理论上重编译肯定可以的,但就是不知道用什么办法能正确编译,请前辈们指教!
作者: 世界哪有真情lu    时间: 20-5-8 12:18
吃下去的东西还能还原?反正我是没有见到工具能还原....
作者: filmfans    时间: 20-5-8 13:01
不是还原 是重编译
作者: filmfans    时间: 20-5-8 13:03
我不做菜单修改 也不知道修改菜单的是不是需要重编译 还仅仅是修改资源文件
作者: keyxt    时间: 20-5-9 00:03
等大神解答
作者: why1812    时间: 20-5-9 00:43
楼上的大神不要谦虚了
作者: filmfans    时间: 20-5-9 09:48
期待java资深玩家回答
作者: keyxt    时间: 20-5-9 10:41
why1812 发表于 20-5-9 00:43
楼上的大神不要谦虚了

白老师 黑老师 why大才是大神
作者: jack_son    时间: 20-5-10 22:04
其一,BDJ最基础的东西希望楼主去学习学习明白了再说;其二,原盘的BDJ代码并不是我们所看到的打包后的BDJ,更不是反编译后的BDJ代码
作者: 世界哪有真情lu    时间: 20-5-10 23:13
我直接说实话吧....BDJ菜单的java 代码不是人工写的.....用的GUI软件直接在上面设置制作而成的....各个发行商有自己的一套制作菜单GUI平台.......
ps设计排版psd 图层导入到软件设置相应关联后打包输出BDJ菜单(jar+证书+BDJO)...再用第三方软件制作软件打包各个素材做成BD和UHD

以下是GUI例子
........................................................................................................................................................................................
DVDLogic 家的java平台
https://www.dvd-logic.com/kite/kite_java
........................................................................................................................................................................................
Kaleidoscope  




作者: nnezyj    时间: 20-5-10 23:39
本帖最后由 nnezyj 于 20-5-11 09:19 编辑

这个和 BDJ 其实关系不大,实质是 java 编程问题了。
使用这类关键字进行百度搜索:被混淆的 java 代码反编译后的再编译问题。

命令行模式没用过,这个真不会,建议自行百度。
我百度了下,调用外部包,好像是 -cp 这个指令,-classpath 和它是有区别的,具体百度吧,太长就不复制过来了,-classpath 和 -cp 一个东西。
这是百度来的一个编译指令,我改了下,-cp 调用外部包,-d 输出的 class 文件储存目录,最后是要编译的 java 文件:
javac -g -verbose -encoding UTF-8 -cp jar\03001.jar; -d bin src\TEST.java

补充实际测试结果:
具体测试内容为,通过调用  Radius60 类型菜单的 03001.jar 外部包,获取 bin 文件编号。
通过 import xx; 语句,导入根目录下的类文件,调用其内的函数内容,import 导入无问题,测试编译正常,运行结果正常。

我测试的 java 文件位于 src 目录下,但不是 src 包。
以下是代码:

import be;

public class TEST {
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                //String a = bx.b();
                System.out.println("bin 文件编号:" + be.b());

        }
}





----------分割线-------------
关于混淆,谈点个人看法。
混淆不是一个文件的文件,是整个jar内的文件!
混淆,是基于字节码运行无误的前提下,尽最大可能去除直接反编译后无需修改就能直接编译的可能!

也就是说,你只想反编译一个文件,并对它进行编译,输出的 class 文件替换回原始 jar,并能正常播放这个目的,不是那么好实现的!

比如,十几个相同名字,仅参数不同的函数同在一个类文件里。
在字节码中,它是半机器码模式,不受高级语言的限制,类似汇编,一行一行执行,所有的调用,都有完整的路径参数属性限定,它能正常运行。
但在 java 代码下,就不行,因为它受到 java 代码规范的限制,不能出现这种状况!

你就要去修改它,让它正常工作,而修改过程中,就牵扯到被调用类是否也有类似问题!
牵一发而动全身,就是混淆的目的所在!
为了让想要的 java 文件正常编译,就需要将所有相关联的类文件的代码也做修正,直到最后保证想要的 java 文件,编译出来的字节码无误——即内部调用指向正确。

有关混淆,建议百度!

提一句,对 BDJ 的 jar 文件进行反编译,没有 package ,全在根目录下,我是很欢迎的!因为这就限制了混淆的程度,无法深层次混淆。
反而是,多个目录层级的那种,它全都是同一个字母命名,那时候的混淆,它可以做到极致,让你反编译都头疼!

作者: nnezyj    时间: 20-5-10 23:45
本帖最后由 nnezyj 于 20-5-10 23:53 编辑

再补充一句,关于这个问题:
另外还有人问怎么不直接字节码修改,要改的代码很多,不太现实,总之理论上重编译肯定可以的,但就是不知道用什么办法能正确编译

理论上是可以!
但是,当这里代码的修改,需要做的工作量,超出了修改字节码的时候!
我选择修改字节码!


题外话:
反编译,类比搞破解,当然这里没有那么高大上。
混淆是大厂以及高级程序员,为了保护自己作品做的一种保护手段。
所以,摆正解决问题的思路:我们就是在搞破解搞破坏,所以正统的代码编辑手段只是其中一种方式,能上代码当然是上代码更直观,但不行的时候,该上字节码还是得上字节码。
还有,不要小看混淆,要做好随时接受编译失败,以及解决混淆难度上限飙升的情况!

作者: keyxt    时间: 20-5-11 12:01
几位大佬终于来解答了 茅塞顿开  感谢大佬  学习了
作者: nnezyj    时间: 20-5-12 11:15
我看到根目录下的class根本没有package设定,这样,根据java编译要求,其他目录下的要想引用这些class根本不可能,因为没有包名,我现在就是用javac命令行编译无论如何都编译不过去,怎么办?


你用的 java 版本是多少?
不要用高版本的 java!
BDJ 支持的 java 版本是 1.5 !
作者: filmfans    时间: 20-5-12 13:35
nnezyj 发表于 20-5-12 11:15
你用的 java 版本是多少?
不要用高版本的 java!
BDJ 支持的 java 版本是 1.5 ! ...

是 1.5 其实版本再变,最基本的java规则没变

您有时间在不改变任何代码的情况下,亲自编译一下MagnoliaTheHunt.java,如果您编译过去了,是我太笨,如果您也编译不过去,我彻底死心了
作者: jack_son    时间: 20-5-12 16:39
filmfans 发表于 20-5-12 13:35
是 1.5 其实版本再变,最基本的java规则没变

您有时间在不改变任何代码的情况下,亲自编译一下MagnoliaT ...

教程都出了,你看了教程了吗?
作者: filmfans    时间: 20-5-12 16:55
jack_son 发表于 20-5-12 16:39
教程都出了,你看了教程了吗?


您说的是这个吗?

Magnolia Pictures BDJ 菜单修改
https://cnlang.org/bbs/forum.php ... digest%26digest%3D1
作者: nnezyj    时间: 20-5-13 23:53
filmfans 发表于 20-5-12 13:35
是 1.5 其实版本再变,最基本的java规则没变

您有时间在不改变任何代码的情况下,亲自编译一下MagnoliaT ...

先给出结论:不能编译过去!
作者: nnezyj    时间: 20-5-13 23:53
本帖最后由 nnezyj 于 20-5-14 00:19 编辑
filmfans 发表于 20-5-12 13:35
是 1.5 其实版本再变,最基本的java规则没变

您有时间在不改变任何代码的情况下,亲自编译一下MagnoliaT ...

先给出结论:不能编译过去!

因为你的大前提:“在不改变任何代码的情况下”,结果是不能编译过去!
编译已经给出明确的报错,如果不修改报错,测试上万次,也是无法编译过去!


------------- 分割线 ------------------
反编译出来的 MagnoliaTheHunt.java 文件里:

这两个变量字段名:
  private static String h;
  private String l = System.getProperty("file.separator");
与以下调用语句中的调用类 l.class 、h.class  类名冲突:
  l.a();
  h.a();
因为变量为 private,可以直接改变量名


还有这个变量字段名:
  public static XletContext e;
  public static String a;
与以下调用语句中的调用类 a.class 、e.class 类名冲突:
  a.a(str2)
  e.a();
这里的变量为 public 类型,修改方法和上面的直接改变量名不一样,因为 public 有外部调用!
只能对代码句下手。


这以上的报错不处理,我不知道,要怎么编译过去,不改变代码,它一直报错,编译几百次它也过不去啊!大哥!



是 1.5 其实版本再变,最基本的java规则没变

这里真不能这么说!
低版本对于代码编写规则没有那么强制的限制。譬如根目录下,没有 package 的类,低版本可以编译,高版本会报错!
还有某些API,高版本弃用了!

我让你转用低版本 java,就是为了避开以下编译报错!
我看到根目录下的class根本没有package设定,这样,根据java编译要求,其他目录下的要想引用这些class根本不可能,因为没有包名,我现在就是用javac命令行编译无论如何都编译不过去,怎么办?

你是不是装了多个 java 版本?

建议通过命令提示符,直接指定到低版本的 jdk 或 jre 里,调用 javac.exe 去编译 .java 文件!
譬如:
D:\>"C:\Program Files (x86)\Java\jdk1.8.0_201\bin\javac.exe"  -g -verbose -encoding UTF-8 -cp 03001.jar; TEST.java

作者: filmfans    时间: 20-5-14 08:41
本帖最后由 filmfans 于 20-5-14 12:57 编辑
nnezyj 发表于 20-5-13 23:53
先给出结论:不能编译过去!


抱歉,是我的问题,我的本意是要表达的是不改变任何代码逻辑的情况去编译,
作者: filmfans    时间: 20-5-14 08:43
nnezyj 发表于 20-5-13 23:53
先给出结论:不能编译过去!

因为你的大前提:“在不改变任何代码的情况下”,结果是不能编译过去!

你是不是装了多个 java 版本?

必须装多个版本,因为要运行的java程序要求更多,但环境变量已正确设置1.5
作者: jack_son    时间: 20-5-14 12:07
filmfans 发表于 20-5-14 08:41
可能您理解有误,我表达的是不改变任何代码逻辑的情况去编译,为了避让混淆带来的问题,让代码顺利编译, ...

你去JAVA开发论坛提问吧,此站不适合你这种大佬
作者: hyb9373    时间: 20-5-14 12:20
1,我所有的东西都懂的,但就是编译不过去
2,有些工具我不想用,不好用,字节码太麻烦,也不用
3,不改任何代码的情况下你们试试
4,那是你理解有误
作者: filmfans    时间: 20-5-14 12:59
对各位前辈的批评虚心接受,感谢各位的指导,我会继续努力学习,多为论坛贡献
作者: nnezyj    时间: 20-5-14 17:53
我看到根目录下的class根本没有package设定,这样,根据java编译要求,其他目录下的要想引用这些class根本不可能,因为没有包名,我现在就是用javac命令行编译无论如何都编译不过去,怎么办?


javac 命令行编译,这一块,我的确不知道该怎么操作!
编译位于 package 下的类,出现调用无 package 的类的 import 语句无效问题!
这个我的确不知道该怎么弄!

这个问题,建议还是到搞 java 编程的专业论坛问吧,我是搞不定,百度也没搜索到!
作者: filmfans    时间: 20-5-14 20:22
nnezyj 发表于 20-5-14 17:53
javac 命令行编译,这一块,我的确不知道该怎么操作!
编译位于 package 下的类,出现调用无 package 的 ...

感谢您一直对我的无私帮助,我觉得根目录下的class包名的缺失可能是混淆的结果,综合前面的讨论,等时间充裕我试着用字节码的方式来试着改改
作者: nnezyj    时间: 20-5-14 21:44
本帖最后由 nnezyj 于 20-5-14 22:33 编辑
filmfans 发表于 20-5-14 20:22
感谢您一直对我的无私帮助,我觉得根目录下的class包名的缺失可能是混淆的结果,综合前面的讨论,等时间 ...


和混淆没有关系!
这是命令行编译的问题!

用 Eclipse 吧,用它倒是可以编译!

作者: filmfans    时间: 20-5-14 22:30
等我再试试 如果还有问题到时候麻烦您再帮我看看
作者: nnezyj    时间: 20-5-14 22:34
本帖最后由 nnezyj 于 20-5-14 22:57 编辑
filmfans 发表于 20-5-14 22:30
等我再试试 如果还有问题到时候麻烦您再帮我看看


javac.exe 的命令行编译模式,真的是太难了,有 Eclipse IDE 为啥不用呢?
小白我投降了!用过命令行模式以后,太打击人,完全不给活路,怎么操作都搞不定,同样的代码文件,在 Eclipse IDE 下就能出来了!

大佬自己研究吧!
我又不是程序员,搞命令行这种操作太高端了!不想为难自己了!我放弃!


-------------- 分割线 ----------------------
谈点个人看法:

使用 javac.exe 命令行,应该就意味着代码的编写要严格遵守 java 规范,毕竟使用了 jdk 来编译,jdk 是 java 的官方工具,不遵守官方规则,怎么能编译成功呢!
这应该就是,一直编译报错的缘故吧。

然后反编译出来的文件,我们也看到了,没有 package 的,位于根目录下的大批文件!
不符合命名规则的开头小写字母类名等等。
甚至有 if 、 do 这样的,和关键字冲突的变量名、类名等等!
如果按照 java 规则来说,这都是死死的报错!

根据网上百度到的说明,class 文件是 java 机器码文件,机器码模式下,是没有 if 、do 等问题的,它只要符合机器码的运行规则,它就能运行!

所以,使用 jdk 官方工具 javac.exe 来编译文件,我觉得一开始就是错误的选择!
把自己扔到死胡同里!

本来就是非标操作,IDE 工具能解决问题,为什么不用呢?

以上纯属小白用户我的个人牢骚!

也期待大佬找到命令行下编译通过的方法,并分享之!

以上,完毕!

作者: filmfans    时间: 20-5-14 23:10
nnezyj 发表于 20-5-14 22:34
javac.exe 的命令行编译模式,真的是太难了,有 Eclipse IDE 为啥不用呢?
小白我投降了!用过命令行模式 ...

跟您比我真是差太远了,当初的想法只是想从本质上搞懂这个,摸索过程中肯定会有很多挫折,我觉得这个问题可以暂时放置一段时间,随着其他辅助知识的慢慢丰富,我想自然会迎刃而解
作者: keyxt    时间: 20-5-16 01:34
加油~~~




欢迎光临 国语视界 (https://bbs.cnlang.org/) Powered by Discuz! X3.4