国语视界

 找回密码
 立即注册
查看: 7844|回复: 31

[技术交流] 关于重编译混淆过的class

[复制链接]

104

主题

733

帖子

1848

积分

营长

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

     或许有人问我怎么不用eclipse(大金BD-J模块),都试过了,不成,也不想用那个,另外环境变量,javac的 -classpath该引用的包都加了,不是小白,这些最基础的问题都不是问题,另外还有人问怎么不直接字节码修改,要改的代码很多,不太现实,总之理论上重编译肯定可以的,但就是不知道用什么办法能正确编译,请前辈们指教!

13

主题

918

帖子

1313

积分

论坛大神

大洋
20750
阅读权限
130
发表于 20-5-8 12:18 | 显示全部楼层
吃下去的东西还能还原?反正我是没有见到工具能还原....
回复 支持 反对

使用道具 举报

104

主题

733

帖子

1848

积分

营长

大洋
54244
阅读权限
50
 楼主| 发表于 20-5-8 13:01 | 显示全部楼层
不是还原 是重编译
回复 支持 反对

使用道具 举报

104

主题

733

帖子

1848

积分

营长

大洋
54244
阅读权限
50
 楼主| 发表于 20-5-8 13:03 | 显示全部楼层
我不做菜单修改 也不知道修改菜单的是不是需要重编译 还仅仅是修改资源文件
回复 支持 反对

使用道具 举报

本站网友  发表于 70-1-1 08:00
post_deleted

8

主题

254

帖子

1939

积分

论坛贵宾

大洋
85975
阅读权限
130
发表于 20-5-9 00:03 | 显示全部楼层
等大神解答
回复 支持 反对

使用道具 举报

79

主题

2021

帖子

1392

积分

版主

大洋
71423
阅读权限
140

灌水之王热心会员

发表于 20-5-9 00:43 | 显示全部楼层
楼上的大神不要谦虚了
回复 支持 反对

使用道具 举报

104

主题

733

帖子

1848

积分

营长

大洋
54244
阅读权限
50
 楼主| 发表于 20-5-9 09:48 | 显示全部楼层
期待java资深玩家回答
回复 支持 反对

使用道具 举报

8

主题

254

帖子

1939

积分

论坛贵宾

大洋
85975
阅读权限
130
发表于 20-5-9 10:41 | 显示全部楼层
why1812 发表于 20-5-9 00:43
楼上的大神不要谦虚了

白老师 黑老师 why大才是大神
回复 支持 反对

使用道具 举报

9

主题

492

帖子

562

积分

连长

大洋
2991
阅读权限
40
发表于 20-5-10 22:04 | 显示全部楼层
其一,BDJ最基础的东西希望楼主去学习学习明白了再说;其二,原盘的BDJ代码并不是我们所看到的打包后的BDJ,更不是反编译后的BDJ代码
回复 支持 反对

使用道具 举报

13

主题

918

帖子

1313

积分

论坛大神

大洋
20750
阅读权限
130
发表于 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  



评分

参与人数 1大洋 +60 收起 理由
why1812 + 60 厉害了我的神!

查看全部评分

回复 支持 反对

使用道具 举报

46

主题

1475

帖子

3001

积分

版主

大洋
21045
阅读权限
140
发表于 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 ,全在根目录下,我是很欢迎的!因为这就限制了混淆的程度,无法深层次混淆。
反而是,多个目录层级的那种,它全都是同一个字母命名,那时候的混淆,它可以做到极致,让你反编译都头疼!

评分

参与人数 1大洋 +60 收起 理由
why1812 + 60 厉害了我的神!

查看全部评分

回复 支持 反对

使用道具 举报

46

主题

1475

帖子

3001

积分

版主

大洋
21045
阅读权限
140
发表于 20-5-10 23:45 | 显示全部楼层
本帖最后由 nnezyj 于 20-5-10 23:53 编辑

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

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


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

使用道具 举报

8

主题

254

帖子

1939

积分

论坛贵宾

大洋
85975
阅读权限
130
发表于 20-5-11 12:01 | 显示全部楼层
几位大佬终于来解答了 茅塞顿开  感谢大佬  学习了
回复 支持 反对

使用道具 举报

46

主题

1475

帖子

3001

积分

版主

大洋
21045
阅读权限
140
发表于 20-5-12 11:15 | 显示全部楼层
我看到根目录下的class根本没有package设定,这样,根据java编译要求,其他目录下的要想引用这些class根本不可能,因为没有包名,我现在就是用javac命令行编译无论如何都编译不过去,怎么办?


你用的 java 版本是多少?
不要用高版本的 java!
BDJ 支持的 java 版本是 1.5 !
回复 支持 反对

使用道具 举报

104

主题

733

帖子

1848

积分

营长

大洋
54244
阅读权限
50
 楼主| 发表于 20-5-12 13:35 | 显示全部楼层
nnezyj 发表于 20-5-12 11:15
你用的 java 版本是多少?
不要用高版本的 java!
BDJ 支持的 java 版本是 1.5 ! ...

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

您有时间在不改变任何代码的情况下,亲自编译一下MagnoliaTheHunt.java,如果您编译过去了,是我太笨,如果您也编译不过去,我彻底死心了
回复 支持 反对

使用道具 举报

9

主题

492

帖子

562

积分

连长

大洋
2991
阅读权限
40
发表于 20-5-12 16:39 | 显示全部楼层
filmfans 发表于 20-5-12 13:35
是 1.5 其实版本再变,最基本的java规则没变

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

教程都出了,你看了教程了吗?
回复 支持 反对

使用道具 举报

104

主题

733

帖子

1848

积分

营长

大洋
54244
阅读权限
50
 楼主| 发表于 20-5-12 16:55 | 显示全部楼层
jack_son 发表于 20-5-12 16:39
教程都出了,你看了教程了吗?


您说的是这个吗?

Magnolia Pictures BDJ 菜单修改
https://cnlang.org/bbs/forum.php ... digest%26digest%3D1
回复 支持 反对

使用道具 举报

46

主题

1475

帖子

3001

积分

版主

大洋
21045
阅读权限
140
发表于 20-5-13 23:53 | 显示全部楼层
filmfans 发表于 20-5-12 13:35
是 1.5 其实版本再变,最基本的java规则没变

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

先给出结论:不能编译过去!
回复 支持 反对

使用道具 举报

46

主题

1475

帖子

3001

积分

版主

大洋
21045
阅读权限
140
发表于 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

点评

哈哈,不改变任何代码  发表于 20-5-14 00:07
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表