国语视界

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

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

[复制链接]
  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

    大洋
    1632
    矿工
    0
    发表于 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该引用的包都加了,不是小白,这些最基础的问题都不是问题,另外还有人问怎么不直接字节码修改,要改的代码很多,不太现实,总之理论上重编译肯定可以的,但就是不知道用什么办法能正确编译,请前辈们指教!

    该用户从未签到

    5

    主题

    395

    帖子

    200

    积分

    论坛大神

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

    使用道具 举报

  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

    大洋
    1632
    矿工
    0
     楼主| 发表于 20-5-8 13:01 | 显示全部楼层
    不是还原 是重编译
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

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

    使用道具 举报

  • TA的每日心情
    开心
    17-7-14 14:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    177

    帖子

    1738

    积分

    论坛贵宾

    Rank: 13Rank: 13Rank: 13Rank: 13

    大洋
    23604
    矿工
    30
    发表于 20-5-9 00:03 | 显示全部楼层
    等大神解答
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    20-3-9 23:41
  • 签到天数: 118 天

    [LV.6]常住居民II

    73

    主题

    1752

    帖子

    1569

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    大洋
    65984
    矿工
    50

    灌水之王热心会员

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

    使用道具 举报

  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

    大洋
    1632
    矿工
    0
     楼主| 发表于 20-5-9 09:48 | 显示全部楼层
    期待java资深玩家回答
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    17-7-14 14:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    177

    帖子

    1738

    积分

    论坛贵宾

    Rank: 13Rank: 13Rank: 13Rank: 13

    大洋
    23604
    矿工
    30
    发表于 20-5-9 10:41 | 显示全部楼层
    why1812 发表于 20-5-9 00:43
    楼上的大神不要谦虚了

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

    使用道具 举报

  • TA的每日心情
    开心
    20-1-1 21:40
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    9

    主题

    420

    帖子

    543

    积分

    连长

    Rank: 4

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

    使用道具 举报

    该用户从未签到

    5

    主题

    395

    帖子

    200

    积分

    论坛大神

    大洋
    2578
    矿工
    0
    QQ
    发表于 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 厉害了我的神!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    20-6-2 22:55
  • 签到天数: 859 天

    [LV.10]以坛为家III

    32

    主题

    1136

    帖子

    2260

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    大洋
    9799
    矿工
    9
    发表于 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 厉害了我的神!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    20-6-2 22:55
  • 签到天数: 859 天

    [LV.10]以坛为家III

    32

    主题

    1136

    帖子

    2260

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    大洋
    9799
    矿工
    9
    发表于 20-5-10 23:45 | 显示全部楼层
    本帖最后由 nnezyj 于 20-5-10 23:53 编辑

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

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


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

    使用道具 举报

  • TA的每日心情
    开心
    17-7-14 14:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    177

    帖子

    1738

    积分

    论坛贵宾

    Rank: 13Rank: 13Rank: 13Rank: 13

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

    使用道具 举报

  • TA的每日心情
    奋斗
    20-6-2 22:55
  • 签到天数: 859 天

    [LV.10]以坛为家III

    32

    主题

    1136

    帖子

    2260

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

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


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

    使用道具 举报

  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    20-1-1 21:40
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    9

    主题

    420

    帖子

    543

    积分

    连长

    Rank: 4

    大洋
    4390
    矿工
    0
    发表于 20-5-12 16:39 | 显示全部楼层
    filmfans 发表于 20-5-12 13:35
    是 1.5 其实版本再变,最基本的java规则没变

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

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

    使用道具 举报

  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

    大洋
    1632
    矿工
    0
     楼主| 发表于 20-5-12 16:55 | 显示全部楼层
    jack_son 发表于 20-5-12 16:39
    教程都出了,你看了教程了吗?


    您说的是这个吗?

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

    使用道具 举报

  • TA的每日心情
    奋斗
    20-6-2 22:55
  • 签到天数: 859 天

    [LV.10]以坛为家III

    32

    主题

    1136

    帖子

    2260

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    大洋
    9799
    矿工
    9
    发表于 20-5-13 23:53 | 显示全部楼层
    filmfans 发表于 20-5-12 13:35
    是 1.5 其实版本再变,最基本的java规则没变

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    20-6-2 22:55
  • 签到天数: 859 天

    [LV.10]以坛为家III

    32

    主题

    1136

    帖子

    2260

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    大洋
    9799
    矿工
    9
    发表于 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
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    20-6-4 14:21
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    15

    主题

    189

    帖子

    276

    积分

    排长

    Rank: 3Rank: 3

    大洋
    1632
    矿工
    0
     楼主| 发表于 20-5-14 08:41 | 显示全部楼层
    本帖最后由 filmfans 于 20-5-14 12:57 编辑
    nnezyj 发表于 20-5-13 23:53
    先给出结论:不能编译过去!


    抱歉,是我的问题,我的本意是要表达的是不改变任何代码逻辑的情况去编译,
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    Archiver|手机版|cnlang.org

    GMT+8, 20-6-4 20:16 , Processed in 0.025105 second(s), 12 queries , Gzip On, MemCache On.

    Powered by Discuz! X3.4

    © 2001-2018 Comsenz Inc.

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