精华内容
下载资源
问答
  • Android反编译工具包(升级)官方绿色版

    万次下载 热门讨论 2012-10-10 19:18:30
    Android反编译工具包,内含图形和命令两种反编译方式,命令支持windows和linux平台,亲测验证成功!详见博客:Android APK反编译详解(附图) http://blog.csdn.net/sunboy_2050/article/details/6727581
  • apktool 反编译工具 绿色版

    万次下载 热门讨论 2014-03-11 20:18:37
    apktool功能:反编译出apk资源文件。 使用方式: 把apktool 解压到任意位置 执行 在dos 改目录下 执行 apktool d xxx.apk test ,便会把编译后的资源存入test文件夹下。
  • 2020年支持java8的Java反编译工具汇总

    万次阅读 多人点赞 2018-06-29 10:58:53
    luyten是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等,用户可根据不同的需求选择合适的显示...

         大多商业软件,会对程序进行加密、加壳等安全措施以防范软件被破解,从而使得反编译越来越难。反编译是一个对目标可执行程序进行逆向分析,从而得到源代码的过程。尤其是像Java这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码。

          我们知道,在代码支撑方面,JDK 1.7引入了字符串Switch、泛型接口改进等新功能,1.8增加了lambda表达式、方法传递、多重注解等新特性,这使得反编译工具的编写难度加大。今天我们盘点一下目前仍然可用的、相对功能很强大的Java反编译工具(Eclipse插件不做评价),比较老的反编译工具很难支持Java8及其以上版本。

     

    1、Java 反编译器 JD-GUI

    JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse、IntelliJ的插件JD-IntelliJ。JD-GUI不需要安装,直接点击运行,可以反编译jar,class文件。

    最新版本1.4.0,官方网站:http://jd.benow.ca/

     

    2、Java 反编译器 procyon-decompiler及其window下独立UI工具luyten

         Procyon-Decompiler支持JDK1.8类的反编译,在很多方面做得非常不错,如反编译匿名类、内部类、Java8 Lambda等等。Procyon-Decompiler支持JDK1.8类的反编译,在很多方面做得非常不错:字符串的Switch、枚举声明方面、注解方面、匿名类、内部类、Java8新接口规范、Java8 Lambda表达式、Java8 方法传递等。

          luytenProcyon的GUI,是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等,用户可根据不同的需求选择合适的显示项目,结果更明了。

         luyten的最新版本0.53,官方网址:https://github.com/deathmarine/Luyten,只需要下载luyten即可,不用下载ProcyonProcyon最新版本0.5.30。

     

    3、Android反编译gui工具Jadx

         jadx是一款Android反编译gui工具,它支持apk、dex、jar、class、zip、aar等文件。jadx操作方便,反编译后的代码可读性高,同时还拥有较完善的gui界面,除去混淆部分的代码,jadx已经非常接近源代码了。

       Jadx最高版本v0.7.1,官方地址https://github.com/skylot/jadx/

       三个工具中JD-GUI打开jar文件反编译速度飞快、luyten次之、Jadx最慢(有时候需要等好一会,喝杯咖啡先。三者都会遇到反编译不出来的情况,建议配合使用。

    展开全文
  • 我的一种解决方法就是 简单的设置一下 前提:安装时这两个重要额部件要有!...工具---编译选项---编辑器---设置编辑器配置---(选择)MinGW GCC 4.7.2 32-bit,然后就可以了 结果是: 希望对你有所帮助!

     

     

    我的一种解决方法就是 简单的设置一下

    前提:安装时这两个重要额部件要有!

     

    具体方法如下:

    工具---编译选项---编辑器---设置编辑器配置---(选择)MinGW GCC 4.7.2 32-bit,然后就可以了

     

    结果是:

    如果还不行,可以尝试重新下载 官方软件
    https://gsf-fl.softonic.com/599/853/e3331311f9ef81b1e633d7713dd258f81d/Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe?Expires=1607289969&Signature=cc1605a055fc3addf84714cb26da50a4d8888ed4&url=https://bloodshed-dev-c.en.softonic.com&Filename=Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe

    希望对你有所帮助!

     

    展开全文
  • APK防反编译技术PPT

    千次下载 热门讨论 2014-01-27 18:33:38
    我们的APK实际上就是一个ZIP压缩文件,里面包含有一个classes.dex,我们编译后生成的程序代码就全部在那里了,通过apktool等工具可以轻松地将它们反编译成smali代码。有了这些反编译出来的smali代码之后,我们就可以...
  • 条件编译#ifdef的妙用详解_透彻

    万次阅读 多人点赞 2018-03-05 10:44:24
    本文主要介绍c语言中条件编译相关的预编译指令,包括 #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined。#define 定义一个预处理宏#undef 取消宏的定义#if 编译预处理中的条件命令,相当于C...

    本文主要介绍c语言中条件编译相关的预编译指令,包括  #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined。

    #define            定义一个预处理宏
    #undef            取消宏的定义

    #if                   编译预处理中的条件命令,相当于C语法中的if语句
    #ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
    #ifndef            与#ifdef相反,判断某个宏是否未被定义
    #elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
    #else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
    #endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined          与#if, #elif配合使用,判断某个宏是否被定义

    二、条件编译

    条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。

    最常见的条件编译是防止重复包含头文件的宏,形式跟下面代码类似:

    1 #ifndef ABCD_H
    2 #define ABCD_H
    3 
    4 // ... some declaration codes
    5 
    6 #endif // #ifndef ABCD_H

    在实现文件中通常有如下类似的定义:

    复制代码
     1 #ifdef _DEBUG
     2 
     3 // ... do some operations
     4 
     5 #endif
     6 
     7 #ifdef _WIN32
     8 
     9 // ... use  Win32 API
    10 
    11 #endif
    复制代码

    这些都是条件编译的常用情境。

    三、条件编译中使用的预编译指令

    #define            定义一个预处理宏
    #undef            取消宏的定义

    #if                   编译预处理中的条件命令,相当于C语法中的if语句
    #ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
    #ifndef            与#ifdef相反,判断某个宏是否未被定义
    #elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
    #else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
    #endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined          与#if, #elif配合使用,判断某个宏是否被定义

    四、预编译指令应用举例

    1. #define、#undef

    #define命令定义一个宏:
    #define MACRO_NAME[(args)] [tokens[(opt)]]
    之后出现的MACRO_NAME将被替代为所定义的标记(tokens)。宏可带参数,而后面的标记也是可选的。

    宏定义,按照是否带参数通常分为对象宏、函数宏两种。
    对象宏: 不带参数的宏被称为"对象宏(objectlike macro)"。对象宏多用于定义常量、通用标识。例如:

    // 常量定义
    #define MAX_LENGTH 100
    // 通用标识,日志输出宏
    #define SLog printf
    // 预编译宏
    #define _DEBUG

    函数宏:带参数的宏。利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源。 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率。但多数c++程序不推荐使用函数宏,调试上有一定难度,可考虑使用c++的inline代替之。例如:

    // 最小值函数
    #define MIN(a,b) ((a)>(b)? (a):(b))
    // 安全释放内存函数
    #define SAFE_DELETE(p) {if(NULL!=p){delete p; p = NULL;}}

    #undef可以取消宏定义,与#define对应。

    2. defined

    defined用来测试某个宏是否被定义。defined(name): 若宏被定义,则返回1,否则返回0。
    它与#if、#elif、#else结合使用来判断宏是否被定义,乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef。defined可用于在一条判断语句中声明多个判别条件;#ifdef和#ifndef则仅支持判断一个宏是否定义。

    #if defined(VAX) && defined(UNIX) && !defined(DEBUG) 

    和#if、#elif、#else不同,#ifdef、#ifndef、defined测试的宏可以是对象宏,也可以是函数宏。

    3. #ifdef、#ifndef、#else、#endif

    条件编译中相对常用的预编译指令。模式如下:

    复制代码
    #ifdef ABC
    // ... codes while definded ABC
    #elif (CODE_VERSION > 2)
    // ... codes while CODE_VERSION > 2
    #else
    // ... remained cases
    #endif // #ifdef ABC 
    复制代码

    #ifdef用于判断某个宏是否定义,和#ifndef功能正好相反,二者仅支持判断单个宏是否已经定义,上面例子中二者可以互换。如果不需要多条件预编译的话,上面例子中的#elif和#else均可以不写。

    4. #if、#elif、#else、#endif

    #if可支持同时判断多个宏的存在,与常量表达式配合使用。常用格式如下:

    复制代码
    #if 常量表达式1
    // ... some codes
    #elif 常量表达式2
    // ... other codes
    #elif 常量表达式3
    // ...
    ...
    #else
    // ... statement
    #endif
    复制代码

    常量表达式可以是包含宏、算术运算、逻辑运算等等的合法C常量表达式,如果常量表达式为一个未定义的宏, 那么它的值被视为0。

    #if MACRO_NON_DEFINED // 等价于
    
    #if 0

    在判断某个宏是否被定义时,应当避免使用#if,因为该宏的值可能就是被定义为0。而应当使用#ifdef或#ifndef。
    注意: #if、#elif之后的宏只能是对象宏。如果宏未定义,或者该宏是函数宏,则编译器可能会有对应宏未定义的警告。

    五、总结

     

    本文主要介绍c语言中有关预编译的指令。撰写本文的目的在于理清相关概念调用,在后续预编译使用时可以找到最合适的指令及格式。比如同时满足多个宏定义的预编译、多分支预编译、#elif和#else指令的配合等。
     
    一、if条件编译,选择编译

    (1)        

        #if ()
            //*******
        #endif
    (2)
        #if ()
            //******
        #else
            //******
        #endif
    (3)
        #if ()
            //******
        #elif ()
            //******
        #elif ()
            //******
        #endif
    二、注意此处不能加“()”不然会把括号也视为宏定义的字符串
    #define DBG
    三、
    #define  A  C(0、1...)
    四、注意此处不能加“()”不然会把括号也视为宏定义的字符串
    #define  DBG
    #undefine DBG
    五、注意此处不能加“()”不然会把括号也视为宏定义的字符串

    (1)    

        #ifdef  DBG
            #define UNDBG
            #define UNDBG1
        #endif
    (2)
        #ifundef  DBG
            #define UNDBG
            #define UNDBG
        #endif

     

    六、符合条件“&& 和 ||”复合条件下必须加上“()”标准形式如: # if (define (DBG)) || (define (DBG1))
          (1)
          # if define DBG || define DBG1 || define DBG2
                //******
            #endif
    (2)
            #if !define DBG || !define DBG2
                //******
            #endif
     
     

     

     

           1、条件编译

                  请看下面一个例子:

    #include<stdio.h>
    #define BB
    #ifdef AA
    #define HELLO "hello world"
    #elif BB
    #define HELLO "hello CC"
    #endifint main()
    {
            printf("%s\n",HELLO);
            return 1;
    }

     

            如果你觉得这个打印会是hello CC.那你就和我犯了一样的错误了。如果你用gcc -E hello.c -o hello.i 编译,(这条是预编译命令,下面会讲到。)会出现:error: #if with no expression的错误。原因是BB虽然定义了,但是定义的是空值,放在#elif后面就不行。因为#elif不仅仅是检查后面的宏有没有定义,还会检查其值。但是#ifdef就只是检查后面的宏是否定义,而不管其值为多少。读者可以把#define
            BB改成#define AA试一下,结果就会打印hello world了。
            读者如果有兴趣,也可以把#define BB改成#define BB   0  试一试,这时用gcc -E hello.c -o hello.i预编译可以编译通过,但是编译过程就不行了,因为#elif   0为假,HELLO没有定义。
    这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
        条件编译命令最常见的形式为:
        #ifdef 标识符
        程序段1
        #else
        程序段2
        #endif
        
        它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
        其中#else部分也可以没有,即:
        #ifdef
        程序段1
        #denif
        
        这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:
        #ifdef WINDOWS
        #define MYTYPE long
        #else
        #define MYTYPE float
        #endif
        
        如果在Windows上编译程序,则可以在程序的开始加上
        #define WINDOWS
        
        这样则编译下面的命令行:
        #define MYTYPE long
        
        如果在这组条件编译命令之前曾出现以下命令行:
        #define WINDOWS 0
        
        则预编译后程序中的MYTYPE都用float代替。这样,源程序可以不必作任何修改就可以用于不同类型的计算机系统。当然以上介绍的只是一种简单的情况,可以根据此思路设计出其它的条件编译。
        例如,在调试程序时,常常希望输出一些所需的信息,而在调试完成后不再输出这些信息。可以在源程序中插入以下的条件编译段:
        #ifdef DEBUG
        print ("device_open(%p)\n", file);
        #endif
        
        如果在它的前面有以下命令行:
        #define DEBUG
        
        则在程序运行时输出file指针的值,以便调试分析。调试完成后只需将这个define命令行删除即可。有人可能觉得不用条件编译也可达此目的,即在调试时加一批printf语句,调试后一一将printf语句删除去。的确,这是可以的。但是,当调试时加的printf语句比较多时,修改的工作量是很大的。用条件编译,则不必一一删改printf语句,只需删除前面的一条“#define DEBUG”命令即可,这时所有的用DEBUG作标识符的条件编译段都使其中的printf语句不起作用,即起统一控制的作用,如同一个“开关”一样。
        有时也采用下面的形式:
        #ifndef 标识符
        程序段1
        #else
        程序段2
        #endif
        
        只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。
        以上两种形式用法差不多,根据需要任选一种,视方便而定。
        还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符:
        #if 表达式
        程序段1
        #else
        程序段2
        #endif
        
        它的作用是:当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。
        例如:输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。
        #define LETTER 1
        main()
        {
        char str[20]="C Language",c;
        int i="0";
        while((c=str[i])!='\0'){
        i++;
        #if LETTER
        if(c>='a'&&c<='z') c="c-32";
        #else
        if(c>='A'&&c<='Z') c="c"+32;
        #endif
        printf("%c",c);
        }
        }
        
        运行结果为:C LANGUAGE
        现在先定义LETTER为1,这样在预处理条件编译命令时,由于LETTER为真(非零),则对第一个if语句进行编译,运行时使小写字母变大写。如果将程序第一行改为:
        #define LETTER 0
        
        则在预处理时,对第二个if语句进行编译处理,使大写字母变成小写字母(大写字母与相应的小写字母的ASCII代码差32)。此时运行情况为:
        c language
        有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。


    浅谈#ifdef在软件开发中的妙用

      笔者从事UNIX环境下某应用软件的开发与维护工作,用户分布于全国各地,各用户需要的基本功能都是一样的,但在某些功能上要随着需求变化,不断加以升级,要想实现全国各地用户的升级工作是很困难的,而我们则只是利用E-mail发送补丁程序给用户,这些补丁程序都是在一套软件的基础上不断地修改与扩充而编写的,并由不同的标志文件转入到不同的模块,虽然程序体积在不断扩大,但丝毫不影响老用户的功能,这主要是得益于C程序的#ifdef/#else/#endif的作用。


      我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:

      1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。

      在程序首部定义#ifdef HNLD:

      #ifdef HNLD

      include"n166_hn.c"

      #endif

      如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。

      2.在每一个子程序前加上标记,以便追踪程序的运行。

      #ifdef DEBUG

      printf(" Now is in hunan !");

      #endif

      3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:

      #ifndef TEST

      i=dial();

      //程序调试运行时绕过此语句

      #else

      i=0;

      #endif

      调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。

    # ifdef  #ifndef 等用法(转)

      头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

    还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

    #ifndef <标识>
    #define <标识>

    ......
    ......

    #endif

    <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

    #ifndef _STDIO_H_
    #define _STDIO_H_

    ......

    #endif

    2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。

    #ifndef AAA
    #define AAA
    ...
    int i;
    ...
    #endif
    里面有一个变量定义
    在vc中链接时就出现了i重复定义的错误,而在c中成功编译。

    结论:

    (1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.

    (2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。

    (3).C语言和C++语言连接结果不同,可能(猜测)是在进行编译的时候,C++语言将全局
    变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。(参考)

    解决方法:

    (1).把源程序文件扩展名改成.c。

    (2).推荐解决方案:
    .h中只声明 extern int i;在.cpp中定义

    <x.h>
    #ifndef __X_H__
    #define __X_H__
    extern int i;
    #endif //__X_H__
    <x.c>
    int i;

    注意问题:

    (1).变量一般不要定义在.h文件中。

     

     

    展开全文
  • APK反编译

    万次阅读 多人点赞 2017-12-27 17:31:39
    学习和开发Android应用有一段时间了,今天写一篇博客总结一下Android的apk文件反编译。我们知道,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件,然后让用户通过手机或者平板电脑下载下来进行安装...
    学习和开发Android应用有一段时间了,今天写一篇博客总结一下Android的apk文件反编译。我们知道,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件,然后让用户通过手机或者平板电脑下载下来进行安装。正常情况下,Android应用打包成apk之后,就无法再看到开发这个应用时使用的资源文件以及代码了。但是我们通过网上提供了一些工具,还是可以将apk进行反编译的,apk反编译之后,我们就可以看到开发这个应用使用的资源文件(图片)、layout、样式、相关的实现代码等,apk反编译也算是Android开发中一个比较实用的技巧吧,当我们对别人开发好的应用感兴趣时,我们就可以通过这种技术手段将别人打包好的apk进行反编译,继而可以看到我们感兴趣的内容,(注:反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。)下面就来说说如何将一个apk反编译出来。

    一、准备必要工具

      工欲善其事,必先利其器,首先我们要下载好反编译apk时需要的相关工具

    1.1、使用工具

    1. apktool (资源文件获取) 
    2. dex2jar(源码文件获取)
    3. jd-gui  (源码查看)

    1.2、工具介绍

      apktool  

             作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看

      dex2jar

             作用:将apk反编译成java源码(classes.dex转化成jar文件)

      jd-gui

             作用:查看APK中classes.dex转化成出的jar文件,即源码文件

    1.3工具下载

      apktool下载地址:https://bitbucket.org/iBotPeaches/apktool/downloads

      

      下载好之后得到一个如下图所示的jar文件

      

      dex2jar下载地址:http://sourceforge.net/projects/dex2jar/files/

      

      

      下载完成之后,得到一个如下图所示的压缩包

      

      jd-gui下载地址:http://jd.benow.ca/

      

      下载完成之后,得到一个如下图所示的压缩包:

      

      到此,需要使用到的3个相关工具都下载好了,在这里说明一下jd-gui的下载,我从官方网站上点击下载时会经常出现如下图所示的问题

      

      但是多试几次又可以下载了,所以如果有遇到这个问题的朋友们不妨多试几次,或者从别的地方下载jd-gui,jd-gui算是做Java开发的一个必备工具了,用它来将class反编译成java源代码是非常方便的,网上搜索一下一般都可以下载到,只不过版本不一定是最新的。

    二、Apk反编译流程

      为了方便进行反编译,我们将上述下载好的3个工具统一放到一个文件夹中,例如:

      

      然后将【dex2jar-2.0.zip】和【jd-gui-windows-1.3.0.zip】分别解压到当前文件夹,如下图所示:

      

    2.1、使用apktool反编译apk得到图片、XML配置、语言资源等文件

      进入CMD命令行,如下:

      

      切换到上述的3个工具的所在目录,如:E:\AndroidDevelopTool\Android反编译工具包

      

      接下来我们要做的就是运行apktool_2.0.1.jar这个jar文件来将apk文件进行反编译,在java中,运行可执行jar包的命令是:

    java -jar jar包名.jar

      使用如下的命令运行apktool_2.0.1.jar反编译MMTS-release-1.0.2.apk

    java -jar apktool_2.0.1.jar d -f E:\AndroidDevelopTool\Android反编译工具包\测试apk\MMTS-release-1.0.2.apk -o MMTS

      这个命令是启动apktool_2.0.1.jar将位于【E:\AndroidDevelopTool\Android反编译工具包\测试apk\】目录下的"MMTS-release-1.0.2.apk"这个apk反编译,然后将反编译生成的文件存放到当前目录(apktool_2.0.1.jar所在的目录,也就是"E:\AndroidDevelopTool\Android反编译工具包"目录)下的一个【MMTS】文件夹中。这个文件夹的名字是可以随便取的,喜欢叫啥都行。

      执行反编译操作:

      

      反编译成功后,会在当前目录(E:\AndroidDevelopTool\Android反编译工具包)下生成一个MMTS文件夹,打开MMTS里面就有反编译后生成的文件,如下图所示:

      

      打开MMTS文件夹,就可以看到反编译后的生成的文件,如下图所示:

      

      生成的文件和文件夹当中,我们关心的是【res】文件夹中和AndroidManifest.xml文件,打开res文件夹,里面就有我们想要看到的东西了,如下图所示:

      

      

      

      

      想查看哪个xml文件就使用文本编辑器打开看看吧,反正全部都可以看到了。以上就是使用apktool这个工具将一个apk反编译得到图片、XML配置、语言资源等文件的过程。

    2.2、使用dex2jar反编译apk得到Java源代码

      将要反编译的APK后缀名改为.rar或者 .zip,并解压,得到其中的classes.dex文件(它就是java文件编译再通过dx工具打包而成的),如下图所示:

      

      将获取到的classes.dex放到之前解压出来的工具【dex2jar-2.0】文件夹内,如下图所示:

      

      在命令行下定位到dex2jar.bat所在目录,输入"d2j-dex2jar classes.dex",效果如下:

      

      命令执行完成之后,在当前目录下就可以看到生成的Jar文件了,如下图所示:

      

      反编译classes.dex得到classes-dex2jar.jar文件之后,就可以使用【jd-gui】工具将class文件反编译成java源代码了

      

      使用jd-gui打开classes-dex2jar.jar就可以看到源代码了,如下图所示:

      

      JD-GUI虽然可以将class反编译成java源代码,但是对于一些被混淆过的class,反编译的效果就不是那么理想了,被混淆过的class反编译后的效果图(类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名):

      

      以上步骤是我亲自实践过之后一步步整理出来的,对照着做应该不会有太大问题。

    三、Apk反编译注意问题

    3.1、apktool版本太旧导致反编译失败的问题

      之前用过了apktool这个工具的一些旧版本,发现总是反编译不成功,在执行反编译时会出现如下错误:

      Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file

      

      这个问题是因为apktool版本过低导致,而解决这个问题的办法就是使用最新版本的apktool就可以了,最新版本的下载地址:https://bitbucket.org/iBotPeaches/apktool/downloads

    3.2、apktool执行反编译命令出现”Input file was not found or was not readable"的问题

      这个问题是因为apktool升级到2.0以上时,使用方式已经替换,格式为:apktool d [-s] -f <apkPath> -o <folderPath>

      好了,关于反编译apk的内容就这么多了。
      最后,给大家分享我下载好的那三个相关工具,下载地址:http://pan.baidu.com/s/1jGKSQyU

    展开全文
  • 我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 预处理, 展开头文件/宏...
  • Android APK反编译详解(附图)

    万次阅读 多人点赞 2011-08-28 22:42:11
    这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的...
  • (3)软件发布 :小型程序直接采用编译简单文件,直接编译、之后将依赖文件和exe文件打包,可以使用EnigmaVritual Box,如果是大型软件,可以采用好压直接压缩成自解压文件,或者其它的打包文件 不同编译方式的区别...
  • 搭建编译环境编译OpenWrt需要Linux环境或mac环境
  • 编译Android应用

    万人学习 2015-01-26 12:18:38
    学习技术的渠道多种多样,而通过反编译一些经典应用来学习是一种比较好的途径,在Android领域,有比较好的反编译工具,本课程将会教大家如何反编译Android应用。
  • openssl的编译与交叉编译

    万次阅读 2019-01-26 17:57:09
    1、下载openssl源码包 ...2、Ubuntu编译与安装openssl ./config配置生成Makefile,-shared 表示生成动态库,也可通过参数 -prefix=xxx 自行指定安装目录,如下不配置则为默认安装路径。 # tar zxvf o...
  • java在线反编译class文件

    万次阅读 多人点赞 2018-10-27 14:44:31
    编译网址:http://javare.cn 对你有帮助的话,右上角给个赞呗~
  • Java编译涉及到非常多的知识层面:...下面我们先来看下Java体系中的三种编译方式:前端编译、即时编译(JIT编译)、静态提前编译(AOT编译)解它们各有什么优点和缺点,再来看看主流的前端编译+JIT编译方式的运作过程。
  • 众所周知,我们开发所用的手机App安装包都是apk文件,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件供用户安装,这时候就很难再看到开发这个应用时使用的资源文件以及代码了,所以就有了反编译这个...
  • iOS编译速度优化

    万次阅读 2019-12-23 18:04:34
    二、使用 CocoaPods 管理第三方库:利用 cocoapods 插件 cocoapods-packager 将任意的 pod 打包成 Static Library,省去重复编译的时间;(缺点是不方便调试源码,如果库代码反复修改,需要重新生成二进制并上传到内部...
  • 我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译...
  • Android APK反编译就这么简单 详解(附图)

    万次阅读 多人点赞 2014-03-11 22:06:09
    你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看。下面是我参考...
  • 交叉编译

    千次阅读 2019-06-18 10:56:17
    交叉编译 交叉编译及交叉编译器 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译 什么时候需要交叉编译 在一个平台上生成另一...
  • Java| 编译和反编译

    万次阅读 多人点赞 2018-04-20 15:49:18
    什么是编程语言?... 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language)。编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level La...
  • 文章目录GO Window下编译Linux可执行文件1、Note2、交叉编译方法window 下编译 linuxlinux 下编译 window3、参考 Go-交叉编译-在window中编译linux 可执行文件 1、Note 在window使用 CMD 交叉编译 powershell: 无法...
  • 编译编译阶段区别

    万次阅读 2018-09-06 10:48:06
    处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段主要处理#开始的预编译指令。 二.编译(compilation , compile) 1、利用编译程序从源语言编写的源...
  • golang交叉编译

    万次阅读 2014-09-25 09:58:26
    golang传的很牛X,但不能交叉编译,对我来说一点用都没有,有个开源项目是用golang写的,如果不能在arm上用,那么我只能将它“翻译”成C,再集成到我的产品中,但我没有这个时间。好在交叉编译最后还是成功了。1. ...
  • 【Eclipse】Eclipse的自动编译和手动编译

    万次阅读 多人点赞 2018-06-01 23:18:42
    1、自动编译:在菜单栏【Project】中找到【Build AutoMatically】,选中该条目表示当你保存项目下的某个文件时,项目将会自动编译(只编译修改了的文件);如果没有选中,当你保存某个文件时,Eclipse将不会自动编译...
  • Android 系统编译之内核编译

    万次阅读 热门讨论 2018-09-12 16:02:27
    本来想超频自己的手机的,于是发现需要编译内核才能实现 作为Android开发者的我 没有任何内核编译经验,只是想试一下, 于是折腾了两天终于把内核成功编译出来了 现在分享下学习经验 我的是小米手机,其实我看了一下...
  • Android APK反编译 apktool使用教程

    万次阅读 多人点赞 2016-10-31 19:36:33
    然后百度“apk反编译”,出来最多的是apktool反编译。百度也真是越来越水了,反正百度出来的教程都是N年前的,现在早就不能用了。很多博主也都不跟新博客了,然后随着jdk发展apktool也跟新很多代了。所有有些博主的...
  • Golang 编译 条件编译

    千次阅读 2016-05-12 00:06:12
    条件编译:标签编译:( build tag )// +build { GOOS }, { GOOS }, { !GOOS }// +build (linux AND 386) OR (darwin AND (NOT cgo))以 + 开始,例如 // +build 支持 GOOS 与 GOARCH 并可以具有多个值,用 , 分割, ...
  • 编译原理学习(一)--编译以及编译过程

    万次阅读 多人点赞 2018-05-22 21:01:00
    【龙书】编译原理(第二版)学习与理解:1.也许我们这辈子都不会去实现一个编译器,但是我们至少要知道编译器是什么?为什么会需要编译器? ①编译器首先也是一种电脑程序。它会将用某种编程语言写成的源代码(原始...
  • 编译过程概述: 编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,047,884
精华内容 419,153
关键字:

编译