精华内容
下载资源
问答
  • 21CTO导读:Go正在成为流程的编程语言。...在本节我们一起讨论如下内容:1、Go 程序结构2、运行 Go 程序3、Go程序里的注释4、关于分号5、重新审视代码Go程序结构要了解Go程序的结构,先写一下Go程序,...

    21CTO导读:Go正在成为流程的编程语言。本文为大家介绍如何配置Go应用程序。

    3156a8e4bf3fe39193bd5f150aaf3601.png

    每个编程语言都有自己的语法或结构,有属于自己的风格,这才是每个语言的独特所在。Go语言也不例外,它以自己的方式,轻松优雅,让软件开发变得更有趣。

    在本节我们一起讨论如下内容:

    1、Go 程序结构

    2、运行 Go 程序

    3、Go程序里的注释

    4、关于分号

    5、重新审视代码

    Go程序结构

    要了解Go程序的结构,先写一下Go程序,我们先重新审核我们最喜爱的Hello,World!程序。

    package main 

    import "fmt" 

    func main() { 

        fmt.Println("Hello, World!")

    }

    每个源文件均以.go扩展名为结构,头部首行必须进行包声明。在上面的helloworld.go文件中,第一行的package main告诉go编译器,这个源文件将包含go的入口main(主函数)函数。包声明和主函数这种组合使它成为一个独立的可执行go程序。

    在上面的代码中,是打印字符串到控制台,这是标准输出。为此,我们使用 import 关键字导入 fmt 包。 fmt软件包是format的综合,它附带了Go标准库。

    fmt软件包提供了许多用于写入标准输出的选项。接下来我们会分别讲解导入多个包的语法。

    运行Go程序

    我们使用 go run 或 go build 来运行相关Go程序。使用这些命令,来告诉Go编译器来运行Go程序。

    394feb4cbc7bf453c4a91b5ab20e554c.png

    使用go运行hello-world.go

    我们还可以使用go build命令,该命令将生成一个叫做hello-world的可执行文件,它可以像其它可以的执行文件一样脱离go来独立运行。

    14c191e9caf3228ddbe6a4677bcfa438.png

    某此时候,我们可能希望更改可执行文件的名字,可以使用go build -o 命令来实现,该命令会创建一个可执行的二进制文件。例如:

    $go build -o exe #being in the hello-world directory

    $./exe #running the executable Hello,World!

    还有一些时候,我们希望让自己的应用程序可以被安装。我们使用go install 命令。该命令会创建一个二进制可执行文件并存储到$GOPATH/bin目录中。

    我们需要确定将GOBIN添加到系统的PATH环境变量中,这样就可以在系统的任何地方运行该二进制文件。

    135392ffd0bd1a575d255121113dc1b8.png

    代码注释

    在正确的位置添加代码注释,与编写可维护的代码同样重要。

    在Go中,注释不仅仅是添加关联解释的一种方式,同时也是一种记录API的良好方式。我们将在讨论函数时看到它们。

    有两种代码注释:一种是行注释,一种是块注释。

    1.行注释,使用//开头,后面就是注释掉的文本

    2.块注释是将文本放在 /* 和 */之间。以下是两个例子:

    // package main defines the entry point

    package main 

    // import the 'fmt' package from standard library

    import "fmt" 

    /*

        The main function is the entry point in a Go program.

        The main function does not have a return type.

        Also, it does not accept any parameters.

    */

    func main() { 

        fmt.Println("Hello, World!")

    }

    为什么没有分号

    正如您在上面的代码中所观察到的那样,我们的代码中没有放置单个分号。 嗯,那是因为幕后Go为你做了。 与C一样,Go的语法也使用分号来终止语句,但它们不必出现在源代码中。 以下是Go文档所说的内容:

    与C一样,Go的形式语法使用分号来终止语句,但与C语言不同,这些分号不会出现在源语句中。 相反,词法分析器使用一个简单的规则在扫描时自动插入分号,因此输入文本大多没有分号。 

    规则是这样的:如果换行符之前的最后一个标记是一个标识符(包括int和float64类的单词),一个基本文字,如数字或字符串常量,或其中一个标记break continue fallthrough return ++ -- ) }

    词法分析器总是在令牌后插入分号。 这可以概括为“如果换行符出可以结束语句的标记,则插入分号”。 

    在结束括号之前也可以省略分号,因此诸如tokens break continue fallthrough return ++ -- ) }的语句tokens break continue fallthrough return ++ -- ) }

    不需要分号。

    tokens break continue fallthrough return ++ -- ) }

    要阅读有关内幕的更多信息,请继续花些时间阅读Go Docs 。

    重新代码守则

    如前所述,每个独立应用程序必须具有package main声明,并且具有此声明的.go文件必须具有main函数。 这个main功能是我们应用程序的入口点,就像其他编程语言一样,如C,Java,C#等。

    不同的是,在Java或C#中, main函数可以接受参数(string [],args),而在Go中main函数不接受任何参数。 此外,主要功能不返回任何内容。

    请注意我们如何导入fmt包: import "fmt" 。 仅当我们导入单个包时,此语法才有效。 如果我们要导入多个包,那么我们需要在import ()对包进行分组。 这是一个例子:

     // importing multiple packages in Go import ( "context" "database/sql" "fmt" "log" ) 

    请注意,我们还没有放一个; 在任何导入包的末尾,因为这将由词法分析器为我们完成。

    小结

    Go有一个非常简单的程序结构,其感觉和读取更像是C.遵循相同的模式,我们将main功能作为我们应用程序的入口点。 Go提供了一种编写干净代码的便捷方式,可以在需要时巧妙地插入分号。 我们的代码中的逻辑描述有不同类型的注释。 稍后我们将看到这些注释如何为我们的包构建文档。

    为了更好地了解幕后发生的事情以及我们如何在Go中编写高质量的代码,我强烈建议您从Go文档中查看Effective Go页面。

    作者:洛逸

    ac2fe610eb4bdf09fa513b607cfa4a85.png

    展开全文
  • 编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言...

    通常的说法,编译代表着将一个高级语言转化为 CPU 能执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。

    与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言就是这么运行的。

    在 Python 中,源代码会被编译为更低级的一种形式,我们称之为字节码。字节码是一串指令,和 CPU 的指令集类似。但是字节码并不直接被 CPU 执行,而是在虚拟机中执行的。当然,这里的虚拟机并不模仿整个操作系统的环境,只是提供了字节码执行的一个环境。

    Python 还有一个重要的特性,就是交互式命令行。你可以敲入一行 Python 语句,然后立刻回车执行。实际上,即使是这个过程,Python 同样是先转为字节码,然后执行。而这个交互式命令行这个特性,在很多编译型语言里是没有的。同样因为没有显示的调用编译程序,很多人将执行 Python源文件的程序叫做 Python 解释器。

    解释型语言和编译型语言

    计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。

    编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。

    解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

    通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上接近编译型语言,而不能超过编译型语言。

    此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

    用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

    内容扩展:

    一个经常听见的问题,那就是:Python 是解释型的语言吗?它会被编译吗?这个问题没有想象中那么好回答。和很多人认识世界一样,习惯以一个简单的模型去评判一些事物。而事实上,里面包含了很多很多的细节。

    通常的说法,编译代表着将一个高级语言转化为 CPU 能执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。

    与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言就是这么运行的。

    但事实上,上面的定义有太多的局限。一门真正的语言,为了拥有更多有用和强大的特性,通常采用了各种各样的实现方式。我们可以将编译理解为更通用一些:将一种语言转化为另一种语言形式。通常来说,源语言比目标语言要更高级一些,比如将 C 转化为机器码。当然,JavaScript 8 到 JavaScript 5 的转化也算是一种编译。

    到此这篇关于python属于解释型语言么的文章就介绍到这了,更多相关python是解释型语言吗内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!

    展开全文
  • 微软的SQL SERVER数据库的Image、text等字段都属于二进制的大对象。这些对象的存取和其他轻型对象略有不同。 Framework的System.IO命名空间下给我们提供了一个FileStream文件流类。我们可以使用这个文件流对二进制...
  • Linux 二进制分析

    千次阅读 2018-11-06 11:55:21
    二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案...

    内容简介

    二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码(二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案。本书将带领读者探索连一些专家都未曾接触的领域,正式进入计算机黑客世界。

    本书是一本剖析 Linux ELF 工作机制的图书,共分为9章,其内容涵盖了 Linux 环境和相关工具、ELF 二进制格式、Linux 进程追踪、ELF 病毒技术、Linux 二进制保护、Linux 中的 ELF 二进制取证分析、进程内存取证分析、扩展核心文件快照技术、Linux/proc/kcore 分析等。

    如果你是一名软件工程师或者逆向工程师,想要学习 Linux 二进制分析相关的内容,本书实为明智之选。本书提供了在安全、取证和杀毒领域中实施二进制分析的解决方案。本书也适合安全爱好者和系统工程师阅读。为了更好地理解本书内容,读者需要具备一定的 C 语言编程基础和 Linux 命令行知识

    作者简介

    Ryan O'Neill(ELF 大师)是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由 EFnet、BBS 系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan 在 DEFCON 和 RuxCon 等很多计算机安全会议上发表过演讲,还举办了一个为期两天的 ELF 二进制黑客研讨会。

    他的职业生涯非常成功,曾任职于 Pikewerks、Leviathan 安全集团这样的大公司,近在 Backtrace 担任软件工程师。

    Ryan 还未出版过其他图书,不过他在 Phrack 和 VXHeaven 这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站上找到。

    本书内容

    译者序

    译者棣琦(本名张萌萌),曾梦想成为一名高级口译,却阴差阳错成了一个爱写代码的程序员。在 IT 江湖升级打怪的过程中,为了不断提高自己的技能,看书是少不了的;而要想成为高级玩家,看英文书自然也是必须。一个很偶然的机会,我接触到了本书的英文版。第一遍翻看时略显吃力,毕竟书中讲述的许多概念都是作者的原创,网上几无相关资料。但是这些稀缺的内容对于深入理解二进制分析却非常重要,译者由此尝到了知识的甜头。本着“独乐乐不如众乐乐”和“知识分享”的目的,本书的翻译之路就这样顺理成章地开始了。

    要想成为一名真正的黑客,不仅要会编写程序,还需要解析程序,对已有的二进制文件进行反编译,洞悉程序的工作原理。而本书完全是作者多年来在逆向工程领域的实战经验总结,其内容从 Linux 二进制格式的简单介绍到二进制逆向的细节,不一而足。书中还穿插了作者自己维护的许多项目或软件代码示例。相信通过本书的学习,读者完全可以掌握 Linux 二进制分析相关的一套完整的知识体系,为成长为一名高水平的黑客打下坚实的基础。考虑到本书并非针对零基础的读者编写,因此建议读者能够有一定的 C 语言和 Linux 基础,以便更好地理解领会书中精华。另外,任何 IT 技术的学习掌握,都离不开动手操作。读者要想叩开 Linux 二进制世界的大门,需要亲自动手实践书中示例,才能将书本知识转换为自身技能。

    最后,不能免俗的是各种致谢(虽然俗,但诚意百分百)。感谢我的父母对我闯荡江湖的支持,感谢 Linux 中国创始人王兴宇的信赖,感谢语音识别领域的技术大牛姚光超提出的宝贵建议,感谢我的朋友 Ray 对我的鼓励。当然,更要感谢各位读者的支持。

    最后的最后,由于译者水平有限,外加本书作者在表达上多有晦涩之处,因此译文难免有纰漏,还望广大读者以及业内同行批评指正。

    2017年9月

    北京

    关于作者

    Ryan O'Neill 是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由 EFnet、BBS 系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时就接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan 在 DEFCON 和 RuxCon 等很多计算机安全会议上发表过演讲,还举办了一个为期两天的 ELF 二进制黑客研讨会。

    他的职业生涯非常成功,曾就职于 Pikewerks、Leviathan 安全集团这样的大公司,最近在 Backtrace 担任软件工程师。

    Ryan 还未出版过其他图书,不过他在 PhrackVXHeaven 这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站(http://www.bitlackeys.org)上找到。

    致谢

    首先,要向我的母亲 Michelle 致以真诚的感谢,我已经将对她的感谢表达在这本书里了。这一切都是从母亲为我买的第一台计算机开始的,随后是大量的图书,从 UNIX 编程,到内核内部原理,再到网络安全。在我生命中的某一刻,我以为会永远放弃计算机,但是大约过了5年之后,当我想要重新点燃激情时,却发现已经把书扔掉了。随后我发现母亲偷偷地把那些书帮我保存了起来,一直到我重新需要的那一天。感谢我的母亲,你是最美的,我爱你。

    还要感谢我生命中最重要的一个女人,她是我的另一半,是我的孩子的母亲。毫无疑问,如果没有她,就不会有我今天生活和事业上的成就。人们常说,每一个成功男人的背后都有一个伟大的女人。这句古老的格言道出的的确是真理。感谢 Marilyn 给我带来了极大的喜悦,并进入了我的生活。我爱你。

    我的父亲 Brian O'Neill 在我生活中给了我巨大的鼓舞,教会了我为人夫、为人父和为人友的许多东西。我爱我的父亲,我会一直珍惜我们之间哲学和精神层面的交流。

    感谢 Michael 和 Jade,感谢你们如此独特和美好的灵魂。我爱你们。

    最后,要感谢我的3个孩子:Mick、Jayden 和 Jolene。也许有一天你们会读到这本书,知道你们的父亲对计算机略知一二。我会永远把你们放在生活的首位。你们3个是令我惊奇的存在,为我的生活带来了更深刻的意义和爱。

    Silvio Cesare 在计算机安全领域是一个传奇的名字,因为他在许多领域都有高度创新和突破性的研究,从 ELF 病毒,到内核漏洞分析方面的突破。非常感谢 Silvio 的指导和友谊。我从你那里学到的东西要远远多于从我们行业其他人处所学的东西。

    Baron Oldenburg 也对本书起了很大的推动作用。好多次由于时间和精力的原因我几乎要放弃了,幸好 Baron 帮我进行了初始的编辑和排版工作。这为本书的编写减轻了很大的负担,并最终促使本书问世。谢谢 Baron!你是我真正的朋友。

    Lorne Schell 是一位真正的文艺复兴式的人物——软件工程师、音乐家、艺术家。本书的封面就是出自他的聪慧之手。Vitruvian(维特鲁威风格的)Elf 与本书的描述艺术性的重合是多么令人惊喜!非常感谢你的才华,以及为此付出的时间和精力。

    Chad Thunberg 是我在 Leviathan 安全集团工作时的老板,他为我编写本书提供了所需要的资源和支持。非常感谢!

    感谢 Efnet 网站所有在#bitlackeys上的朋友的友谊和支持!

    关于审稿人

    Lubomir Rintel 是一名系统程序员,生活在捷克的布尔诺市。他是一位全职的软件开发人员,目前致力于 Linux 网络工具的开发。除此之外,他还对许多项目做出过贡献,包括 Linux 内核和 Fedora 发行版。活跃在开源软件社区多年之后,他懂得一本好书涵盖的主题要比参考手册更加广泛。他相信本书就是这样,希望你也能够像他一样喜欢这本书。另外,他还喜欢食蚁兽。

    截至2015年11月,Kumar Sumeet 在 IT 安全方面已经有4年多的研究经验了,在此期间,他开创了黑客和间谍工具的前沿。他拥有伦敦大学皇家霍洛威分校的信息安全硕士学位,最近的重点研究领域是检测网络异常和抵御威胁的机器学习技术。

    Sumeet 目前是 Riversafe 公司的一名安全顾问。Riversafe 是伦敦的一家网络安全和 IT 数据管理咨询公司,专注于一些尖端的安全技术。该公司也是2015年在 EMEA 地区的 Splunk Professional Services 的合作伙伴。他们已经完成了涉及许多领域(包括电信、银行和金融市场、能源和航空局)的大型项目。

    Sumeet 也是 Penetration Testing Using Raspberry Pi(Packt Publishing 出版)一书的技术审稿人。

    enter image description here

    有关他的项目和研究的更多详细信息,可以访问他的网站https://krsumeet.com,或者扫描右侧的二维码。

    你也可以通过电子邮件contact@krsumeet.com联系他。

    Heron Yang 一直致力于创造人们真正想要的东西。他在高中时就建立了这样坚定的信仰。随后他在台湾交通大学和卡内基梅隆大学专注于计算机科学的研究。在过去几年,他专注于在人和满足用户需求之间建立联系,致力于开发初创企业创意原型、新应用或者网站、学习笔记、出书、写博客等。


    感谢 Packt 给我这个机会参与本书的创作过程,并感谢 Judie Jose 在本书的创作过程中给我的很多帮助。此外,感谢我经历过的所有挑战,这让我成为一个更好的人。本书深入二进制逆向的诸多细节,对于那些关心底层机制的人来说会是很好的资料。大家可通过heron.yang.tw@gmail.com或者http://heron.me跟我打招呼或讨论图书内容。

    前言

    软件工程是创建能够在微处理器上存在、运行和发挥作用的造物行为。我们称这种造物为程序。逆向工程是发现程序如何运行和发挥作用的行为,进一步讲,就是使用反编译器和逆向工具进行组合,并依靠我们的专业技能来控制要进行反编译的目标程序,来理解、解析或者修改程序的行为。我们需要理解二进制格式、内存布局和给定处理器的指令集的复杂性,才能控制微处理器上某个程序的生命周期。逆向工程师是掌握了二进制领域相关知识的技术人员。本书将教会你成为一名 Linux 二进制黑客所需要的合理的课程、洞察力和相关任务。当一个人自称逆向工程师的时候,他自己其实已经超出了工程师的水平。一个真正的黑客不仅可以编写代码,还可以解析代码,反编译二进制文件和内存段,他追求的是修改软件程序的内部工作原理。这就是反编译工程师的动力。

    从专业或者兴趣爱好的角度来看,我都会在计算机安全领域(无论是漏洞分析、恶意软件分析、防病毒软件、rootkit 检测,还是病毒设计)使用自己在逆向工程方面的技能。本书的大部分内容专注于计算机安全方面。我们会分析内存转储、进程镜像重建,并对二进制分析更深奥的领域进行探索,包括 Linux 病毒感染和二进制取证分析。我们将会解析被恶意软件感染的二进制文件,还会感染运行中的进程。本书旨在解释 Linux 逆向工程所必需的组件,因此我们会深入学习 ELF(可执行文件和链接格式)。ELF 是 Linux 中可执行文件、共享库、核心转储文件和目标文件的二进制格式。本书最重要的一个方面是针对 ELF 二进制格式的结构复杂性给出了深入的分析。ELF 节、段、动态链接等这些概念都是非常重要的,也是逆向工程方面相关知识的比较有意思的分支。我们将会深入探索 ELF 二进制攻击,并了解如何将这些技能应用到更广泛的工作中。

    本书的目标是让读者成为对 Linux 二进制攻防有扎实基础的少数人之一,这将会为打开创新性研究的大门提供一个非常广泛的主题,并将读者带领到 Linux 操作系统高级黑客技术的前沿。你将掌握 Linux 二进制修补、病毒工程化/分析、内核取证分析和 ELF 二进制格式这一套宝贵的知识体系。读者也会对程序执行和动态链接有更深入的了解,对二进制保护和调试的内部原理有更深入的理解。

    我是一名计算机安全研究员、软件工程师,也是一名黑客。本书只是有组织地对我所做过的研究进行了文档性描述,也是对已经做出研究结果的一些基础知识的描述。

    本书所涵盖的很多知识都无法在互联网上找到。本书试图将一些相关联的主题集中在一起,以便作为 Linux 二进制和内存攻击这一主题的入门手册和参考。虽然不是非常完善,不过也涵盖了入门需要的很多核心信息。

    本书涵盖的内容

    第1章,Linux 环境和相关工具,简要介绍了 Linux 环境和相关的工具,在整本书中都会用到。

    第2章,ELF 二进制格式,帮助读者了解 ELF 二进制格式每个主要的组件,在 Linux 和大多数类 UNIX 系统上都会用到。

    第3章,Linux 进程追踪,教会读者使用 ptrace 系统调用读写进程内存并注入代码。

    第4章,ELF 病毒技术——Linux/UNIX 病毒,将会介绍 Linux 病毒的过去、现在和将来,以及病毒的工程化和围绕病毒进行的相关研究。

    第5章,Linux 二进制保护,解释 ELF 二进制保护的基本原理。

    第6章,Linux 下的 ELF 二进制取证分析,通过解析 ELF 目标文件来研究病毒、后门和可疑的代码注入。

    第7章,进程内存取证分析,将会介绍如何解析进程的地址空间,以研究内存中的恶意软件、后门和可疑的代码注入。

    第8章,ECFS——扩展核心文件快照技术,是对 ECFS 这一用于深入进程内存取证分析的新开源产品的介绍。

    第9章,Linux/proc/kcore 分析,介绍了如何使用/proc/kcore 进行内存分析来检测 Linux 内核中的恶意软件。

    阅读本书的先决条件

    阅读本书的先决条件如下:假定读者具有 Linux 命令行相关的操作知识,对 C 语言编程技巧有一定的理解,对 x86 汇编语言知识有基本的掌握(不是必需,但会有很大的帮助)。有句话说得好:“如果你可以读懂汇编语言,那么一切都是开源的”。

    本书读者对象

    如果你是一名软件工程师或者逆向工程师,想学习 Linux 二进制分析相关的更多知识,本书将会为你提供在安全、取证分析和防病毒领域进行二进制分析所需要用到的一切知识。假如你是一位安全技术领域的爱好者或者是一名系统工程师,并且有 C 语言编程和 Linux 命令行相关的经验,这本书将非常适合你。

    第1章 Linux 环境和相关工具

    本章将集中介绍 Linux 环境,因为这将贯穿整本书的始终。本书的重点是对 Linux 二进制进行分析,那么利用好 Linux 自带的一些通用的本地环境工具将会对 Linux 二进制分析非常有帮助。Linux 自带了应用普遍的 binutils 工具,该工具也可以在网站http://www.gnu.org/software/binutils/中找到,里面包含了一些用于二进制分析和破解的工具。本书不会介绍二进制逆向工程的通用软件 IDA Pro,但还是鼓励读者使用它。不过,在本书中不会使用 IDA。然而,通过本书的学习,你可以利用现有的环境对任何 Linux 系统进行二进制破解。由此,便可以欣赏到作为一个真正的黑客可以利用许多免费工具的 Linux 环境之美。在本书中,我们将会展示各种工具的使用,随着每个章节的推进,也会不断回顾这些工具的使用方法。现在我们将本章作为参考章节,介绍 Linux 环境下的相关工具和技巧。如果你已经非常熟悉 Linux 环境以及反编译、调试、转换 ELF 文件的工具,可以跳过本章。

    1.1 Linux 工具

    在本书中将用到许多公开发布的免费工具。本节内容将会对其中某些工具进行概要阐述。

    1.1.1 GDB

    GNU 调试器(GDB)不仅可以用来调试有 bug 的应用程序,也可以用来研究甚至改变一个程序的控制流,还可以用来修改代码、寄存器和数据结构。对于一个致力于寻找软件漏洞或者破解一个内部非常复杂的病毒的黑客来讲,这些都是非常常见的工作。GDB 主要用于分析 ELF 二进制文件和 Linux 进程,是 Linux 黑客的必备工具,在本书中我们也会在各种不同的例子中使用到 GDB。

    1.1.2 GNU binutils 中的 objdump

    object dump(objdump)是一种对代码进行快速反编译的简洁方案,在反编译简单的、未被篡改的二进制文件时非常有用,但是要进行任何真正有挑战性的反编译任务,特别是针对恶意软件时,objdump 就显示出了它的局限性。其最主要的一个缺陷就是需要依赖 ELF 节头,并且不会进行控制流分析,这极大地降低了 objdump 的健壮性。如果要反编译的文件没有节头,那么使用 objdump 的后果就是无法正确地反编译二进制文件中的代码,甚至都不能打开二进制文件。不过,对于一些比较平常的任务,如反编译未被加固、精简(stripped)或者以任何方式混淆的普通二进制文件,objdump 已经足够了。objdump 可以读取所有常用的 ELF 类型的文件。下面是关于 objdump 使用方法的一些常见例子。

    • 查看 ELF 文件中所有节的数据或代码:
        objdump –D <elf_object> 
    • 只查看 ELF 文件中的程序代码:
        objdump –d <elf_object> 
    • 查看所有符号:
        objdump –tT <elf_object> 

    在第2章介绍ELF二进制格式时,我们将更加深入地介绍objdump和其他相关工具。

    1.1.3 GNU binutils 中的 objcopy

    object copy(objcopy)是一款非常强大的小工具,很难用一句话对其进行概述。推荐读者参考objcopy的使用手册,里面描述得非常详细。虽然objcopy的某些特征只针对特定的ELF目标文件,但是,它还可以用来分析和修改任意类型的ELF目标文件,还可以修改ELF节,或将ELF节复制到ELF二进制中(或从ELF二进制中复制ELF节)。

    要将.data节从一个ELF目标文件复制到另一个文件中,可以使用下面的命令:

    objcopy –only-section=.data <infile> <outfile> 

    objcopy工具会在本书的后续内容中用到。现在只要记住有这样一个工具,并且知道这是对 Linux 二进制黑客来说非常有用的一个工具就可以了。

    1.1.4 strace

    system call trace(strace,系统调用追踪)是基于ptrace(2)系统调用的一款工具,strace通过在一个循环中使用PTRACE_SYSCALL请求来显示运行中程序的系统调用(也称为 syscalls)活动相关的信息以及程序执行中捕捉到的信号量。strace在调试过程中非常有用,也可以用来收集运行时系统调用相关的信息。

    使用strace命令来跟踪一个基本的程序:

    strace /bin/ls –o ls.out 

    使用strace命令附加到一个现存的进程上:

    strace –p <pid> -o daemon.out 

    原始输出将会显示每个系统调用的文件描述编号,系统调用会将文件描述符作为参数,如下所示:

    SYS_read(3, buf, sizeof(buf)); 

    如果想查看读入到文件描述符3中的所有数据,可以运行下面的命令:

    strace –e read=3 /bin/ls 

    也可以使用–e write=fd命令查看写入的数据。strace是一个非常有用的小工具,会在很多地方用到。

    1.1.5 ltrace

    library traceltrace,库追踪)是另外一个简洁的小工具,与strace非常类似。ltrace 会解析共享库,即一个程序的链接信息,并打印出用到的库函数。

    1.1.6 基本的 ltrace 命令

    除了可以查看库函数调用之外,还可以使用-S标记查看系统调用。ltrace命令通过解析可执行文件的动态段,并打印出共享库和静态库的实际符号和函数,来提供更细粒度的信息:

    ltrace <program> -o program.out 

    1.1.7 ftrace

    function traceftrace,函数追踪)是我自己设计的一个工具。ftrace 的功能与ltrace类似,但还可以显示出二进制文件本身的函数调用。我没有找到现成的实现这个功能的 Linux 工具,于是就决定自己编码实现。这个工具可以在网站https://github.com/elfmaster/ftrace找到。下一章会对这个工具的使用进行介绍。

    1.1.8 readelf

    readelf命令是一个非常有用的解析ELF二进制文件的工具。在进行反编译之前,需要收集目标文件相关的信息,该命令能够提供收集信息所需要的特定于ELF的所有数据。在本书中,我们将会使用readelf命令收集符号、段、节、重定向入口、数据动态链接等相关信息。readelf命令是分析ELF二进制文件的利器。第2章将对该命令进行更深入的介绍,下面是几个常用的标记。

    • 查询节头表:
        readelf –S <object> 
    • 查询程序头表:
        readelf –l <object> 
    • 查询符号表:
        readelf -s <object> 
    • 查询 ELF 文件头数据:
        readelf –e <object> 
    • 查询重定位入口:
        readelf –r <object> 
    • 查询动态段:
        readelf –d <object> 

    1.1.9 ERESI——ELF 反编译系统接口

    ERESI 工程(http://www.eresi-project.org)中包含着许多 Linux 二进制黑客梦寐以求的工具。令人遗憾的是,其中有些工具没有持续更新,有的与64位 Linux 不适配。ERESI 工程支持许多的体系结构,无疑是迄今为止最具创新性的破解 ELF 二进制文件的工具集合。由于我个人不太熟悉 ERESI 工程中工具的用法,并且其中有些不再更新,因此在本书中就不再对该工程进行更深入的探讨了。不过,有两篇 Phrack 的文章能够说明 ERESI 工具的创新和强大的特性:

    • Cerberus ELF interface(http://www.phrack.org/archives/issues/61/8.txt
    • Embedded ELF debugging(http://www.phrack.org/archives/issues/63/9.txt

    1.2 有用的设备和文件

    Linux 有许多文件、设备,还有/proc入口,它们对狂热的黑客还有反编译工程师来说都非常有用。在本书中,我们将会展示其中许多有用的文件。下面介绍本书中常用的一些文件。

    1.2.1 /proc/<pid>/maps

    /proc/<pid>/map文件保存了一个进程镜像的布局,通过展现每个内存映射来实现,展现的内容包括可执行文件、共享库、栈、堆和 VDSO 等。这个文件对于快速解析一个进程的地址空间分布是至关重要的。在本书中会多次用到该文件。

    1.2.2 /proc/kcore

    /proc/kcoreproc文件系统的一项,是 Linux 内核的动态核心文件。也就是说,它是以 ELF 核心文件的形式所展现出来的原生内存转储,GDB 可以使用/proc/kcore来对内核进行调试和分析。第9章会更深入地介绍/proc/kcore。

    1.2.3 /boot/System.map

    这个文件在几乎所有的 Linux 发行版中都有,对内核黑客来说是非常有用的一个文件,包含了整个内核的所有符号。

    1.2.4 /proc/kallsyms

    kallsymsSystem.map类似,区别就是 kallsyms 是内核所属的/proc的一个入口并且可以动态更新。如果安装了新的 LKM(Linux Kernel Module),符号会自动添加到/proc/kallsyms中。/proc/kallsyms包含了内核中绝大部分的符号,如果在CONFIG_KALLSYMS_ALL内核配置中指明,则可以包含内核中全部的符号。

    1.2.5 /proc/iomem

    iomem是一个非常有用的 proc 入口,与/proc/<pid>/maps类似,不过它是跟系统内存相关的。例如,如果想知道内核的 text 段所映射的物理内存位置,可以搜索Kernel字符串,然后就可以查看 code/text段、data段和bss段的相关内容:

      $ grep Kernel /proc/iomem   01000000-016d9b27 : Kernel code   016d9b28-01ceeebf : Kernel data   01df0000-01f26fff : Kernel bss 

    1.2.6 ECFS

    extended core file snapshot(ECFS,扩展核心文件快照)是一项特殊的核心转储技术,专门为进程镜像的高级取证分析所设计。这个软件的代码可以在https://github.com/elfmaster/ecfs看到。第8章将会单独介绍 ECFS 及其使用方法。如果你已经进入到了高级内存取证分析阶段,你会非常想关注这一部分内容。

    1.3 链接器相关环境指针

    动态加载器/链接器以及链接的概念,在程序链接、执行的过程中都是避不开的基本组成部分。在本书中,你还会学到更多相关的概念。在 Linux 中,有许多可以代替动态链接器的方法可供二进制黑客使用。随着本书的深入,你会开始理解链接、重定向和动态加载(程序解释器)的过程。下面是几个很有用处的链接器相关的属性,在本书中将会用到。

    1.3.1 LD_PRELOAD 环境变量

    LD_PRELOAD环境变量可以设置成一个指定库的路径,动态链接时可以比其他库有更高的优先级。这就允许预加载库中的函数和符号能够覆盖掉后续链接的库中的函数和符号。这在本质上允许你通过重定向共享库函数来进行运行时修复。在后续的章节中,这项技术可以用来绕过反调试代码,也可以用作用户级 rootkit。

    1.3.2 LD_SHOW_AUXV 环境变量

    该环境变量能够通知程序加载器来展示程序运行时的辅助向量。辅助向量是放在程序栈(通过内核的 ELF 常规加载方式)上的信息,附带了传递给动态链接器的程序相关的特定信息。第3章将会对此进行进一步验证,不过这些信息对于反编译和调试来说非常有用。例如,要想获取进程镜像 VDSO 页的内存地址(也可以使用maps文件获取,之前介绍过),就需要查询AT_SYSINFO

    下面是一个带有LD_SHOW_AUXV辅助向量的例子:

    $ LD_SHOW_AUXV=1 whoami AT_SYSINFO: 0xb7779414 AT_SYSINFO_EHDR: 0xb7779000 AT_HWCAP: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmovpat pse36 clflush mmx fxsr sse sse2 AT_PAGESZ: 4096 AT_CLKTCK: 100 AT_PHDR:  0x8048034 AT_PHENT: 32 AT_PHNUM: 9 AT_BASE:  0xb777a000 AT_FLAGS: 0x0 AT_ENTRY: 0x8048eb8 AT_UID:  1000 AT_EUID: 1000 AT_GID:  1000 AT_EGID: 1000 AT_SECURE: 0 AT_RANDOM: 0xbfb4ca2b AT_EXECFN: /usr/bin/whoami AT_PLATFORM: i686 elfmaster 

    第2章将会进一步介绍辅助向量。

    1.3.3 链接器脚本

    链接器脚本是我们的一个兴趣点,因为链接器脚本是由链接器解释的,把程序划分成相应的节、内存和符号。默认的链接器脚本可以使用ld–verbose查看。

    ld链接器程序有其自己解释的一套语言,当有文件(如可重定位的目标文件、共享库和头文件)输入时,ld链接器程序会用自己的语言来决定输出文件(如可执行程序)的组织方式。例如,如果输出的是一个 ELF 可执行文件,链接器脚本能够决定该输出文件的布局,以及每个段里面包含哪些节。另外举一个例子:.bss节总是放在data段的末尾,这就是链接器脚本决定的。你可能很好奇,这为什么就成了我们的一个兴趣点呢?一方面,对编译时链接过程有一定深入的了解是很重要的。gcc依赖于链接器和其他程序来完成编译的任务,在某些情况下,能够控制可执行文件的布局相当重要。ld命令语言是一门相当深入的语言,尽管它超出了本书的范围,但是非常值得探究。另一方面,在对可执行文件进行反编译时,普通段地址或者文件的其他部分有时候会被修改,这就表明引入了一个自定义的链接器脚本。gcc通过使用–T标志来指定链接器脚本。第5章会介绍一个使用链接器脚本的例子。

    1.4 总结

    本章仅介绍了 Linux 环境和工具相关的一些基本概念,在后续的每个章节中都会经常用到。二进制分析主要是了解一些可用的工具和资源并进行相关的整合。目前,我们只简要介绍了这部分工具,在接下来的章节中,随着对 Linux 二进制破解这个广阔领域进行更进一步的探索,我们会有机会对每一个工具进行深入介绍。下一章将会对 ELF 二进制格式进行更深入的探索,也会涉及其他一些有趣的概念,如动态链接、重定位、符号和节(section)等。

    第2章 ELF 二进制格式(上)
    第2章 ELF 二进制格式(下)
    第3章 Linux 进程追踪(上)
    第3章 Linux 进程追踪(下)
    第4章 ELF 病毒技术——Linux/UNIX 病毒
    第5章 Linux 二进制保护
    第6章 Linux 下的 ELF 二进制取证分析
    第7章 进程内存取证分析
    第8章 ECFS——扩展核心文件快照技术(上)
    第8章 ECFS——扩展核心文件快照技术(下)
    第9章 Linux/proc/kcore 分析

    阅读全文: http://gitbook.cn/gitchat/geekbook/5ba9eb5b0110e7701d264575

    展开全文
  • 213-二进制文件

    2019-01-07 21:05:13
    图形文件及文字处理程序等计算机程序属于二进制文件 这些文件含有特殊的格式及计算机代码 ASCII 则是可以用任何文字处理程序阅读的简单文本文件 广义的二进制文件即指文件, 由文件在外部设备的存放...
    
    
    
    
    二进制文件
    
    二进制文件就是
    包含在 ASCII及扩展 ASCII 字符中编写的数据或程序指令的文件
    
    
    
    计算机文件一般都分为两种
    1.二进制文件
    2.ASCII文件(纯文本文件)
    
    图形文件及文字处理程序等计算机程序都属于二进制文件
    这些文件含有特殊的格式及计算机代码
    ASCII 则是可以用任何文字处理程序阅读的简单文本文件
    
    
    
    
    广义的二进制文件即指文件,
    由文件在外部设备的存放形式为二进制而得名。
    狭义的二进制文件即除文本文件以外的文件。
    文本文件是一种由很多行字符构成的计算机文件。
    
    文本文件存在于计算机系统中,
    通常在文本文件最后一行放置文件结束标志。
    文本文件的编码基于字符定长,
    译码相对要容易一些;二进制文件编码是变长的,
    灵活利用率要高,而译码要难一些,
    不同的二进制文件译码方式是不同的。
    
    从本质上来说他们之间没有什么区别,
    因为他们在硬盘上都有一种的存放方式--二进制,
    但是如果要对他们有些区分的话,那可以这样理解。
    
    每个字符由一个或多个字节组成,
    每个字节都是用的-128—127之间的部分数值来表示的,
    也就是说,-128——127之间还有一些数据没有对应
    任何字符的任何字节。如果一个文件中的每个字节的内容
    都是可以表示成字符的数据,我们就可以称这个文件为文本文件,
    
    可见,文本文件只是二进制文件中的一种特例,
    为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,
    由于很难严格区分文本文件和二进制文件的概念,
    所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,
    没有包含字符以外的其他数据,我们就称之为文本文件,
    除此之外的文件就是二进制文件。
    
    
    
    使用二进制文件的好处
    
    为什么要使用二进制文件。原因大概有三个:
      第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存 Real*4 的数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40)
      第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。
      第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。
    
    
    
    
    
    
    

     

    展开全文
  • 二进制文件和 ASCII

    2019-03-20 09:59:44
    计算机文件基本上分为二种:...计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以...
  • 什么是二进制文件

    2019-12-28 22:10:42
    包含在ASCII及扩展 ASCII字符中编写的数据或程序...计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序属于二进制文件。这些文件含有特殊的格式及计算机代码...
  • 二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码二进制)来分析应用程序的控制结构和运行方式,它有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决...
  • 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本...
  • 你所不了解的Linux二进制

    千次阅读 2017-11-29 06:23:14
    二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码二进制)来分析应用程序的控制结构和运行方式,它有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决...
  • 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本)文件,图形文件及文字处理程序等计算机程序属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本...
  • 二进制安全基本常识

    2021-04-19 09:04:54
    BSS段(bss segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 bss段也叫(全局变量段)的特点是可读可写可执行,...
  • C++二进制查找树源码,编译后的程序属于控制台程序,双击可运行,若不能运行可先打开cmd命令提示符,然后将编译生成的exe拖至cmd窗口中,即可运行。 项目源代码: 部分代码: 计算原理图: 程序运行...
  • 一般来说,除了源代码包以外的软件包都属于二进制包。 二进制包一般有以下几种: deb后缀名:此类二进制包为DPKG包管理程序的专用软件包,由于深度操作系统使用dpkg包管理,因此可以直接安装的二进制包为DEB包。...
  • 文本文件和二进制文件的区别

    千次阅读 2014-03-01 17:32:58
    计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本)文件,图形文件及文字处理程序等计算机程序属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本...
  • freadf与二进制文件

    2019-01-06 14:30:27
    (1)程序文件:包括源程序文件(.c)、目标文件(.obj)、可执行文件(.exe)等,这种文件的内容是程序代码 (2)数据文件:这种文件的内容是供操作系统读写的数据 以上两种文件均属于流式文件,这就得提到流式文件...
  • 如果你在编程中想建立一个属于自已格式的二进制文件,此文件中保存自已在程序中生成的各种数据和文件。 BinFileEx.DLL还封装了用于得到汉字内码和由内码得到全部字母、汉字和符号的类和函数的动态链接库,用它可以...
  • 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本...
  • 项目需要通过串口传输音频数据,由于音频数据包含不可显示的字节,属于二进制数据流,因此需要对linux端的串口读取程序设定一些参数。完整的串口配置代码如下: int fd = open("/dev/ttyACM1", O_RDWR | O_NOCTTY ...
  • 该项目的目标是使用本地二进制模式方法开发人脸识别应用程序,并使用相同的方法开发实时人脸识别应用程序。 在高层次上,该系统能够使用一组熟悉的面Kong以一定的精度识别新面Kong。 为此,使用了不同的方法以比较...
  • 如果你在编程中想建立一个属于自已格式的二进制文件,此文件中保存自已在程序中生成的各种数据和文件。 BinFileEx.DLL还封装了用于得到汉字内码和由内码得到全部字母、汉字和符号的类和函数的动态链接库,用它可以...
  • 一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把...
  • "一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的...
  • 【单选题】有甲、乙、丙、丁四位同学,用螺旋测微计测量一根铜棒的直径,各人所得的结果表达如下,请问正确的结果表达是 (5.0分)【单选题】十进制数92转换为二进制数和十六进制数分别是_____________。 (1.0分)【填空题...
  • 计算机语言的分类1.1机器语言由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称为机器指令,全部机器指令的集合构成计算的机器语言机器语言属于低级语言1.2汇编语言汇编语言的实质和机器语言是...
  • java程序开发 基础1

    2018-01-14 16:33:37
     机器语言:由一段和1的二进制代码所组成的语言(二进制) (语言和汇编语言 属于低级语言)(结构化语言和面向对象语言 属于高级语言) 3、程序设计 ①分析问题:确定问题是什么,软件需求是什
  • 编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 352
精华内容 140
关键字:

二进制代码程序属于