精华内容
下载资源
问答
  • 注意:本教程仅供学习交流之用,请勿用于非法用途。对于本教程带来的所有后果,作者均不承担任何法律责任。 ...本文介绍了如何从Jar2Exe编译的exe文件中提取原始的类文件。 Jar2Exe一共有三

    注意:本教程仅供学习交流之用,请勿用于非法用途。对于本教程带来的所有后果,作者均不承担任何法律责任。


    背景:Jar2Exe是一款优秀的java源码加密软件,它能够将jar包加密为本地能够执行的exe文件,并能够附带Java语言运行时(JRE),从而免除了客户机器需要安装JRE等繁琐的步骤。本文介绍了如何从Jar2Exe编译的exe文件中提取原始的类文件。


    Jar2Exe一共有三种加密方式:

    1. 明文:如下图所示,在编译时如不勾选 “隐藏类文件” 或“加密并隐藏类文件”的话,Jar2Exe会将Jar包以 明文 存储在Exe程序中,这是第一种方式,也是最容易被提取的一种方式。

    2. 隐藏:如勾选“隐藏类文件”,Jar包会被经过简单的加密之后存储在Exe程序中的资源中,对于破解而言也只是简单难度。

    3. 加密:如勾选“加密并隐藏类文件”,Jar包会被加密,并且所有文件名都会被哈希,之后存储在Exe程序的资源中。这是最常见的一种加密,也是相对最麻烦的一种提取方式。相信读者最关心的就是如何从这种加密的Exe文件中提取出jar包来。



    对于第一种明文的编译方式,提取的方法非常简单。只需要用压缩软件打开要破解的Exe文件,即可看到所有class文件,相信这个方法读者应该都很清楚,不用我多说了。


    对于第二、三种 隐藏和加密的方式,要提取出完成的jar包,需要用到Ollydbg调试被加密的Exe程序,在解密代码刚执行完的地方下断点中断,从内存中dump出jar包,再还原原本的文件名。其中过程比较繁琐,我会在下一篇教程中再写出步骤和放出工具来。


    本篇教程会先介绍一个更加简单的方法来提取出Jar2Exe加密的类文件。该方法的思路如下:

    首先构建一个Java代理(JavaAgent),JavaAgent是JDK1.5之后出现的一个功能,目的是让程序员可以更加灵活的监控Java虚拟机的运行。但它的功能实在太强大,甚至可以让你修改一个类的定义。而我们要做的就是编写一个JavaAgent,并监控ClassLoader,在它要加载一个类的时候,dump出这个类来并写入一个jar文件中就可以了。这个JavaAgent是很general的,可以用在不同的jar上面。本文后面会提供一个该JavaAgent的实现。


    然后你就可以通过设置java有关的的环境变量来激活该JavaAgent。接着运行Jar2Exe编译的Exe程序。尽可能多的测试程序中的功能,点击不同的按钮,让更多的类文件被加载到内存中,这样它们就会被dump出来。或者只测试你关心的部分,比如某个模块或登录授权。最后结束程序,就可以在dump出来的jar包中找到需要的类文件。


    可以看出,这种方法非常的简单易行。但同时也有一些缺点:比如如果一个类没有被加载过的话是提取不出来的。这也就导致了导出的源代码会因为缺少一些类而无法被重新编译。只能观察和学习反编译的源代码,或自行补全。另外原Jar包中的资源文件(例如文本文件、声音、图片)是没有办法提取出来的。(但也不是完全没有办法,后面我们会讲如何再提取这些资源文件)。而使用ollydbg调试并导出原始的Jar包并不存在这些问题,能够提取出所有的类文件以及资源文件,就算它们没有被加载。这种方法会在下一篇中介绍。


    我们先来介绍上面提到的使用JavaAgent从内存中提取Jar2exe加密的类文件的步骤


    1.     打开命令行并进入要破解的程序所在目录


    2.     将e2j-agent-1.6.jar文件放在同一目录下,该JavaAgent下载地址:http://sshwind.com/e2j-agent-1.6.jar ,或从我的Github空间下载:https://github.com/ravinow/e2j


    3.     在命令行输入以下命令设置JavaAgent的加载:

    set JAVA_TOOL_OPTIONS=-javaagent:e2j-agent-1.6.jar

    成功不会有任何输出。该命令是让java程序在加载一个类时会自动调用JavaAgent。

    4.     执行你要破解的程序:

    然后尽量测试每一项功能,使它加载全部的类。

    5.     结束程序,然后在当前目录下会多出一个e2j-dump.jar,这就是提取出的类文件包。

    6.     到这已经成功了,如果需要它能够直接被运行的话还需要往里自行补充MANIFEST.MF文件。


    如上所说,该方法简单易行,但可能无法提取出所有类文件及资源文件。更加有效的方法会在下一篇介绍,如果对内容有任何疑问或谈合作事宜欢迎联系QQ:627083940,转载请保留作者联系方式及原文链接。


    另附资源文件的提取方法:

    Java毕竟是一种在虚拟机中运行的语言,所有的操作都需要JRE的支持。所以我们可以修改JRE中的有关加载资源的API的代码,在加载资源的同时把它们dump出来。原理类似上面JavaAgent的实现。效果也同JavaAgent一样,在程序运行时必须让资源文件被加载到内存中才能dump出来。


    具体步骤是:

    1、 打开JDK安装目录下的src.zip,这里有大部分Java API的源文件。

    2、 找到java/lang/class.java,修改getResource和getResourceAsStream方法,使它们在返回结果前dump出要读取的资源文件。如果需要的话一并修改其它涉及到加载资源文件的类和方法。

    3、编译修改过的源文件,并将编译出来的class文件复制进JRE安装目录下的lib/rt.jar包中,覆盖原文件。(注意:编辑的JDK源文件版本必须与现有JRE版本相匹配,不然会出现问题)

    4、运行目标程序,尽可能多的测试功能,让资源文件被加载。这样你就能在目录下找到dump出来的资源文件了。





    展开全文
  • VB反编译,可以恢复所有的vb工程的所有窗口和代码,即时软件加壳也可以成功反编译
  • 提取经过Jar2Exe编译加密的源代码

    千次阅读 2017-03-31 15:39:59
    注意:本教程仅供学习交流之用,请勿用于非法用途。...背景:Jar2Exe是一款优秀的Java源码加密软件,它能够将jar包加密为本地能够执行的exe文件,并能够附带Java语言运行时(JRE),从而免除了客户机器需要安装JRE等

    注意:本教程仅供学习交流之用,请勿用于非法用途。对于本教程带来的所有后果,作者均不承担任何法律责任。

    出处:http://blog.csdn.net/ravinow/article/details/51123839

    背景:Jar2Exe是一款优秀的Java源码加密软件,它能够将jar包加密为本地能够执行的exe文件,并能够附带Java语言运行时(JRE),从而免除了客户机器需要安装JRE等繁琐的步骤。本文介绍了如何从Jar2Exe编译的exe文件中提取原始的类文件。


    Jar2Exe一共有三种加密方式:

    1. 明文:如下图所示,在编译时如不勾选 “隐藏类文件” 或“加密并隐藏类文件”的话,Jar2Exe会将Jar包以 明文 存储在Exe程序中,这是第一种方式,也是最容易被提取的一种方式。

    2. 隐藏:如勾选“隐藏类文件”,Jar包会被经过简单的加密之后存储在Exe程序中的资源中,对于破解而言也只是简单难度。

    3. 加密:如勾选“加密并隐藏类文件”,Jar包会被加密,并且所有文件名都会被哈希,之后存储在Exe程序的资源中。这是最常见的一种加密,也是相对最麻烦的一种提取方式。相信读者最关心的就是如何从这种加密的Exe文件中提取出jar包来。



    对于第一种明文的编译方式,提取的方法非常简单。只需要用压缩软件打开要破解的Exe文件,即可看到所有class文件,相信这个方法读者应该都很清楚,不用我多说了。


    对于第二、三种 隐藏和加密的方式,要提取出完成的jar包,需要用到Ollydbg调试被加密的Exe程序,在解密代码刚执行完的地方下断点中断,从内存中dump出jar包,再还原原本的文件名。其中过程比较繁琐,我会在下一篇教程中再写出步骤和放出工具来。


    本篇教程会先介绍一个更加简单的方法来提取出Jar2Exe加密的类文件。该方法的思路如下:

    首先构建一个Java代理(JavaAgent),JavaAgent是JDK1.5之后出现的一个功能,目的是让程序员可以更加灵活的监控Java虚拟机的运行。但它的功能实在太强大,甚至可以让你修改一个类的定义。而我们要做的就是编写一个JavaAgent,并监控ClassLoader,在它要加载一个类的时候,dump出这个类来并写入一个jar文件中就可以了。这个JavaAgent是很general的,可以用在不同的jar上面。本文后面会提供一个该JavaAgent的实现。


    然后你就可以通过设置java有关的的环境变量来激活该JavaAgent。接着运行Jar2Exe编译的Exe程序。尽可能多的测试程序中的功能,点击不同的按钮,让更多的类文件被加载到内存中,这样它们就会被dump出来。或者只测试你关心的部分,比如某个模块或登录授权。最后结束程序,就可以在dump出来的jar包中找到需要的类文件。


    可以看出,这种方法非常的简单易行。但同时也有一些缺点:比如如果一个类没有被加载过的话是提取不出来的。这也就导致了导出的源代码会因为缺少一些类而无法被重新编译。只能观察和学习反编译的源代码,或自行补全。另外原Jar包中的资源文件(例如文本文件、声音、图片)是没有办法提取出来的。(但也不是完全没有办法,后面我们会讲如何再提取这些资源文件)。而使用ollydbg调试并导出原始的Jar包并不存在这些问题,能够提取出所有的类文件以及资源文件,就算它们没有被加载。这种方法会在下一篇中介绍。


    我们先来介绍上面提到的使用JavaAgent从内存中提取Jar2exe加密的类文件的步骤


    1.     打开命令行并进入要破解的程序所在目录


    2.     将e2j-agent-1.6.jar文件放在同一目录下,该JavaAgent下载地址:http://sshwind.com/e2j-agent-1.6.jar ,或从我的Github空间下载:https://github.com/ravinow/e2j


    3.     在命令行输入以下命令设置JavaAgent的加载:

    set JAVA_TOOL_OPTIONS=-javaagent:e2j-agent-1.6.jar

    成功不会有任何输出。该命令是让java程序在加载一个类时会自动调用JavaAgent。

    4.     执行你要破解的程序:

    然后尽量测试每一项功能,使它加载全部的类。

    5.     结束程序,然后在当前目录下会多出一个e2j-dump.jar,这就是提取出的类文件包。

    6.     到这已经成功了,如果需要它能够直接被运行的话还需要往里自行补充MANIFEST.MF文件。


    如上所说,该方法简单易行,但可能无法提取出所有类文件及资源文件。更加有效的方法会在下一篇介绍,如果对内容有任何疑问或谈合作事宜欢迎联系QQ:627083940,转载请保留作者联系方式及原文链接。


    另附资源文件的提取方法:

    Java毕竟是一种在虚拟机中运行的语言,所有的操作都需要JRE的支持。所以我们可以修改JRE中的有关加载资源的API的代码,在加载资源的同时把它们dump出来。原理类似上面JavaAgent的实现。效果也同JavaAgent一样,在程序运行时必须让资源文件被加载到内存中才能dump出来。


    具体步骤是:

    1、 打开JDK安装目录下的src.zip,这里有大部分Java API的源文件。

    2、 找到java/lang/class.java,修改getResource和getResourceAsStream方法,使它们在返回结果前dump出要读取的资源文件。如果需要的话一并修改其它涉及到加载资源文件的类和方法。

    3、编译修改过的源文件,并将编译出来的class文件复制进JRE安装目录下的lib/rt.jar包中,覆盖原文件。(注意:编辑的JDK源文件版本必须与现有JRE版本相匹配,不然会出现问题)

    4、运行目标程序,尽可能多的测试功能,让资源文件被加载。这样你就能在目录下找到dump出来的资源文件了。

    展开全文
  • python写的程序,转成了exe文件,怎么进行反编译为用pyinstaller,很容易就能实现,步骤如下:下载pyinstaller包,(小编可以安装包发给你),把pyinstaller解压到任意路径后1.开始->运行->cmd->回车2.把路径改为...

    python写的程序,转成了exe文件,怎么进行反编译为用pyinstaller,很容易就能实现,步骤如下:下载pyinstaller包,(小编可以安装包发给你),把pyinstaller解压到任意路径后1.开始->运行->cmd->回车2.把路径改为pyinstaller所在的路径。比如pyinstaller在D盘,则输入“D:”(不包括“下同)回车。

    python生成的exe,反编译成py的工具,大神提供下,

    你解开执行文件。如果是单个的文件,则执行它的时候在临时目录里可以找到解开的包。 在解开后的目录中找到pyc文件,然后利用反编译工具就可以将pyc反编译成py文件。 但是有些程序是做了加密的。它们的pyc是它们重新写python编译器后自定义的加密如果有一天小编惹你生气了,你可以打小编,骂小编,凶小编,但千万不要丢下小编,好么?

    用Python2.7.1写的小程序可以反编译得到它的源代码吗爱上一个人,每天的空气都是甜甜的,每天的饭菜都是可口的,每天的心情都是愉悦的。你问小编怎么知道,因为小编爱上你了,这都是亲身感受。

    python的打包成exe文件的安全性很弱的,基本就是把py文件、dll库和用到的module打包在一起,搭建出一个独立的python运行环境。所以反编译应该比较容易。

    可以,网上有很多在线的反编译工具,给你发几个链接:

    用Python2.7.1写的小程序可以反编译得到它的源代码吗可以啊,要看他的发布形式,如果是以脚本形式发布的,那就可以直接得到源码。 如果是以exe形式发布的,需要进行反编译。

    python源码编程成pyc后,怎么防止反编译

    无法防止反编译,但可以混淆,让你即使反编译了,也看不懂语法下面一段源码 sd=1def seed(s):global sdsd=sdef randn(n):global sdsd=(sd*1103515245 + 12345) & 0x7fffffffreturn sd%ndef main():seed(11)for i in xrange(4) :print randn(313)很多的梦在等待着进行,而小编已分不清,你是陌生人,还是路过的爱情。

    怎么通过反编译获取python源码可以啊,要看他的发布形式,如果是以脚本形式发布的,那就可以直接得到源码。 如果是以exe形式发布的,需要进行反编译。

    python 反编译 源码还原py后,怎么把它再编译成pyc自己哭着告诉自己说这是最后一次,最后一次为他哭,最后一次为男人哭

    不用编译 Python每次执行的时候,都会检查py是否有同名的pyc 如果没有或者pyc比py生成时间更早,就会自动把py翻译成字节码的pyc 然后由pyc解释执行虽然不能满足你最大的物质生活…但小编可以把小编的心来满足你

    以上就是四十五资源网为大家整理的python打包exe反编译源码内容,如果觉得本站更新的资源对您有帮助 不要忘记分享给您身边的朋友哦!

    展开全文
  • 我们用pyinstaller把朋友文件打包成exe文件,但有时候我们需要还原,我们可以用pyinstxtractor.py 用法: python pyinstxtractor.py xxx.exe 之后得到一个这样结构的文件夹 --- xxx.exe_extracted -- out00-PYZ....
  • APK反编译代码分析

    千次阅读 2014-10-30 16:57:15
     ...一,用jd-gui.exe等工具查看源代码。如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879  可以到以下连接下载可视化反编译工具: http://download.csdn.
    

    一,用jd-gui.exe等工具查看源代码。如何你不会,可以参看此文章:

    http://blog.csdn.net/hp_2008/article/details/8207879

     可以到以下连接下载可视化反编译工具:

    http://download.csdn.net/detail/hp_2008/5099046

    二,反编译后的源代码,是乱的,看不太懂。这是因为开发者在发布APK时,一般都会用代码混淆器将原始的源代码打乱,这也是防盗的一种方法。但是再怎样防,道高一尺,魔高一丈,用反编译工具很轻松的就可反编译成源码。要想做到反编译成一点也看不懂的代码,这很难,
    在Android Java开源的世界里就更难做到了。当然你可以把核心的放到中间层,用C/C++封装成库,通过JNI调用,这样要想反编译库就有难度了。

    用混淆器打乱的代码,反编译后,要想看懂也不是一件容易的事。因为大部人都会用免费的混淆器来混淆源代码,大部份反编译过来的代码就有一定的规则可寻:

    (本人水平有限,如有什么不对的地方,还请指教,非常感谢)

    反编译后的代码一般会产生以下结构的代码,(代码结构是个人总结的,如有雷同,纯属巧合)比较难看懂,本文章根据实现情况对这几种结构做个简单说明。

    1,反编译后的代码:if while结构

    if (BTActivity.access$2300(this.this$0))
         {
           int i = BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt);
           BTActivity.access$2500(this.this$0).notifyDataSetChanged();
         }
         while (true)
         {
           return;
           Bluetooth localBt = BTActivity.access$700(this.this$0);
           int k = BTActivity.access$600(this.this$0);
           int l = localBt.sendCommand(1026, paramInt, k);
          }

    (1)只分析逻辑
      很显然上面的代码也不是原始的源代码,但是很接近了,如果要想完成还原,还得自己改。
     分析上面的代码:这里应该有一个if else的逻辑。从上面的代码分析,return下的代码
     应该是永远不会被执行,但这是不可能的。所以上面的代码逻辑(我们先不看语句)应该是这样的,
      去掉while和return,加上else,修改后如下:

    if (BTActivity.access$2300(this.this$0))
         {
            int i = BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt);
            BTActivity.access$2500(this.this$0).notifyDataSetChanged();
         }
       else
       {
           Bluetooth localBt = BTActivity.access$700(this.this$0);
           int k = BTActivity.access$600(this.this$0);
           int l = localBt.sendCommand(1026, paramInt, k);
         }
     这样的逻辑才是作者的本意。

      (2)逻辑分析完了,应该分析语句.
          A,这个真的很难看懂。像这句:int i = BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt);
          很显然,这个是引用外部的一个类中的一个方法。然后返回整类,从下面的语句可以得知,这个返回值是用不到的。所以这句可去掉int i
          还原上面的语句应该是这样的:
          BTActivity.access$700(this.this$0).sendCommand(1028, 4, paramInt);
         
          B,access$700是什么意思呢。这个应该是BTActivity类中的一个对像,然后这个对象有sendCommand方法。这样你就可以去查这个BTActivity类定义的哪个对象
          有这样一个方法了,这好理解。
         
          不好理解的是这句:int k = BTActivity.access$600(this.this$0); 这句初步还原就是去掉int k。
          然后是这个access$600,它对应的是BTActivity中的哪个方法呢。这很难确定,所以我说要猜,那有没有方法呢。当然有:
          1,看这个类中有多少个方法,如果只有一个,那指定就是它了。
          2,如果有多个,那就要看参数。如果只有一个方法的参数与之相对应,那一定是它。
          3,如果参数一样的也有多个。那看逻辑。如果看不出来,只有猜:)。或参加自己的逻辑。
      
       (3)为什么会出现像access$700(方法不一样,后面的数字也不一样)这样的方法名呢,原因是,调用者和被调者不在同一个类中。内部类也不行,如果
       两者在同一个类中,比如同类的方法调用,那反编译后的名字一定是可看懂的。不会是有数字的名字。
      
       (4) 再举一个更简单的if else例
           反编译后的代码:

     if (paramBoolean)
             paramTextView.setTextColor(-16727809);
            while (true)
            {
              return;
              paramTextView.setTextColor(-1315861);
            }
          
            还原成真正的原始代码,按我上面说的应该是:
           
              if (paramBoolean)
              {
                paramTextView.setTextColor(-16727809);
              }
              else
              {
                 paramTextView.setTextColor(-1315861);
              }   

    以后碰到这样的if while还原就应该是上面的样子。
    2, 反编译后的代码:switch case while结构

    switch (this.mBand)
         {
          default:
          case 0:
          case 1:
          case 2:
         }
         while (true)
         {
           return;
           this.mBand.setText("FM1");
           continue;
           this.mBand.setText("FM2");
           continue;
           this.mBand.setText("AM");
         }

    (1)分析逻辑:根据mBand的不同值,设置文本的显示内容。 这个很好看懂,不再多说,还原成原始代码:

    switch (mBand)
         {
    
         case 0:
           mBand.setText("FM1");
           break;
          case 1:
            mBand.setText("FM2");
            break;
          case 2:
            mBand.setText("AM");
            break;
          default:
         }
    (2)这里关键的地方是:一个continue对你应着一个case的结束;。

     3,反编译后代码如下:if for while结构 

    int i15 = this.freq;
           int i16 = this.rmin;
           if (i15 < i16)
             i17 = this.min;
           int i29;
           for (this.freq = i17; ; this.freq = i29)
           {
             int i27;
             int i28;
             do
             {
               this.x = getWidth();
               this.y = -1;
               break label32:
               i27 = this.freq;
               i28 = this.max;
             }
             while (i27 <= i28);
             i29 = this.max;
           }
           this.y = 0;
           invalidate();

    (1)代码逻辑分析:保证freq的值在min和max之间。分析后得到的原始源代码:

    if (freq < min)
           {
            freq = min;
           }
           
           if (freq <= max)
           {
              x = getWidth();
              y = -1;  
           }
           else
           {
            freq  = max;
            y = 0;
            invalidate();
           }
    (2)得到上面的源代码关键在于,按反编译后的代码走一遍。 

      4, 解析switch for while结构代码

    PowerManager localPowerManager = (PowerManager)getSystemService("power");
         switch (paramInt)
         {
         default:
         case 0:
         case 1:
         }
         for (String str = "on"; ; str = "other")
           while (true)
           {
             PowerManager.WakeLock localWakeLock = localPowerManager.newWakeLock(6, str);
             localWakeLock.acquire();
             localWakeLock.release();
             return;
             str = "off";
           }

    还原原始源代码:

    PowerManager localPowerManager = (PowerManager)getSystemService("power");
          String str = null;
          switch (paramInt)
          {
           case 0:
            str = "on";
            break;
           case 1:
            str = "off";
            break;
           default:
            str = "other";
            break;
          }
    
         PowerManager.WakeLock localWakeLock = localPowerManager.newWakeLock(6, str);
             localWakeLock.acquire();
             localWakeLock.release();
    5, 分析返编译后的代码(if while结构)

     例1:

     if (paramInt1 == 0)
           this.mMessage.setText("");
         while (true)
         {
           this.mAdditionalMessage.setVisibility(8);
           int i = this.mLevel.getMax();
           if (paramInt2 != i)
             this.mLevel.setMax(paramInt2);
           Toast localToast = this.mToast;
           ...... 
    
          return;
           TextView localTextView = this.mMessage;
           String str = "" + paramInt1;
           localTextView.setText(str);
         }
    分析:1,先去掉“this"

              2,看返编译后的按顺序逻辑走一遍。可以看出while到return这段代码,不管怎么样都会执行的。所以原始代码应该是这样的:

    setSmallIcon(paramInt1);
          paramInt1 &= 2147483647;
          if (paramInt1 == 0)
          {
            mMessage.setText("");
          }
          else
          {
            String str = "" + paramInt1;
            mMessage.setText(str);
          }
          mAdditionalMessage.setVisibility(8);
          if (paramInt2 != mLevel.getMax())
          {
            mLevel.setMax(paramInt2);
          }
          mToast.setView(mView);

    6,一个continue对应一个back原则(switch while结构)
    在这种形式中,一个contiune一定是对应一个back,但一个case不一定只对应一个contiune,也有一个case对应两个或多个contiune(即back).
    如以下反编译后的代码:

        switch (getId())
    	    {
    	    case 2131034119:
    	    case 2131034120:
    	    case 2131034121:
    	    case 2131034122:
    	    case 2131034123:
    	    case 2131034124:
    	    case 2131034125:
    	    case 2131034126:
    	    case 2131034127:
    	    case 2131034128:
    	    default:
    	    case 2131034129:
    	    case 2131034130:
    	    case 2131034131:
    	    case 2131034132:
    	    case 2131034133:
    	    case 2131034134:
    	    case 2131034117:
    	    case 2131034118:
    	    }
    	    while (true)
    	    {
    	      return;
    	      int i = paramVerticalSeekBar.getProgress() * 14;
    	      int j = paramVerticalSeekBar.getMax();
    	      int k = i / j;
    	      if (APPActivity.access$200(this.this$0) == k)
    	        continue;
    	      int l = APPActivity.access$202(this.this$0, k);
    	      int i1 = APPActivity.access$200(this.this$0);
    		      continue;
    	      int i3 = paramVerticalSeekBar.getProgress() * 14;
    	      int i4 = paramVerticalSeekBar.getMax();
    	      k = i3 / i4;
    	      if (APPActivity.access$400(this.this$0) == k)
    	        continue;
    	      int i5 = APPActivity.access$402(this.this$0, k);
    	      EQ localEQ2 = APPActivity.access$1400(this.this$0);
    	      int i6 = APPActivity.access$400(this.this$0);
    	      int i7 = localEQ2.sendCommand(257, 2, i6);
    	      continue;
    	      int i8 = paramVerticalSeekBar.getProgress() * 14;
    	      int i9 = paramVerticalSeekBar.getMax();
    	      k = i8 / i9;
    	      if (APPActivity.access$500(this.this$0) == k)
    	        continue;
    	      int i10 = APPActivity.access$502(this.this$0, k);
    	      int i11 = APPActivity.access$500(this.this$0);
    	      continue;
    	      int i13 = paramVerticalSeekBar.getProgress() * 3;
    	      int i14 = paramVerticalSeekBar.getMax();
    	      k = i13 / i14;
    	      if (APPActivity.access$600(this.this$0) == k)
    	        continue;
    	      int i15 = APPActivity.access$602(this.this$0, k);
    	      EQ localEQ4 = APPActivity.access$1400(this.this$0);
    	      int i16 = APPActivity.access$600(this.this$0);
    	      int i17 = localEQ4.sendCommand(257, 8, i16);
    	      continue;
    	      int i18 = paramVerticalSeekBar.getProgress() * 3;
    	      int i19 = paramVerticalSeekBar.getMax();
    	      k = i18 / i19;
    	      if (EQActivity.access$700(this.this$0) == k)
    	        continue;
    	      int i20 = APPActivity.access$702(this.this$0, k);
    	      EQ localEQ5 = APPActivity.access$1400(this.this$0);
    	      int i21 = APPActivity.access$700(this.this$0);
    	      continue;
    	      int i23 = paramVerticalSeekBar.getProgress() * 3;
    	      int i24 = paramVerticalSeekBar.getMax();
    	      k = i23 / i24;
    	      if (APPActivity.access$800(this.this$0) == k)
    	        continue;
    	      int i25 = APPActivity.access$802(this.this$0, k);
    	      EQ localEQ6 = APPActivity.access$1400(this.this$0);
    	      int i26 = APPActivity.access$800(this.this$0);
    	      continue;
    	      int i28 = paramVerticalSeekBar.getProgress() * 14;
    	      int i29 = paramVerticalSeekBar.getMax();
    	      k = i28 / i29;
    	      if (APPActivity.access$900(this.this$0) == k)
    	        continue;
    	      int i30 = APPActivity.access$902(this.this$0, k);
    	      EQ localEQ7 = APPActivity.access$1400(this.this$0);
    	      int i31 = APPActivityvity.access$900(this.this$0);
    	      continue;
    	      int i33 = paramVerticalSeekBar.getProgress() * 3;
    	      int i34 = paramVerticalSeekBar.getMax();
    	      k = i33 / i34;
    	      if (APPActivity.access$1000(this.this$0) == k)
    	        continue;
    	      int i35 = APPActivity.access$1002(this.this$0, k);
    	      EQ localEQ8 = APPActivity.access$1400(this.this$0);
    	      int i36 = APPActivity.access$1000(this.this$0);
    	    }
    	  }

        switch (getId())
    	    {
    	    case 2131034119:
    	    case 2131034120:
    	    case 2131034121:
    	    case 2131034122:
    	    case 2131034123:
    	    case 2131034124:
    	    case 2131034125:
    	    case 2131034126:
    	    case 2131034127:
    	    case 2131034128:
    	    default:
    	    case 2131034129:
    	    case 2131034130:
    	    case 2131034131:
    	    case 2131034132:
    	    case 2131034133:
    	    case 2131034134:
    	    case 2131034117:
    	    case 2131034118:
    	    }
    	    while (true)
    	    {
    	      return;
    	      int i = paramVerticalSeekBar.getProgress() * 14;
    	      int j = paramVerticalSeekBar.getMax();
    	      int k = i / j;
    	      if (APPActivity.access$200(this.this$0) == k)
    	        continue;
    	      int l = APPActivity.access$202(this.this$0, k);
    	      int i1 = APPActivity.access$200(this.this$0);
    		      continue;
    	      int i3 = paramVerticalSeekBar.getProgress() * 14;
    	      int i4 = paramVerticalSeekBar.getMax();
    	      k = i3 / i4;
    	      if (APPActivity.access$400(this.this$0) == k)
    	        continue;
    	      int i5 = APPActivity.access$402(this.this$0, k);
    	      EQ localEQ2 = APPActivity.access$1400(this.this$0);
    	      int i6 = APPActivity.access$400(this.this$0);
    	      int i7 = localEQ2.sendCommand(257, 2, i6);
    	      continue;
    	      int i8 = paramVerticalSeekBar.getProgress() * 14;
    	      int i9 = paramVerticalSeekBar.getMax();
    	      k = i8 / i9;
    	      if (APPActivity.access$500(this.this$0) == k)
    	        continue;
    	      int i10 = APPActivity.access$502(this.this$0, k);
    	      int i11 = APPActivity.access$500(this.this$0);
    	      continue;
    	      int i13 = paramVerticalSeekBar.getProgress() * 3;
    	      int i14 = paramVerticalSeekBar.getMax();
    	      k = i13 / i14;
    	      if (APPActivity.access$600(this.this$0) == k)
    	        continue;
    	      int i15 = APPActivity.access$602(this.this$0, k);
    	      EQ localEQ4 = APPActivity.access$1400(this.this$0);
    	      int i16 = APPActivity.access$600(this.this$0);
    	      int i17 = localEQ4.sendCommand(257, 8, i16);
    	      continue;
    	      int i18 = paramVerticalSeekBar.getProgress() * 3;
    	      int i19 = paramVerticalSeekBar.getMax();
    	      k = i18 / i19;
    	      if (EQActivity.access$700(this.this$0) == k)
    	        continue;
    	      int i20 = APPActivity.access$702(this.this$0, k);
    	      EQ localEQ5 = APPActivity.access$1400(this.this$0);
    	      int i21 = APPActivity.access$700(this.this$0);
    	      continue;
    	      int i23 = paramVerticalSeekBar.getProgress() * 3;
    	      int i24 = paramVerticalSeekBar.getMax();
    	      k = i23 / i24;
    	      if (APPActivity.access$800(this.this$0) == k)
    	        continue;
    	      int i25 = APPActivity.access$802(this.this$0, k);
    	      EQ localEQ6 = APPActivity.access$1400(this.this$0);
    	      int i26 = APPActivity.access$800(this.this$0);
    	      continue;
    	      int i28 = paramVerticalSeekBar.getProgress() * 14;
    	      int i29 = paramVerticalSeekBar.getMax();
    	      k = i28 / i29;
    	      if (APPActivity.access$900(this.this$0) == k)
    	        continue;
    	      int i30 = APPActivity.access$902(this.this$0, k);
    	      EQ localEQ7 = APPActivity.access$1400(this.this$0);
    	      int i31 = APPActivityvity.access$900(this.this$0);
    	      continue;
    	      int i33 = paramVerticalSeekBar.getProgress() * 3;
    	      int i34 = paramVerticalSeekBar.getMax();
    	      k = i33 / i34;
    	      if (APPActivity.access$1000(this.this$0) == k)
    	        continue;
    	      int i35 = APPActivity.access$1002(this.this$0, k);
    	      EQ localEQ8 = APPActivity.access$1400(this.this$0);
    	      int i36 = APPActivity.access$1000(this.this$0);
    	    }
    	  }
    分析代码:

    1),上遍已对这种形式有讲过,一个continue对应一个case,但是你数一数会发现,对不上号,明显case多于contiune,原因是什么呢?其实switch里的default对应的是while中的return,在switch中default以上的case是用不着,是没有用的。

    2),如果default上面的case没有用,聪明的你可以可能会问两个问题?
    A,default上面的case没有用,为什么还会有呢?原因很简单,因为反编译器也不是全智能的总会有不对的(但是执行逻辑是不会有错),呵呵真正的原因当然不会是这样,你可以自己去分析一下,从整个程序分析就可以得出结论来。
    B,那按一个continue对应一个back的原则不是有错吗? 当然没有。一个continue还是对应一个back, 聪明的你一定看懂了,每两个continue中间还有一个if语句,对,没错,你理解是对的,就是在这中间满足条件时就会back,所以就会有一个continue与之相对应。
      所这里每个if + continue + continue的形式对应一个case。
    3),恢复原代码结构就变的简单,这里就再敖叙了。


    转载自:http://blog.csdn.net/ordinaryjoe/article/details/8626010


    展开全文
  • APK反编译代码分析(一)

    千次阅读 2013-08-07 21:47:59
    一,用jd-gui.exe等工具查看源代码。如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879  可以到以下连接下载可视化反编译工具: ...二,反编译后的源代码,是乱的,看不太...
  • .NET代码编译工具 Reflector 可以反编译 exe dll等文件 还原dll exe 等格式文件
  • 在详细了解 IEnumerable IEnumerator yield等相关的,很多文章提到查看反编译代码。请问是一定要通过第三方软件查看导出的.exe文件才能看到吗,我用的VS开发,在VS开发上是否可以直接查看的
  • JD-GUI反编译代码逻辑分析

    万次阅读 2014-07-02 14:28:49
    一,用jd-gui.exe等工具查看源代码。如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879  可以到以下连接下载可视化反编译工具: ...二,反编译后的源代码,是乱的,看不...
  • 01-反编译需要使用的工具 要反编译apk需要下面3个工具: apktool (资源文件获取) 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar(源码文件获取) 作用:将apk反编译成java...
  • 要反编译apk需要下面3个工具: 1. apktool (资源文件获取) 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 2. dex2jar(源码文件获取) 作用:将apk反编译成java源码(classes.dex转化成...
  • 编译pyc教程!简简单单还原源码!值得推荐!
  • 如何使用dnSpy反编译unity代码并修改

    万次阅读 2017-09-06 15:04:58
    dnSpy下载地址:https://github.com/0xd4d/dnSpy/releases unity项目打包后的代码都在Assembly-CSharp.dll里,直接使用dnSpy打开即可修改,并且编译
  • 将python打包的.exe文件还原成.py文件

    万次阅读 2018-05-30 17:03:06
    将python打包的.exe文件还原成.py文件 1、下载 pyinstxtractor.py 地址:https://sourceforge.net/projects/pyinstallerextractor/ 2、把pyinstxtractor.py和exe文件放在同个目录下 打开cmd,进入该目录,...
  • 关于代码混淆的作用,就不多解释了,整个过程大致如下:在app下的build.gradle文件中添加如下代码(minifyEnabled表示是否混淆,默认是false,这里要记得设置成true):其中proguard-Android.txt文件是本地sdk/tools/...
  • 一,用jd-gui.exe等工具查看源代码。如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879  可以到以下连接下载可视化反编译工具: ...二,反编译后的源代码,是乱的,看...
  • 1、下载 pyinstxtractor.py 地址:... 也可复制下面代码(即pyinstxtractor.py代码) """ PyInstaller Extractor v1.9 (Supports pyinstaller 3.3, 3.2, 3.1, 3.0, 2...
  • 如何使用.NET Reflector 即根据.exe文件,和.dll文件还原代码 1.首先,需要添加插件 从菜单项 View-->Add-Ins 查找名称为“Reflector.FileDisassembler.dll”的 第三方组件 2.点击Tools,然后就会出现...
  • python3.7.4反编译生成的.exe

    千次阅读 2019-10-18 14:49:18
    今天尝试着反编译别人发的小工具(python生成的exe文件)。 第一步:上搜索引擎搜一下如何反编译,大概总结一下:一、获取python的.pyc(即将exe解压) 参考链接:https://www.jianshu.com/p/4da8dada77bc 推荐另...
  • python 反编译exe文件为py文件

    万次阅读 热门讨论 2018-11-17 00:53:01
    我们用pyinstaller把朋友文件打包成exe文件,但有时候我们需要还原,我们可以用pyinstxtractor.py 用法: python pyinstxtractor.py xxx.exe 之后得到一个这样结构的文件夹   --- xxx.exe_extracted -- out00-...
  • 大家好,我是小五????今年年初的时候,我写了一篇:别再问我Python打包成exe了!(终极版),相信解决了不少小伙伴的Pyinstaller打包问题。不过我最近遇到了一个问题,自己打包...
  • 改进后的pyinstxtractor.py, 适合还原pyinstaller生成的exe,从exe中提取代码 本文件已经过多次bug修复。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,200
精华内容 3,680
关键字:

exe编译还原代码