精华内容
下载资源
问答
  • 什么样的语言可以进行反编译 本文从知乎扒的,没扒图,感觉文字就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
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 【软考5】解释型 or 编译

    热门讨论 2015-10-23 07:26:47
    导读:在上篇博客中,我们了解到,目前的编码语言经过不断的...这里,就出现了解释和编译的概念。 一、概述 由于计算机只能理解0和1,那么高级程序设计语言在执行的时候,则需要对其进行翻译。担负这一任务的程序称

    导读:在上篇博客中,我们了解到,目前的编码语言经过不断的发展,已经经历了机器语言——汇编语言——高级语言的过程。虽然我们的编码语言在不停的升级,但作为计算机来说,它始终是一个只能理解0和1构成的机器语言的,那么,高级语言怎样才能让计算机理解呢?这里,就出现了解释和编译的概念。

    一、概述

    由于计算机只能理解0和1,那么高级程序设计语言在执行的时候,则需要对其进行翻译。担负这一任务的程序称为“语言处理程序”。语言之间的翻译形式多种多样,基本方式为:汇编、解释、编译。

    理解几个基本概念:

    1.1,源程序

    源程序:用某种高级语言汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行。如果源程序是用汇编语言编写的,则需要一个汇编程序将其翻译成目标程序后才能执行。如果源程序是用某种高级语言编写的,则需要对应的解释程序或编译程序对其进行翻译,然后在机器上运行。

    1.2,解释程序

    解释程序:也称为解释器,它或者直接解释执行源程序,或者将源程序翻译成某种中间代码后再加以执行

    1.3,编译程序

    编译程序:也称为编译器,是将源程序翻译成目标语言程序,然后在计算机上运行目标程序。

    1.4,汇编程序

    汇编程序:将用汇编语言编写的源程序翻译成机器指令程序。其基本工作包括将每一条可执行汇编语句转换成对应的机器指令,处理源程序中出现的伪指令。

    二、具体定义

    2.1,解释型

    相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如Python/JavaScript / Perl /Shell等都是解释型语言。

    解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。因此效率比较低。比如Basic语言,专门有一个解释器能够直接执行Basic程 序,每个语句都是执行的时候才翻译。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨 平台性好.)

    2.2,编译型

    运行编译型语言是相对于解释型语言存在的,编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。

    编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等.

    3.2,汇编型

    使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。

    三、区别和联系

    3.1,联系

    不管是汇编、解释 或者是编译,这些都是将高级语言翻译成机器语言的一种 方式,他们最终的目的和本质是相同 的,只是过程和形式不一样。

    3.2,区别

    解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。因此效率比较低。比如Basic语言,专门有一个解释器能够直接执行Basic程 序,每个语句都是执行的时候才翻译。在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨 平台性好。

    编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等。

    汇编型语言:从严格意义上来说,在我看来,汇编作为一种符号语言,还算不上是一种高级语言。但如果从机器是否理解的角度来区分高级语言,那么汇编也可以算是一种高级语言。汇编源程序,必须经过两次扫描转换为目标程序。其执行运行过程为:(1) 用编辑程序(EDIT)建立ASM源文件;(2) 用MASM程序把ASM文件(即汇编语言程序)转换成OBJ文件;(3) 用LINK程序把OBJ文件转换成EXE文件;( 4) 用调试程序DEBUG调试EXE文件;(5) 在DOS命令行下直接键入EXE文件名就可以执行。汇编型语言是面向机器进行编码,其运行效率是非常高的。但每一种处理器都有不同的汇编语法和编译器,所以汇编型语言的可移植性很差。

    四、学习感受

    对于解释型或者编译型的学习,目前也只能是从宏观上去了解它,尤其是汇编这一块,现在对于我来说,去搞懂其汇编过程还是比较困难的。但从学习这个也可以看出,语言向着高级发展,但在实际执行的过程中,却又翻译成最原始的机器语言,所以,大概是越高级的语言,其程序效率越低吧。语言的发展向着用户理解,那么将来需要解决的问题大概是:怎样平衡高效的用户理解和高效的机器理解!

    展开全文
  • 理解这个问题,先要看「正」编译的过程是怎样的。 你有一个想法,这是一种人类自然语言...编程和编译都是「信息丢失」的过程。比如你说,我有一组整数,我要把这些数排个序,然后轻车熟路地写了个冒泡排序。然而一定

    要理解这个问题,先要看「正」编译的过程是怎样的。
    你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言:


    这个过程叫做编程
    然后你使用编译器(compiler)将它翻译成机器所能理解的语言:



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

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

    比如说有比反编译更低级(非贬义)的过程,叫做反汇编:



    严格来说汇编语言也是一种编程语言,不过我们在这里把它和我们常说的高级编程语言(包括C语言)区分开。

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

    这就是很多程序语言只能反汇编、不能(难以,下同)反编译的原因。一般我们管这种语言叫「编译语言」,又称「原生语言」。代表有C、C++等。

    那为什么有的语言可以反编译呢?这又要从机器语言说起。就像不同地域的人所用的语言不同一样,不同的机器说的语言也不尽相同。用行话说,叫「指令集不同」。比方说,你的电脑和你的手机,指令集通常是不一样的。一段程序要让不同的机器都能执行,只能分别翻译(编译)成相应的机器语言。这个过程太麻烦了,于是人们想了个办法,搞出了一种叫解释语言的东西(此处未考证解释语言是否就是因此发明的,只是帮助理解)。如下图:


    解释语言有两种执行方式,这取决于执行端的「解释器」是如何工作的。一种是直接解释执行,中间就没有机器语言什么事情了,但这种方式效率很低。因此现代的解释语言基本上都会采用第二种方式,也就是经由图中上部的路径,先通过JIT编译的方式翻译成机器语言,然后再执行,保证执行效率。JIT编译大致可以理解为「用到什么就编译什么」,这个过程常常是在执行过程中同步进行的。
    「解释器」的英文interpreter,其实就是名词「翻译」的意思。这好比你国外交部发了封文件到各国大使馆,再由大使馆的工作人员分别翻译成相应的语言,传达给目标国相关部门。代表性的解释语言如Javascript,它要在不同机器的浏览器上都能正确执行,所以采用这种方式。
    但是这样一来,程序代码就必须提供给每一台执行端机器了。这可是泄密啊。对于防止泄密,最直接的方式自然是加密。


    有锁就有钥匙,同时也有开锁术;有加密解密,也有相应的破解方式。这时候所谓的「反编译」,其实就是破解加密算法。这一点就不展开聊了。

    后来,人们觉得解释语言执行得实在有点慢,于是又想了一个办法:把一些可以前期做掉的工作先做掉,只留着那些跟目标机器有关的工作,到时候再说。于是程序被处理成了一种叫做「中间语言」,或者叫「字节码」的东西:


    这个过程一般也叫做编译。中间语言词汇少,比较精炼,执行起来也更快。这些语言一般也会用上JIT技术,进一步把中间语言编译成机器语言(而非解释执行),执行效率也就跟那些原生的编译语言不相上下了。这种语言代表性的有C#、Java等。

    程序语言可以编译成中间语言,反过来,中间语言也可以在一定程度上反编译成程序语言。这是因为采用这种编译方式的编程语言为了保证它们的高级特性(比如说反射),在编译的过程中保留了源程序的绝大部分信息,只有很少的信息丢失;也正是因为丢失了这一部分信息,中间语言通常不能完美地反编译——最常见的就是反编译出来的程序中局部变量的名字都丢了,被替换成了由反编译器自动生成的名字。但这样反编译出来的程序,结构和功能都是完备的,可读性也有一定的保障。一般来说,我们所说的可以反编译的程序都是指这样一类语言写就的程序。

    中间语言可以被反编译;加密又会被破解,而且执行前还要解密,会带来额外的性能开销。有没有办法能让代码既能有效执行,又不被截获代码的人所利用呢?这时候人们从一些职业素养很差的程序员那里得到了启发。

    实现一个相同的功能,可以有无数种形式的代码。你恪尽职守,认认真真地写注释,准确地命名函数和变量, 严格按照规范进行缩进和换行;小明却相反,完全没有注释,变量全部用abcd乃至故意误导别人(var mySon = laowang.Son),缩进换行邋遢,尤其是在大括号前不换行,让大家很不满。于是老板想,我们先把小明开除掉,然后给你发奖金并要求大家按照你的方式写代码,并且开发一个工具,唤作「混淆器」,在发布时再把代码处理成小明写的那种样子:



    这样代码即使被反编译和解密了,别人看也看不懂,不小心还会被带到坑里去。代码毕竟是写给人看的,只是偶尔让机器跑一跑,所以没有可读性的代码是没有价值的。这种方法一出,广受好评,于是变成了一种非常普遍的做法。注意图中省略了中间代码和JIT的步骤,混淆通常会跟这些技术一起使用。



    转自:https://www.zhihu.com/question/21853681/answer/74134768
    展开全文
  • 理解这个问题,先要看「正」编译的过程是怎样的。你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言: 这个过程叫做编程。然后你使用编译器...

    来源:https://blog.csdn.net/z8414/article/details/73332009

    要理解这个问题,先要看「正」编译的过程是怎样的。
    你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言:

    这个过程叫做编程。
    然后你使用编译器(compiler)将它翻译成机器所能理解的语言:



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

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

    比如说有比反编译更低级(非贬义)的过程,叫做反汇编:



    严格来说汇编语言也是一种编程语言,不过我们在这里把它和我们常说的高级编程语言(包括C语言)区分开。

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

    这就是很多程序语言只能反汇编、不能(难以,下同)反编译的原因。一般我们管这种语言叫「编译语言」,又称「原生语言」。代表有C、C++等。

    那为什么有的语言可以反编译呢?这又要从机器语言说起。就像不同地域的人所用的语言不同一样,不同的机器说的语言也不尽相同。用行话说,叫「指令集不同」。比方说,你的电脑和你的手机,指令集通常是不一样的。一段程序要让不同的机器都能执行,只能分别翻译(编译)成相应的机器语言。这个过程太麻烦了,于是人们想了个办法,搞出了一种叫解释语言的东西(此处未考证解释语言是否就是因此发明的,只是帮助理解)。如下图:

    解释语言有两种执行方式,这取决于执行端的「解释器」是如何工作的。一种是直接解释执行,中间就没有机器语言什么事情了,但这种方式效率很低。因此现代的解释语言基本上都会采用第二种方式,也就是经由图中上部的路径,先通过JIT编译的方式翻译成机器语言,然后再执行,保证执行效率。JIT编译大致可以理解为「用到什么就编译什么」,这个过程常常是在执行过程中同步进行的。
    「解释器」的英文interpreter,其实就是名词「翻译」的意思。这好比你国外交部发了封文件到各国大使馆,再由大使馆的工作人员分别翻译成相应的语言,传达给目标国相关部门。代表性的解释语言如Javascript,它要在不同机器的浏览器上都能正确执行,所以采用这种方式。
    但是这样一来,程序代码就必须提供给每一台执行端机器了。这可是泄密啊。对于防止泄密,最直接的方式自然是加密。

    有锁就有钥匙,同时也有开锁术;有加密解密,也有相应的破解方式。这时候所谓的「反编译」,其实就是破解加密算法。这一点就不展开聊了。

    后来,人们觉得解释语言执行得实在有点慢,于是又想了一个办法:把一些可以前期做掉的工作先做掉,只留着那些跟目标机器有关的工作,到时候再说。于是程序被处理成了一种叫做「中间语言」,或者叫「字节码」的东西:

    这个过程一般也叫做编译。中间语言词汇少,比较精炼,执行起来也更快。这些语言一般也会用上JIT技术,进一步把中间语言编译成机器语言(而非解释执行),执行效率也就跟那些原生的编译语言不相上下了。这种语言代表性的有C#、Java等。

    程序语言可以编译成中间语言,反过来,中间语言也可以在一定程度上反编译成程序语言。这是因为采用这种编译方式的编程语言为了保证它们的高级特性(比如说反射),在编译的过程中保留了源程序的绝大部分信息,只有很少的信息丢失;也正是因为丢失了这一部分信息,中间语言通常不能完美地反编译——最常见的就是反编译出来的程序中局部变量的名字都丢了,被替换成了由反编译器自动生成的名字。但这样反编译出来的程序,结构和功能都是完备的,可读性也有一定的保障。一般来说,我们所说的可以反编译的程序都是指这样一类语言写就的程序。

    中间语言可以被反编译;加密又会被破解,而且执行前还要解密,会带来额外的性能开销。有没有办法能让代码既能有效执行,又不被截获代码的人所利用呢?这时候人们从一些职业素养很差的程序员那里得到了启发。

    实现一个相同的功能,可以有无数种形式的代码。你恪尽职守,认认真真地写注释,准确地命名函数和变量, 严格按照规范进行缩进和换行;小明却相反,完全没有注释,变量全部用abcd乃至故意误导别人(var mySon = laowang.Son),缩进换行邋遢,尤其是在大括号前不换行,让大家很不满。于是老板想,我们先把小明开除掉,然后给你发奖金并要求大家按照你的方式写代码,并且开发一个工具,唤作「混淆器」,在发布时再把代码处理成小明写的那种样子:



    这样代码即使被反编译和解密了,别人看也看不懂,不小心还会被带到坑里去。代码毕竟是写给人看的,只是偶尔让机器跑一跑,所以没有可读性的代码是没有价值的。这种方法一出,广受好评,于是变成了一种非常普遍的做法。注意图中省略了中间代码和JIT的步骤,混淆通常会跟这些技术一起使用。

    --------------------------------------------------------------------------

    附:代码混淆-维基百科

    https://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86

    代码混淆Obfuscation)是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。

    代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。当前已经存在许多种功能各异的代码混淆器。

    其主要工作有:

    • 将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。
    • 重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。
    • 打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。
    • 添加花指令,通过特殊构造的指令来使得反汇编器出错,进而干扰反编译工作的进行。

    代码混淆器也会带来一些问题。主要的问题包括:

    • 被混淆的代码难于理解,因此调试也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。
    • 对于支持反射的语言,代码混淆有可能与反射发生冲突。
    • 代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。

    转载于:https://www.cnblogs.com/jiading/p/11146288.html

    展开全文
  • 理解webpack4.splitChunks

    2020-02-20 15:40:23
    之前一直也没有研究过webpack4是基于怎样的规则去拆分模块的,现在正好有时间打算好好了解一下,看了官方文档也陆陆续续的看了看网上别人写的文章,感觉大部分都是将官方文档翻译了一遍,很多问题都没有解释清楚,...
  • 这里以一个c程序main.cGNU编译系统(静态链接)为例来说明生成可执行文件的过程: 1.首先经过c预处理器(cpp)将main.c翻译成一个 ASCII码的中间文件main.i; 2.接下来驱动程序运行C编译器
  • 我觉得有必要写几篇介绍Webpack的功能特性的文章以帮助初学者快速理解。此文是最开始的一篇。 <h2>Webpack的核心原理 <p>Webpack的两个最核心的原理分别是: 1. 一切皆模块 正如js文件可以是一个“模块&#...
  • 其图书广泛销售于70多个国家地区,并被翻译为28种语言。CharlesWright,TheDenverPost系统编辑,与人合作在加利佛尼亚主要报纸开办个人计算机专栏。现为MinneapolisStarTribuneOnlineProject技术协调员。1995年...
  • Access传递查询_说明

    2015-05-20 18:20:29
    传递查询包含的是事务SQL语句,它们被直接发往Sql Server进行处理,并不需要jet数据库引擎翻译和编译它们。 传递查询的优点: 1、 传递查询可以使用Sql Server的固有函数和存储求过程。 2、 传递查询可以记录Sql ...
  • 计算机组成原理 期末考试复习大纲

    万次阅读 多人点赞 2012-06-24 18:54:18
    第一章 1.计算机软件的分类。 P11 计算机软件一般分为两大类:一类叫系统程序,一类叫应用程序。 2.源程序转换到目标程序的方法。 ...P12 源程序是用算法语言编写的程序。...3.怎样理解软件硬件的
  • o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 o 2.9 main() 的正确定义是什么? ...
  • Reversing:逆向工程揭密

    热门讨论 2010-06-21 17:00:47
    所有的翻译和校对工作历时半年多,在此,我要感谢为本书的出版付出辛勤汗水的电子工业出版社博文视点的工作人员,特别要感谢本书的策划编辑朱沭红老师和责任编辑顾慧芳老师,她们的严谨认真工作使该译本可读性更高,...
  • 所有的翻译和校对工作历时半年多,在此,我要感谢为本书的出版付出辛勤汗水的电子工业出版社博文视点的工作人员,特别要感谢本书的策划编辑朱沭红老师和责任编辑顾慧芳老师,她们的严谨认真工作使该译本可读性更高,...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    18.2 在 C #代码中调用 C++ VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • C#微软培训资料

    2014-01-22 14:10:17
    18.2 在 C #代码中调用 C++ VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • asp.net知识库

    2015-06-18 08:45:45
    ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language Swithcer and Theme Swicher 多语言转换和多样式主题转换 ASP.NET2.0 ObjectDataSource的使用详解(1) ASP.NET2.0 ObjectDataSource的使用详解(2) ...
  • 3.10 执行一个单独编译的程序 29 3.11 小结 30 进一步的研究 30 习题 30 第4章 协议的程序接口 32 4.1 引言 32 4.2 宽松定义的协议软件接口 32 4.3 接口功能 33 4.4 概念性接口的规范 33 4.5 API的实现 34 ...
  • MYSQL中文手册

    2013-03-11 21:21:34
    7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端实用工具程序 8.1. 客户端脚本实用工具概述 8.2. myisampack:...
  • 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端实用工具程序 8.1. 客户端脚本实用工具概述 8.2. myisampack:生成压缩...
  • 3.4.7 理解操作系统Shell变量 38 3.4.8 UNIX中的输入输出重定向 41 3.4.9 防止文件被覆盖 41 3.5 UNIX中文件目录的浏览 42 3.5.1 UNIX系统中的文件 42 3.5.2 链接文件 42 3.5.3 管理文件 42 ...
  • C) 图形能够更加直观地描述目标系统,便于用户理解和交流,有利于开发者与用 户之间达成一致的需求 D) 图形比文字描述简单、形象 二、 判断题 1. 在进行了可行性分析后,需求分析就只需要解决目标系统的设计方案...
  • 我要感谢博文视点的各位朋友,感谢郭老师的理解和支持,感谢李玲的辛勤工作,感谢江立李冰,你们的高效让我非常钦佩。我还要感谢孟岩老师,你给我的鼓励我一直记在心里。我要感谢我的挚友郭洪桥,不仅仅因为你在...
  • 我要感谢博文视点的各位朋友,感谢郭老师的理解和支持,感谢李玲的辛勤工作,感谢江立李冰,你们的高效让我非常钦佩。我还要感谢孟岩老师,你给我的鼓励我一直记在心里。我要感谢我的挚友郭洪桥,不仅仅因为你在...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    2、理解Windows的消息机制,窗口句柄其他GUI句柄的含义用途。了解MFC各个类功能相近的API函数。 3、一定要理解MFC中消息映射的作用。 4、训练自己在编写代码时不使用参考书而是使用Help Online。 5、记住一些...
  • JAVA 正则表达式

    热门讨论 2010-01-15 11:16:37
    m) 在这种模式下,'^''$'分别匹配一行的开始结束。此外,'^'仍然匹配字符串的开始,'$'也匹 配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始结束。 Pattern.UNICODE_CASE (?u) 在这个模式下...
  • {id: 112, name: '深入理解计算机原理', price: 98}, {id: 113, name: '现代操作系统', price: 87}, ] }, methods: { getTotalPrice: function () { let result = 0 for (let i=0; i < this.books.length...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

怎样理解翻译和编译