用二进制写程序,提升装 X 境界
用二进制来写程序这么反人类的事情,的确是很装的事情,但是它不但是一件很装的事情,也是掌握底层知识的基础能力之一。听我慢慢道来。
程序设计语言有高级语言和低级语言之分,尤其是现在各种编程语言的不断发展,掌握高级程序设计语言的人越来越多。
但是是否可以使用二进制来写程序呢?也许最初使用打孔带来控制机器的人可以完成,那么现在是否仍然有人可以完成呢?答案是肯定的!
计算机可以直接运行的指令是二进制的机器码,所有的代码在运行之前都会变成 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 境界的更多相关文章
- xilinx Vivado的使用详细介绍(2):创建工程、添加文件、综合、实现、管脚约束、产生比特流文件、烧写程序、硬件验证
xilinx Vivado的使用详细介绍(2):创建工程.添加文件.综合.实现.管脚约束.产生比特流文件.烧写程序.硬件验证 Author:zhangxianhe 新建工程 打开Vivado软件,直接 ...
- linux 安装二进制包程序一般步骤
参考:https://blog.csdn.net/linzhiji/article/details/6774410 configure/make/make install的作用 这些都是典型的使用GN ...
- 用CIL写程序:写个函数做加法
前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- 用CIL写程序:从“call vs callvirt”看方法调用
前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...
- STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案
现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...
- 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖
引用 http://baike.baidu.com/link?url=z_phkcEO4_HjFG_Lt163dGFAubdb68IbfcfzWscTOrrZ55WbJEQKzyMQ5eMQKyatD ...
- 4.“写程序” 这个活动大多数情况下是个人行为。 我们听说的优秀程序员似乎都是单打独斗地完成任务。同学们在大学里也认识一些参加ACM 比赛的编程牛人, 他们写的ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么? 请采访这些学生。
ACM的题库的编程都只能算做程序,不能算软件.写程序和做软件区别还是很大的.程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行操作的一系列语句和指令.而软件是程 ...
- IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题
程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...
随机推荐
- 【Eureka】服务端和客户端
[Eureka]服务端和客户端 转载:https://www.cnblogs.com/yangchongxing/p/10778357.html Eureka服务端 1.添加依赖 <?xml v ...
- 【Java Web开发学习】Spring MVC异常统一处理
[Java Web开发学习]Spring MVC异常统一处理 文采有限,若有错误,欢迎留言指正. 转载:https://www.cnblogs.com/yangchongxing/p/9271900. ...
- 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除.修改),则会抛出Concurrent Modification Exceptio ...
- NodeJS4-2静态资源服务器实战_实现获取文件路径
实例2 : 实现获取文件路径,判断是文件还是文件夹,如果是文件夹就显示里面的列表文件,如果是文件就显示里面的内容 defaultConfig.js module.exports={ root:proc ...
- html5+css3的神奇搭配
1.关于浮动 浮动的元素会脱离标准文档流(float),从而不占据空间,实现了一行排列多个元素的效果 ,但是又导致上级元素height消失,处理这种情况的方法就是有两种: 1.第一种在css里写个伪类 ...
- 由malloc和new引发的段错误
class Queue{ private: struct node{ string data; struct node * next,*priv; } private: struct node * p ...
- Nginx配置实例-负载均衡实例:平均访问多台服务器
场景 Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- Mongdb可视化工具Studio 3T的使用
一.官网地址 https://studio3t.com/ 二.下载和安装 点击DOWNLOAD即可下载 按照自己电脑系统进行选择,然后填写邮箱和选择行业,第一次登录如果不提交不会下载,下载完成是一个z ...
- VMware 虚拟机黑屏问题
VMware Workstation 14打开虚拟机黑屏解决方法 听语音 浏览:0 | 更新:2017-11-21 16:56 | 标签:操作系统 虚拟机 VMWARE 1 2 3 4 分步阅读 最近 ...
- C#开发微信小程序(三)
导航:C#开发微信小程序系列 关于小程序项目结构,框架介绍,组件说明等,请查看微信小程序官方文档,关于以下贴出来的代码部分我只是截取了一些片段,方便说明问题,如果需要查看完整源代码,可以在我的项目库中 ...