美文网首页计算机与网络信息安全程序人生
用二进制写程序,提升装 X 境界

用二进制写程序,提升装 X 境界

作者: 码农UP2U | 来源:发表于2019-11-21 21:47 被阅读0次

用二进制来写程序这么反人类的事情,的确是很装的事情,但是它不但是一件很装的事情,也是掌握底层知识的基础能力之一。听我慢慢道来。

程序设计语言有高级语言和低级语言之分,尤其是现在各种编程语言的不断发展,掌握高级程序设计语言的人越来越多。

但是是否可以使用二进制来写程序呢?也许最初使用打孔带来控制机器的人可以完成,那么现在是否仍然有人可以完成呢?答案是肯定的!

计算机可以直接运行的指令是二进制的机器码,所有的代码在运行之前都会变成 CPU 可以识别的二进制。对于编译型的二进制语言,其实都是可以直接使用二进制来写的。

比如,Windows 下使用 C 语言编写的程序编译连接后可以生成一个 .exe 的可执行程序,生成的这个可执行程序就是一个二进制程序。那么,这个程序如何用二进制编写呢?

先来考虑几个问题!

首先,可执行程序中并非只有代码,而 CPU 要执行的只有代码。

其次,CPU 执行的代码是二进制,但是在内存中的数据也是二进制数据,那么如何知道哪部分是代码,哪部分是数据呢?这是操作系统在加载程序文件进入内存时,操作系统按照一定规则把不同二进制按照不同的属性装入了不同的内存分页当中,并对内存设置相应的属性。

最后,操作系统如何知道程序文件中的二进制哪部分是数据,哪部分是代码呢?这是在程序被编译连接时不但把代码和代码所需的数据编译到了程序中,还把管理代码的数据也放入了程序中,而这部分管理数据决定了哪部分是数据哪部分是代码。

因此,用二进制写代码就需要至少掌握两方面,一方面是了解可执行程序的管理数据,另一方面就是了解 CPU 的机器码。

在 Windows 下的可执行程序是 PE 格式的,那么就要了解 PE 格式的数据结构,和 CPU 的机器码;在安卓下的可执行程序中,其格式是 DEX 格式,那么就要了解 DEX 格式的数据结构,以及安卓虚拟机的字节码(这个字节码不是 CPU 的机器码,DEX 的字节码最终被虚拟机解释成机器码,因此手写 DEX 文件时了解 DEX 格式和其字节码即可),同样的,Java 编译的 Class 文件也和安卓相同,因为它也是基于虚拟机执行的文件。其中 PE 格式和 DEX 格式就是程序的管理数据,用于告诉操作系统或虚拟机,整个文件中代码、数据以及其他资源在文件中的结构。

因为二进制的阅读性比较差,因此人们使用了八进制和十六进制。四位二进制可以表示为一位十六进制,由于系统是 32 位或 64 位,那么刚好使用 8 个十六进制位表示 32 个二进制位,或者 16 个十六进制位表示 64 个二进制位。因此,在内存中查看数据时,更多的是使用十六进制,其实从本质上十六进制和二进制是没有区别的,只是表示的方式不同。因此,真正使用二进制来写程序时,是使用十六进制来完成的。

那么,在使用十六进制来编写 Windows 下的可执行程序时,首先需要使用十六进制编辑器构造 PE 文件结构,PE 文件结构主要告诉操作系统,程序加载入内存后,程序的映射起始地址是多少,程序的入口地址是多少,程序中的代码和数据分别保存在哪里,以及它们的长度是多少,映射到内存中以后其地址是多少,该可执行文件调用了哪些系统函数,这些系统函数分别在哪些动态链接库中等信息。构造完 PE 文件结构以后,就可以使用机器码来写程序了。只要把机器代码写到 PE 文件结构中标识程序入口的位置处就行了。当然了,机器码写程序是比较困难的,但是作为学习底层基础知识来说,写一个简单的程序还是可以的,比如写一个弹出对话框的“hello world”这样的程序。用机器码写这样的程序,也无需了解太多的知识,有一份 Opcode 的手册就可以了。

这就是如何用十六进制编辑器来完成一个可执行程序的过程,关于 PE 文件格式,可以参考 MSDN 或网上的文章,对于学习机器码相关的知识可以查看 Intel 的指令手册。学习这些知识对于软件破解、病毒分析、加密解密、内核驱动开发等是相应知识的基础,感兴趣的可以了解一下,了解这些知识绝对不仅仅是用来装 X 的。



我的微信公众号:“码农UP2U”
我的公众号

相关文章

  • 用二进制写程序,提升装 X 境界

    用二进制来写程序这么反人类的事情,的确是很装的事情,但是它不但是一件很装的事情,也是掌握底层知识的基础能力之一。听...

  • 特殊权限SUIG、SGID、SBIT

    SUID、SGID、SBIT 一、SetUID与SGID 只能用于二进制程序 执行者需要有该二进制程序的x权限 执...

  • 高级权限2,文档管理2

    高级权限 SGID Ps: 限制和作用SGID 对二进制程序有用;程序执行者对于该程序来说,需具备 x 的权限;执...

  • vim学习笔记

    作为一个程序员,不会装x怎么行,vim就是装x利器,哈哈 vim有三种工作模式 交互模式 interactif m...

  • 钓鱼城杯2020-reg

    是用aardio写的程序,没找到直接获取脚本的工具,先下载aardio的编译器尝试自己写脚本编译,查看生成的二进制...

  • C语言中进制的表示和转换

    C语言中常用的有十进制、二进制、八进制(用0表示)、十六进制(用0x表示)。 十进制转二进制: 十进制转二进制采取...

  • HTTP2新特性

    对1.x协议语意的完全兼容性能的大幅提升 二进制分帧(frame) HTTP2.0性能增强的核心:二进制分帧。HT...

  • 在微信小程序里跑Apollo Client

    环境 最近在写小程序。为了提升效率, 后端采用graphQL。 前端的graphQL库, 打算用Apollo。 小...

  • SetUID Set

    SetUID 的特性 属性 只能针对二进制程序 命令执行者需要对该程序有x权限 作用 命令执行者在执行该程序的过程...

  • 写作难以坚持之谜…

    大家都知道写反思写文章,有利于提升思想的境界啊,提升智慧,提升语言组织和文字功底,但是现在我们写文字常常难以坚持...

网友评论

    本文标题:用二进制写程序,提升装 X 境界

    本文链接:https://www.haomeiwen.com/subject/cnsxwctx.html