本帖最后由 qzhsjz 于 2021-2-5 20:29 编辑
简明、现代而优雅的破解技术笔记 前言
吾爱破解 qzhsjz
一转眼的时间 Windows 10 已经发布6年了,距离 Windows XP 停止一切支持服务也已经过去了七年。距离英特尔发布第一款64位处理器已经过去了15年,AMD 发明 x86-64 也已经是18年前的事了。十二年前,Windows 7 正式发布,大多数预装 Windows 7 的电脑都采用了英特尔最新的64位处理器,标志着个人电脑正式进入64位时代。与此同时,iPhone引领了世界智能手机市场最大的变革,掀起了移动互联网的风潮,推广了Emoji和同系统多国语言文字共存,从而推进了Unicode的普及。可以说,站在当今的视角下,如果一个程序不是Unicode内码的64位程序,那么他就不是一个现代的程序。
很遗憾的是,当前中文互联网上的破解教程,依然停留在21世纪初 Windows XP 刚刚发布时的水平,只能处理过时的程序。作为一个新时代的新手,不应该为历史所困,直接丢掉历史包袱,学习最新的技术,有助于快速提高自身水平,跟上业界发展。
我也是一个新手,当我看到各种教程教我创建XP虚拟机来运行各种老古董破解工具,不能破解64位软件,还需要装插件或者用一些奇怪的方法才能进行中文搜索的时候,我的内心实在是悲痛。好在我英语还过关,在混了一些国外论坛的基础上,我学到了一些新时代逆向工程的皮毛,借此整理记录下来,希望能对各位有所裨益。
基础理论
当你想学习逆向开发的时候,我觉得最重要的一点是你要有一些正向开发的基础知识,并且最重要的是了解一些在正向开发的过程中对逆向分析有用的原理,这样就能在学习逆向分析的过程中时刻思路清晰,而不是拘泥于一些知其然而不知其所以然的方法论。下面我将介绍一些与此有关的基础理论。
CPU与内存
作为一个新手,我们还是需要先了解一下计算机的基本结构。CPU负责运行指令并处理数据,而内存负责存储指令和数据。计算机的核心部件就是这两个东西。一般来讲,CPU先从内存中读取一批指令,然后执行,执行的过程中就会读写内存中的数据。所以CPU需要能够记住读取的一批指令,并且能够存储需要向内存读写的数据。所以CPU中有寄存器(用来存储数据)和指令缓存(用来存储指令)。CPU是一套很复杂的逻辑电路,作为这样复杂的一套逻辑电路,有一些基本的设计规定。比如CPU中的“一个”数据使用多少根线来表示,有几根线就可以代表几位二进制数,这也就是CPU的位数。无论是指令还是数据,在CPU的电路中其实都是数据。指令其实是一种规定,当碰到一个数的时候,如果他是从指令这边过来的,那么他就代表什么意思,CPU就要执行这个意思。例如 x86-64 CPU 碰到了B8 00 00 00 00 ,就知道要往eax寄存器中存入0x00000000 。所以有人把数和意思之间做了一个转译,让人们可以不用记这些指令的具体数字,使用别名编程,这就是汇编语言。上例B8 00 00 00 00 转换成汇编语言就是mov eax, 0x00000000 。
操作系统平台
无论是正向开发还是逆向工程,都是建立在某一个操作系统或者平台之上的。作为一个新时代的新手,我们自然是使用最新版 Windows 操作系统。Windows 操作系统中的exe文件就是可以执行的程序文件,当我们双击exe文件时,Windows 就会创建一个进程,并读取exe文件的各个部分并且把这些部分装进进程内存的合适位置,然后从程序的入口点开始执行。程序执行时不可避免地会用到一些操作系统提供的功能,例如从控制台中读取和输出内容,这些功能微软官方都封装成了C语言的函数库,当你使用C语言或C++时可以很方便地调用,但使用其他语言时就必须使用第三方或者语言官方提供的调用方式了,如果没有提供,你需要学习 Windows 的 ABI(应用程序二进制接口),并且自己实现调用系统调用。这是一个至少不太适合新手的过程,并且没有任何第三方的实现比微软官方的稳定且优雅。所以如果想在 Windows 上优雅地编程,尤其是想要快速上手,我们应该使用微软官方提供的最新工具,也就是最新版 Visual Studio,并且使用C语言或C++来编写程序。
我的英语不好,我害怕
最新版的 Visual Studio 已经是完全汉化的状态,此外,Community版本(社区版)够用,而且是完全免费的。使用Unicode内码编写程序时,C/C++语言除了关键字有那么几个if、while、for、switch、case、void、int、float等,以及非中国人编写的函数库的功能是英文之外,其余任何位置都可以使用中文。C++标准委员会对于C++的标准库有全面的中文文档,可以对照参考,名称使用英文仅仅是为了“起个名”,名字总要有,而且用英文起对于全球人民来说是最方便的。与此同时,微软对于自己的Visual Studio也有全面的中文帮助文档。可以说,在现代学习C++语言,不存在任何语言障碍。另外,如果你在看过如此大量的全中文资料后依然感觉打英文字母就是不舒服,或许可能“伤害到了你的民族自尊心”的话,结合上一条,学会编写和分析现代化、优雅且稳定的程序应该比这一点点的不舒服重要太多了。
停止编写过时、混乱且不稳定的程序
是的,我几乎要点名易语言了,不支持64位,也不支持Unicode,并且编译出来的结果混乱不堪,既不是现代化的编程方案,也不足够优雅。最重要的是,不利于新时代正向和逆向开发的学习,请停止走弯路,拒绝过时和不够优雅的东西。
从下篇笔记开始,我将带领大家编写一个现代化的密码验证程序,并亲手破解它。
|