精华内容
下载资源
问答
  • 什么样的语言可以进行反编译 本文从知乎扒的,没扒图,感觉文字就ok.中间加了一些注释,如有需要请移步. 概念介绍 要理解这个问题,先要看「正」编译的过程是怎样的。 你有一个想法,这是一种人类自然语言可以表达出来...

    什么样的语言可以进行反编译

    本文从知乎扒的,没扒图,感觉文字足以表述.中间加了一些注释,如需详情请移步原文.

    概念介绍

    要理解这个问题,先要看「正」编译的过程是怎样的。

    • 你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言这个过程叫做编程。
    • 你使用编译器(compiler)将它翻译成机器所能理解的语言:这个过程叫做编译。

    编程和编译都是「信息丢失」的过程。比如你说,我有一组整数,我要把这些数排个序,然后轻车熟路地写了个冒泡排序。然而一定程度上,你的原始动机其实已经从代码里丢失了。
    有经验的人可以一眼看出这段代码是在排序,而新手小明看到的只有一些 for 和 if 之类的东西。
    如果是更复杂的功能,可能过一段时间你自己都看不懂自己当时是想干什么。从程序语言到机器语言的过程其实也是一样的。

    这两个过程其实都是把「做什么」转换成「怎么做」的过程,转换完成之后,究竟一开始是要做什么,这个信息已经丢失了。
    所谓「反编译」,其实就是找回这些丢失的信息的过程。从这个角度上来说,你阅读一段代码的过程,其实就是在将它「反编译」成自然语言。
    如果要完美地反编译,那只存在一种可能,就是信息完全没有丢失——比如说你阅读的这段代码有充分的注释,或者它使用了一种你所知晓的模式(这也是为什么大家一再强调注释和设计模式的重要性)。

    对于从机器语言到程序语言的反编译过程,也是一样。比如说有比反编译更低级(非贬义)的过程,叫做反汇编。
    严格来说汇编语言也是一种编程语言,不过我们在这里把它和我们常说的高级编程语言(包括C语言)区分开。

    这个步骤里,我在汇编和机器语言里使用的是双向实线箭头,因为它们是可以互相转换的。从汇编语言到机器语言的过程中没有丢失任何信息——因为两者的指令是一一对应的,因此反汇编可以轻松达成。这就是很多程序语言只能反汇编、不能(难以,下同)反编译的原因。

    一般我们管这种语言叫「编译语言」,又称「原生语言」。代表有C、C++等。那为什么有的语言可以反编译呢?
    这又要从机器语言说起。就像不同地域的人所用的语言不同一样,不同的机器说的语言也不尽相同。用行话说,叫「指令集不同」

    比方说,你的电脑和你的手机,指令集通常是不一样的。一段程序要让不同的机器都能执行,只能分别翻译(编译)成相应的机器语言。
    这个过程太麻烦了,于是人们想了个办法,搞出了一种叫解释语言的东西(此处未考证解释语言是否就是因此发明的,只是帮助理解)。

    问题分析

    解释语言有两种执行方式,这取决于执行端的「解释器」是如何工作的。

    • 一种是直接解释执行,中间就没有机器语言什么事情了,但这种方式效率很低。(不能发挥批处理以及指令流水线的优势,所以效率较低).
    • 先通过JIT编译的方式将源码翻译成机器语言,然后再执行,保证执行效率。JIT编译大致可以理解为「用到什么就编译什么」,这个过程常常是在执行过程中同步进行的。(php8中有这个东西,要注意理解).

    现代的解释语言基本上都会采用第二种方式,,先通过JIT编译的方式翻译成机器语言,然后再执行,保证执行效率。「解释器」的英文interpreter,其实就是名词「翻译」的意思。
    这好比你国外交部发了封文件(源码)到各国大使馆,再由大使馆的工作人员分别翻译成相应的语言,传达给目标国相关部门。
    代表性的解释语言如Javascript,它要在不同机器的浏览器上都能正确执行,所以采用这种方式。
    但是这样一来,程序代码就必须提供给每一台执行端机器了。
    这可是泄密啊。对于防止泄密,最直接的方式自然是加密。(在浏览器中js文件是可以被爬取的,所以一些敏感功能的实现需要加密防止技术外泄.比如直播场景中的h5播放器代码.)

    有锁就有钥匙,同时也有开锁术;有加密解密,也有相应的破解方式。这时候所谓的「反编译」,其实就是破解加密算法。这一点就不展开聊了。
    后来,人们觉得解释语言执行得实在有点慢,于是又想了一个办法:把一些可以前期做掉的工作先做掉,只留着那些跟目标机器有关的工作,到时候再说。于是程序被处理成了一种叫做「中间语言」,或者叫「字节码」的东西这个过程一般也叫做编译

    中间语言词汇少,比较精炼,执行起来也更快。这些语言一般也会用上JIT技术,进一步把中间语言编译成机器语言(而非解释执行),执行效率也就跟那些原生的编译语言不相上下了。这种语言代表性的有Java等。
    程序语言可以编译成中间语言,反过来,中间语言也可以在一定程度上反编译成程序语言。这是因为采用这种编译方式的编程语言为了保证它们的高级特性(比如说反射),在编译的过程中保留了源程序的绝大部分信息,
    只有很少的信息丢失;也正是因为丢失了这一部分信息,中间语言通常不能完美地反编译——最常见的就是反编译出来的程序中局部变量的名字都丢了,被替换成了由反编译器自动生成的名字。
    但这样反编译出来的程序,结构和功能都是完备的,可读性也有一定的保障。一般来说,我们所说的可以反编译的程序都是指这样一类语言写就的程序。

    中间语言可以被反编译;加密又会被破解,而且执行前还要解密,会带来额外的性能开销。有没有办法能让代码既能有效执行,又不被截获代码的人所利用呢?这时候人们从一些职业素养很差的程序员那里得到了启发,并且开发一个工具,唤作「混淆器」。
    这样代码即使被反编译和解密了,别人看也看不懂,不小心还会被带到坑里去。代码毕竟是写给人看的,只是偶尔让机器跑一跑,所以没有可读性的代码是没有价值的

    这种方法一出,广受好评,于是变成了一种非常普遍的做法。在中间代码和JIT的步骤,混淆通常会跟这些技术一起使用。

    结论

    • 汇编语言编译得到binary可以直接进行反汇编. 没有信息丢失.
    • C语言等编译型语言的binary反编译难度较大. 逆向过程存在信息丢失
    • Java等解释型语言的反编译难度较上者低.逆向过程存在信息丢失

    所以:很多程序语言只能反汇编、难以反编译.

    原文地址

    作者:hillin
    链接:https://www.zhihu.com/question/21853681/answer/74134768
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • PyInstaller Extractor可以提取出PyInstaller所创建的exe可执行文件的资源内容。之后再采用pyc反编译工具即可得到源码。教程:https://blog.luzy.top/posts/3136266189/
  • 反编译那些事儿(二)—枚举的反编译
    说明:下面的反编译结果使用“
    http://download.csdn.net/detail/wangshuxuncom/6841823”处的反编译工具反编译的。
    

    一、不含有抽象的方法

    源码如下:

    import java.util.Arrays;
    import java.util.List;
    
    public enum Weather {
    
    	Sunny(1, "晴天"), Rainy(2, "雨天"), Cloudy(3, "多云");
    	private int value;
    	private String label;
    
    	private Weather(int value, String label) {
    		this.value = value;
    		this.label = label;
    	}
    
    	public int getValue() {
    		return value;
    	}
    
    	public String getLabel() {
    		return label;
    	}
    
    	public static Weather parse(int value) {
    		Weather result = Weather.Sunny;
    		switch (value) {
    		case 1:
    			result = Weather.Sunny;
    			break;
    		case 2:
    			result = Weather.Rainy;
    			break;
    		case 3:
    			result = Weather.Cloudy;
    			break;
    		}
    		return result;
    	}
    
    	public static List<Weather> getEnumValues() {
    		return Arrays.asList(values());
    	}
    
    	public static void main(String[] args) {
    		System.out.println(Weather.Sunny.getValue() + ":" + Weather.Sunny.getLabel());
    		Weather weather = Weather.Cloudy;
    		System.out.println(weather.getValue() + ":" + weather.getLabel());
    		List<Weather> list = getEnumValues();
    		for (Weather sw : list) {
    			System.out.println(sw.value + "--" + sw.label);
    		}
    	}
    }

    反编译生成的class文件后的代码如下:

    /*import java.io.PrintStream;*/
    import java.util.*;
    
    public final class Weather extends Enum{
    	
    	private Weather(/*String s, int i,*/ int value, String label){
    		/*super(s, i);*/
    		this.value = value;
    		this.label = label;
    	}
    	
    	public int getValue(){
    		return value;
    	}
    	
    	public String getLabel(){
    		return label;
    	}
    	
    	public static Weather parse(int value){
    		Weather result = Sunny;
    		switch(value){
    			case 1: /*// '\001'*/
    				result = Sunny;
    				break;
    			case 2: /*// '\002'*/
    				result = Rainy;
    				break;
    			case 3: /*// '\003'*/
    				result = Cloudy;
    				break;
    		}
    		return result;
    	}
    	
    	public static List getEnumValues(){
    		return Arrays.asList(values());
    	}
    	
    	public static void main(String args[]){
    		System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString());
    		Weather weather = Cloudy;
    		System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).toString());
    		List list = getEnumValues();
    		Weather sw;
    		for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).toString()))
    			sw = (Weather)iterator.next();
    	}
    	
    	/*public static Weather[] values(){
    		Weather aweather[];
    		int i;
    		Weather aweather1[];
    		System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i);
    		return aweather1;
    	}*/
    	
    	/*public static Weather valueOf(String s){
    		return (Weather)Enum.valueOf(Weather, s);
    	}*/
    	
    	/*public static final Weather*/ Sunny;
    	/*public static final Weather*/ Rainy;
    	/*public static final Weather*/ Cloudy;
    	private int value;
    	private String label;
    	/*private static final Weather ENUM$VALUES[];*/
    	static {
    		Sunny = new Weather(/*"Sunny", 0,*/ 1, "\u6674\u5929");
    		Rainy = new Weather(/*"Rainy", 1,*/ 2, "\u96E8\u5929");
    		Cloudy = new Weather(/*"Cloudy", 2,*/ 3, "\u591A\u4E91");
    		/*ENUM$VALUES = (new Weather[] {
    			Sunny, Rainy, Cloudy
    		});*/
    	}
    }

    注意:所有/**/中间的东西都是多余的(/**/是人为添加的)

    如何将反编译代码还原:

    ①、去掉被/**/掉的代码,去掉后代码如下:

    import java.util.*;
    
    public final class Weather extends Enum{
        private Weather(int value, String label){
        	this.value = value;
        	this.label = label;
        }
    
        public int getValue(){
        	return value;
        }
    
        public String getLabel(){
        	return label;
        }
    
        public static Weather parse(int value){
             Weather result = Sunny;
             switch(value){
             	case 1:
             		result = Sunny;
             			break;
             	case 2:
             		result = Rainy;
             		break;
             	case 3:
             		result = Cloudy;
             		break;
            }
            return result;
        }
    
        public static List getEnumValues(){
        	return Arrays.asList(values());
        }
    
        public static void main(String args[]){
        	System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString());
            Weather weather = Cloudy;
            System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).toString());
            List list = getEnumValues();
            Weather sw;
            for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).toString()))
            sw = (Weather)iterator.next();
    	}
    
        Sunny;
        Rainy;
        Cloudy;
        private int value;
        private String label;
        static {
        	Sunny = new Weather(1, "\u6674\u5929");
        	Rainy = new Weather(2, "\u96E8\u5929");
        	Cloudy = new Weather(3, "\u591A\u4E91");
        }
    }

    ②、在上一步的基础上对照非反编译中的java源码可以还原大概,呵呵呵,可能你会说“狗屁,我要是知道源码了,还反编译干什么”,呵呵呵,别急,如果你能把上面的这个弄明白了,你就会反编译没有源码参考的枚举类了。

    ③、呵呵呵,本来到此就可以了事了,可是还是禁不住提几个地方:注意反编译前java文件和反编译后生成的java文件在引类的区别;注意反编译class文件后的泛型没有了;从反编译的结果中可以得出这样的结论:实际上枚举类型就是以Java类来实现的,没有什么新的特点,只不过java编译器帮我们做了语法的解析和编译。

    二、含有抽象的方法

    源码如下:

    import java.util.Arrays;
    import java.util.List;
    
    public enum Weather {
    	
    	Sunny(1, "晴天") {
    		@Override
    		public String test() {
    			return "今天阳光明媚!!!\n";
    		}
    	},
    	Rainy(2, "雨天") {
    		@Override
    		public String test() {
    			return "出门别忘带把雨伞哦!!!\n";
    		}
    	},
    	Cloudy(3, "多云") {
    		@Override
    		public String test() {
    			return "别出去登高望远了,你看不远的,呵呵呵!!!\n";
    		}
    	};
    
    	private int value;
    	private String label;
    
    	private Weather(int value, String label) {
    		this.value = value;
    		this.label = label;
    	}
    
    	public int getValue() {
    		return value;
    	}
    
    	public String getLabel() {
    		return label;
    	}
    
    	public abstract String test();
    
    	public static Weather parse(int value) {
    		Weather result = Weather.Sunny;
    		switch (value) {
    		case 1:
    			result = Weather.Sunny;
    			break;
    		case 2:
    			result = Weather.Rainy;
    			break;
    		case 3:
    			result = Weather.Cloudy;
    			break;
    		}
    		return result;
    	}
    
    	public static List<Weather> getEnumValues() {
    		return Arrays.asList(values());
    	}
    
    	public static void main(String[] args) {
    		System.out.println(Weather.Sunny.getValue() + ":" + Weather.Sunny.getLabel());
    		Weather weather = Weather.Cloudy;
    		System.out.println(weather.getValue() + ":" + weather.getLabel() + "\n\n");
    		List<Weather> list = getEnumValues();
    		for (Weather sw : list) {
    			System.out.println(sw.value + "--" + sw.label + "--" + sw.test());
    		}
    	}
    }

    反编译生成的class文件后的代码如下:

    import java.io.PrintStream;
    import java.util.*;
    
    public abstract class Weather extends Enum {
    
    	private Weather(String s, int i, int value, String label) {
    		super(s, i);
    		this.value = value;
    		this.label = label;
    	}
    
    	public int getValue() {
    		return value;
    	}
    
    	public String getLabel() {
    		return label;
    	}
    
    	public abstract String test();
    
    	public static Weather parse(int value) {
    		Weather result = Sunny;
    		switch (value) {
    		case 1: // '\001'
    			result = Sunny;
    			break;
    		case 2: // '\002'
    			result = Rainy;
    			break;
    		case 3: // '\003'
    			result = Cloudy;
    			break;
    		}
    		return result;
    	}
    
    	public static List getEnumValues() {
    		return Arrays.asList(values());
    	}
    
    	public static void main(String args[]) {
    		System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString());
    		Weather weather = Cloudy;
    		System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).append("\n\n").toString());
    		List list = getEnumValues();
    		Weather sw;
    		for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).append("--").append(sw.test()).toString()))
    			sw = (Weather) iterator.next();
    	}
    
    	public static Weather[] values() {
    		Weather aweather[];
    		int i;
    		Weather aweather1[];
    		System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i);
    		return aweather1;
    	}
    
    	public static Weather valueOf(String s) {
    		return (Weather) Enum.valueOf(Weather, s);
    	}
    
    	Weather(String s, int i, int j, String s1, Weather weather) {
    		this(s, i, j, s1);
    	}
    
    	public static final Weather Sunny;
    	public static final Weather Rainy;
    	public static final Weather Cloudy;
    	private int value;
    	private String label;
    	private static final Weather ENUM$VALUES[];
    
    	static {
    		Sunny = new Weather("Sunny", 0, 1, "\u6674\u5929") {
    			public String test() {
    				return "\u4ECA\u5929\u9633\u5149\u660E\u5A9A\uFF01\uFF01\uFF01\n";
    			}
    		};
    		Rainy = new Weather("Rainy", 1, 2, "\u96E8\u5929") {
    			public String test() {
    				return "\u51FA\u95E8\u522B\u5FD8\u5E26\u628A\u96E8\u4F1E\u54E6\uFF01\uFF01\uFF01\n";
    			}
    		};
    		Cloudy = new Weather("Cloudy", 2, 3, "\u591A\u4E91") {
    			public String test() {
    				return "\u522B\u51FA\u53BB\u767B\u9AD8\u671B\u8FDC\u4E86\uFF0C\u4F60\u770B\u4E0D\u8FDC\u7684\uFF0C\u5475\u5475\u5475\uFF01\uFF01\uFF01\n";
    			}
    		};
    		ENUM$VALUES = (new Weather[] { Sunny, Rainy, Cloudy });
    	}
    }

    总结:对比源代码和编译代码,找出他们的区别并不难,做到这一点就可以反编译含有抽象方法的枚举class文件,呵呵呵呵,将“不含抽象方法”的class反编译文件和“含有抽象方法”的class反编译文件,你应该还有一个很大的收获,呵呵呵,看着:

    “不含抽象方法”的class反编译文件:public final class Weather extends Enum

    “含有抽象方法”的class反编译文件:public abstractclass Weather extends Enum

    展开全文
  • jdGUI—java反编译工具

    2019-02-18 17:52:52
    是java反编译工具,可以把class文件转为java源码。很好用
  • 反编译微信小程序源码

    千次阅读 2019-04-23 20:49:15
    反编译,听起来很屌,其实还是简单的,基本是傻瓜式操作。要想拿到微信小程序源码,找到源文件在手机存放的位置就行,源文件拿到,用反编译脚本跑一下,微信小程序代码包里的所有文件、所有资源就出来了(除了...

    一、前言
           反编译,听起来很屌,其实还是简单的,基本是傻瓜式操作。要想拿到微信小程序源码,找到源文件在手机存放的位置就行,源文件拿到,用反编译脚本跑一下,微信小程序代码包里的所有文件、所有资源就出来了(除了project.config.json小程序配置文件)。拿到源码后,跑起来是能跑,但登录、授权等涉及到appid的功能是不能用的,因为被反编译小程序的服务端appid和你本地添加的不一样,这就是为啥拉下来的源码没有project.config.json文件的原因,项目中appid是配置在这个文件里,这里一定程度上保护原小程序。

    二、所需工具
        1.夜神模拟器,地址:夜神模拟器

         用来找寻微信小程序源文件,真机当然也可以,但麻烦,又是root权限,又是越狱的,夜神模拟器方便,直接在设置里就可以设置超级用户权限,超级权限拿到,就可以为所欲为了,通过下面这个RE文件管理器看到微信小程序源文件。
        2.RE文件管理器(拖到模拟器内自动安装),地址:RE

         用来找寻微信小程序源文件,官方没改动的话,应该会在这么个路径下,/data/data/com.tencent.mm/MicroMsg/.../appbrand/pkg/,路径中有一段...,这里表示不确定具体一个,反正就在这个MicroMsg下的其中一个文件夹,紧接着会看到appbrand文件夹,如果这样那就找到位置了。
         3.nodejs运行环境,地址:nodejs

        反编译脚本所需运行环境
         4.反编译脚本,地址:wxappUnpacker

          用来反编译微信小程序源文件,把源代码给编译出来,这是GitHub上一位大神的杰作,找到了这个比较好用的,其他版本自寻。
    三、开始搞事情
          1.安装好夜神模拟器后,并将在电脑下载好的RE文件管理器拖到模拟器内安装。

          2.打开手机设置->找到超级用户->右上角三个小点点击一下,设置->点击‘超级用户访问权限’,选择‘仅限于应用’,这样超级用户权限就拿到了。

         image-01

          3.打开微信,没有的在应用市场下载就行,打开想反编译的微信小程序,小程序打开后,可以切换到RE文件管理器去找源文件了。

           这里有一个机制,当点开一个微信小程序,如果本地这个文件夹下找到即将运行的小程序,会从微信服务器下载到本地,在以后的某个时刻又运行这个小程序,运行时,微信服务器会通知有没有小程序新版本,如有新版本,会在后台静默下载,小程序继续运行,新版本要到下一次运行才会启用,这就是微信小程序的更新机制。
           4.打开RE文件管理器,从更目录开始,/data/data/com.tencent.mm/MicroMsg/.../appbrand/pkg/,找到源文件后,长按->点击右上角三个小点,打开菜单,选择‘压缩所选文件’->完成后,点击查看->长按,还是右上角,将压缩包从模拟器发送出来到电脑上,方式多种,随意。

    image-02

          4.上面找到源文件并把源文件拉出来,从GitHub下载反编译文件后,在桌面就有了这样的文件夹结构

    nimi-yuan这个文件夹下这里放的是微信小程序源文件

    image-04

    lib这个文件夹下放的是反编译脚本

    image-03

    5.进入到目录:...\lib\wxappUnpacker-master文件夹下,右键,在这里打开命令行窗口,将这几句命令跑一下

            npm install esprima
            npm install css-tree
            npm install cssbeautify
            npm install vm2
            npm install uglify-es
            npm install js-beautify
            npm install escodegen

    image-05
           最后使用这个命令进行反编译源文件:node wuWxapkg.js filepath,例如我的是:node wuWxapkg.js C:\Users\zw\Desktop\fanbianyi\mini-yuan\_1034625975_4.wxapkg,反编译过程过如遇到抛出缺少某个文件的提示,用npm install filename再次跑一下就行(filename为抛出缺少文件名)。
           6.反编译完成,用node wuWxapkg.js filepath执行成功后

    image-06

           查看反编译成功后的文件夹,源码中除了project.config.json这个配置文件,其他的都有。

    image-07

    四、结语

           至此微信小程序的反编译过程就结束了,学会之后,欣喜若狂,一顿操作猛如虎,拉了两个小程序源码后,心生一种罪恶感。这种反编译方法很简单,由此可见微信小程序源码的安全性不好,过不久估计就不能这么干了,漏洞终究会被填补的。

    原文来自:https://blog.csdn.net/Im_Telling_You/article/details/82797979

    五,问题总结:

            以上方式基本能够实现反编译微信小程序,但是有一定的局限性,对于新的微信版本适配会出现问题,现今能完整反编译的只有一小部分,大多数时候会报适配错误。此反编译工具原作者在以下博客中给出了解释,并表示不再进行适配,有此需求的同学可以根据情况研究下原作者提出的建议,自己总结适配。博客地址于:https://github.com/qwerty472123/wxappUnpacker/issues/21

     

     

     

    展开全文
  • 反编译的应用

    2019-10-08 23:12:47
    闲暇之余,写了一个Eclipse下的Java反编译插件:EclipseClassDecompiler,整合了目前最好的2个Java反编译工具 Jad和JD-Core,并且和EclipseClassViewer无缝集成,能够很方便的使用本插件查看类库源码,以及采用本...

    本文摘自:http://bbs.csdn.net/topics/390263414

     

    闲暇之余,写了一个Eclipse下的Java反编译插件:Eclipse Class Decompiler,整合了目前最好的2个Java反编译工具 Jad和JD-Core,并且和Eclipse Class Viewer无缝集成,能够很方便的使用本插件查看类库源码,以及采用本插件进行Debug 调试。

    Eclipse Class Decompiler插件更新站点: http://feeling.sourceforge.net/update

    或者直接http://jd.benow.ca/jd-eclipse/update





    直接使用Eclipse进行更新,支持Eclipse 3.x, 4.x,不依赖任何其他插件,直接勾选更新插件即可。

     

    如果一直pendding 建议直接去https://marketplace.eclipse.org/content/eclipse-class-decompiler
    拖install到eclipse 除了文本框以外的任何位置




    下图为Eclipse Class Decompiler的首选项页面,可以选择缺省的反编译器工具,并进行反编译器的基本设置。缺省的反编译工具为JD-Core,JD-Core更为先进一些,支持泛型、Enum、注解等JDK1.5以后才有的新语法。



    首选项配置选项:
    1.重用缓存代码:只会反编译一次,以后每次打开该类文件,都显示的是缓存的反编译代码。
    2.忽略已存在的源代码:若未选中,则查看Class文件是否已绑定了Java源代码,如果已绑定,则显示Java源代码,如果未绑定,则反编译Class文件。若选中此项,则忽略已绑定的Java源代码,显示反编译结果。
    3.显示反编译器报告:显示反编译器反编译后生成的数据报告及异常信息。
    4.使用Eclipse代码格式化工具:使用Eclipse格式化工具对反编译结果重新格式化排版,反编译整个Jar包时,此操作会消耗一些时间。
    5.使用Eclipse成员排序:使用Eclipse成员排序对反编译结果重新格式化排版,反编译整个Jar包时,此操作会消耗大量时间。
    6.以注释方式输出原始行号信息:如果Class文件包含原始行号信息,则会将行号信息以注释的方式打印到反编译结果中。
    7.根据行号对齐源代码以便于调试:若选中该项,插件会采用AST工具分析反编译结果,并根据行号信息调整代码顺序,以便于Debug过程中的单步跟踪调试。
    8.设置类反编译查看器作为缺省的类文件编辑器:默认为选中,将忽略Eclipse自带的Class Viewer,每次Eclipse启动后,默认使用本插件提供的类查看器打开Class文件。


    插件提供了系统菜单,工具栏,当打开了插件提供的类反编译查看器后,会激活菜单和工具栏选项,可以方便的进行首选项配置,切换反编译工具重新反编译,以及导出反编译结果。





    类反编译查看器右键菜单包含了Eclipse自带类查看器右键菜单的全部选项,并增加了一个“导出反编译源代码”菜单项。



    打开项目路径下的Class文件,如果设置类反编译查看器为缺省的查看器,直接双击Class文件即可,如果没有设置为缺省查看器,可以使用右键菜单进行查看。




    Eclipse Class Decompiler插件也提供了反编译整个Jar文件或者Java包的反编译。该操作支持 Package Explorer对包显示布局的操作,如果是平铺模式布局,则导出的源代码不包含子包,如果是层级模式布局,则导出选中的包及其所有的子 包。




    Debug调试:可以在首选项选中对齐行号进行单步跟踪调试,和普通的包含源代码时的调试操作完全一致,同样的也可以设置断点进行跟踪。

    转载于:https://www.cnblogs.com/Kubility123/p/5657817.html

    展开全文
  • 反编译基础知识

    千次阅读 2020-06-29 18:55:47
    本文相关反编译技术仅限于技术研究使用,不能用于非法目的,否则后果自负. 1. apktool 逆向APK文件的工具 官方网站 apktool主要用于逆向apk文件,可以将资源解码,并在修改之后可以重新构建它们.它还可以用来重新构建apk...
  • apktool 反编译工具

    2019-03-14 10:16:21
    就是apktool 大家都知道是啥的 我还多说什么 ~~
  • JAD反编译工具

    2018-09-13 15:44:57
    这也要设置分数嘛,就是一个共享工具罢了,没法不设置分数,没有办法。。。
  • 【干货】常用EXE文件反编译工具

    千次阅读 2020-08-11 07:56:01
    另外,还具备有 W32DASM 软件的反编译能力和PEditor 软件的 PE 文件头编辑功能,可以更容易的分析源代码,修复损坏了的资源,可以处理 PE 格式的文件如:EXE、DLL、DRV、BPL、DPL、SYS、CPL、OCX、SCR 等 32 位可...
  • 下载该jar包以后,解压,将apk解压后得到的dex文件拷贝到ex-tools-2.1-SNAPSHOT目录,然后在命令行执行d2j-dex2jar classes.dex,就可以得到反编译的jar包了
  • Reflector反编译工具

    2017-12-13 10:16:58
    最新版,亲自试过,可以用 NET程序员的开发利器.NET Reflector
  • 使用IDEA进行反编译

    2021-03-06 11:37:17
    使用IDEA进行反编译 单击右上角的“项目结构”图标,找到文件位置。 复制文件位置到搜索框打开该文件。 点进去发现存在对应的class文件 回到IDEA,右键需要反编译的程序,选择“Open in”–>“File ...
  • 这是一个java的反编译工具,可以将jar的工具包反编译成java的源代码,先贡献出来供大家下载。
  • 你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言: 这个过程叫做编程。 然后你使用编译器(compiler)将它翻译成机器所能理解的语言: 这个过程...
  • 使用一个app时,某个按钮因为权限问题被置灰无法点击,很烦,于是想着能不能通过修改apk的方式来防止按钮变灰,因为按钮本身是可以点的,只是时间限制被置灰了,之前从没有相关经验,所以过程中踩了很多坑,花了三天...
  • Lua反编译

    2020-10-03 13:14:17
    前言 这个知识点的突破还是来自于一道解密题,题只有一个bin文件,然后就要输入答案。用记事本打开,发现是一串乱码,但是仔细一...1.下载反编译工具LuacGUI.exe 链接:https://pan.baidu.com/s/1wZ9Chk58G-hDBr-sPNLK
  • apk反编译工具
  • 首先声明:本文章仅供学习之用,不可它用。...那么赶紧来试试吧反编译,其实还是简单的,要想拿到微信小程序源码,找到源文件在手机存放的位置就行,源文件拿到,用反编译脚本跑一下,微信小程序代码包里的...
  • Android APK反编译哟~~~

    千次阅读 2020-12-21 17:55:21
    Android apk文件反编译 如果你的类(反编译的apk里面的代码)里面有lambda表达式的话,会出现反编译失败哦 还有反编译能拿到:xml、照片、代码 #反编译大概流程介绍 第一步:使用*“apkTool.jar"去反编译apk拿到xml、...
  • 文档java反编译

    2018-08-02 17:21:50
    使用该工具可以使得.class字节码文件编译成.java的源文件代码。
  • APK反编译

    2021-03-30 11:40:31
    将APK进行反编译之后,我们就可以看到开发这个应用使用的资源文件(图片)、layout、样式、相关的实现代码等,学习这些资源文件才有助于开发技术的提升。 本文主要是介绍APK反编译的方法,希望能够帮助到大家。 1. ...
  • Android开发学习之路-脱壳反编译

    千次阅读 2019-12-26 09:26:15
    想研究下某app里面的实现技术,使用常规的反编译发现竟然是加固的,所谓Apk加固,就是对dex文件进行加密,防止App被反编译,保证apk的安全。市面上有很多的加固平台,有360加固,腾讯乐固,爱加密等等。 上一篇文章...
  • luades反编译.zip

    2020-06-21 07:20:27
    luadec 5.1.5.2 5.3 集成了VC的两个运行库。放在BIN目录下可用。不用再去找了。里面还有luareplace ,luaopswap ,不知道嘛用的。
  • 我的所有原创Android知识体系,已打包整理...一般来说,如果只是想借鉴一下友商的code,我们只需要拿到对方的apk,拖到jadx里面就行.jadx能查看apk的xml布局和java代码.jadx有时候会出现部分class反编译失败的情况,这时可.
  • DeDeDark反编译

    2014-11-19 14:29:02
    DeDeDark反编译dll exe 工具 脱壳版
  • 反编译通常有几种目的:互相学习、借来用用、嘿嘿(干你,又分为小干干类似微信红包,和大干改别人的apk帮他上架)。 因为没带kvm回来,mbpr屏幕太小,所以下文环境为windows。 一、反编译 让我们从实战开始,先...
  • PyInstaller:编译exe与反编译

    万次阅读 多人点赞 2019-06-24 17:54:28
    4 对PyInstaller打包的不加密编译exe进行反编译 使用pyinstxtractor.py 对上述不加密的exe进行反编译,其中pyinstxtractor.py文件内容如下: """ PyInstaller Extractor v1.9 (Supports pyinstaller 3.3, 3.2, 3.1,...
  • 前几天写程序的时候电脑突然坏了,代码没有提交,已经更新过了,也就是说写的东西,除了DLL文件之外没别的东西了,代码全都没了,突然灵光一闪,想到了反编译。说。 百度上搜了下反编译工具,发现一款名叫...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,570
精华内容 17,028
关键字:

反编译可以干什么