闲谈集——破解基础思维之一
本帖最后由 yyhd 于 2022-11-22 09:18 编辑之所以命名为闲谈集,就是因为所讲内容均为闲谈,没有技术含量,也不精准,或许还错误百出,
但唯一的好处就是通俗易懂,便于新人们理解。
今天有点时间,就啰嗦几句,对象仍然是破解的新人朋友。
这次只务虚。没有目标,想到哪就谈到哪。
对破解感兴趣的新人朋友,在学习过程中会有很多困惑,进步也很慢。
其原因主要在于编程和破解基础知识的欠缺,思路不清晰。
下面我就和大家聊聊,希望聊完后能让你有所收获。
一、编程基础
我这里不谈具体的编程语言,只谈基本认识。
所谓编程,就是你编写一段代码,让机器执行。比如你想让屏幕上出现一个“Hello World”。
要完成这样一个工作,必须要有几个条件。
第一、你要把想做的工作写出来,你可以打开一个记事本,在上面写上“屏幕的正中间位置出现Hello World这句话”,这就是编程。
你想过没有,你写的中文的句子,你自己很清楚要做什么,但计算机能不能看懂?
所谓计算机能不能看懂,就是说计算机内部的CPU(大脑)能不能看懂并执行。
所以,就有了一些NB的人自行开发了一套语言,目的是让计算机能够看懂。
因为计算机首先是外国人发明的,国外发展的比国内快,而且主要是英语体系,所以创造的一些编程语言主要是英文的。
比如BASIC语言、C语言、C++语言、VB、DELPHI、Python等。国内也有NB的人后来开发了易语言,是纯中文的。
不管是什么编程语言,其目的就是编写出一段能够让计算机看懂的代码。
所以,所谓学编程就是要学某一套语言体系,就像大家学英文一样,你要学会26个字母,要学会一些常用的有意义的单词,要学会一些常用的语句,还要学会一些语法。
那么大家可能会问,学什么编程语言好呢?难学吗?
我个人认为,如果你不想今后从事编程工作,只是想学习一下软件破解,
那么,你需要学C语言、C++、易语言、汇编。
你可能听到就头大了,这么多语言都学习,那需要多少时间,人都学死了。
呵呵,
我说的学习是指你能看懂别人写的代码即可。
就像我们的母语中文,我们不是作家,没有必要文学素养多高,也不必追求华丽的辞藻,
我们只要能看懂别人写的文章的主要意思即可。
比如很多小说开头写到“夜很黑,伸手不见五指,四下死一般的沉寂,只听到远处传来咚咚的走路声.......”,
那么你就懂了,前面的文字是环境描写,目的是烘托气氛,走路的可能是要出场的人物,是需要关注的对象。
这就叫读懂,我说的你懂编程就是这个意思,这样是不是就容易很多了。
我现在举一个C++语言编程的例子,你看一下:
#include <iostream>
using namespace std;
int main()
{ cout << "Hello, world!" << endl;
return 0;
}
以上的这段代码,执行以后能够在屏幕上出现“Hello,world!”这段文字。
那你怎么去读懂呢?
其实很简单。
#include <iostream>这句代码是C++语言编程时在第一行通用的句子,意思是包含一些头文件。
using namespace std;这句代码是声明命名空间。
以上的两句基本都是通用的,你读的时候可以无视它。
int main( )
{
}
这个部分才是每个程序最需要关注的地方。
main在英文中是主要的意思,所以main下面大括号里面的代码才是主要的部分。
{ cout << "Hello, world!" << endl;
return 0;
}
你看,在大括号里有两行代码。
cout << "Hello, world!" << endl;这段代码就是让计算机在屏幕上输出文字。cout是C++语言定义好的关键字,意思就是把<<后面的文字在屏幕上输出。endl也是定义好的关键字,是指在屏幕上输出文字后进行换行。
return 0;这句代码是结束的意思,返回值为0。
你现在在看整段代码,是不是就很容易看懂了。你主要看main后面大括号里的内容,然后读懂每句里面的关键字的意思就可以了,关键字是你要提前学习的,好在每个编程语言中的关键字数量都不多,常用的也就几十个。
你还需要了解的是。
你刚才看到的C++语言编写的代码,计算机其实也是读不懂的。因为计算机只认识0和1。
所以,大家学习的编程语言叫做高级语言,并不是计算机能识别的语言。
那么就需要对高级语言进行翻译,翻译成不同的0和1的组合。
这个工作不需要我们来做,交给一些NB的人做好的编译工具。
比如VC、易语言,这些软件的功能都包括了两个方面,一个是支持高级语言的输入、识别,一个是对高级语言编写的代码进行翻译,或者叫编译。
一般来说,先把这些高级语言编译成汇编代码,然后再把汇编代码编译成很多的0和1。
所以,汇编语言是低级语言,比C语言和易语言更接近计算机的底层逻辑。
我们学破解,用OD这个工具看到的就是汇编代码。OD这个工具的作用就是可以把软件的汇编语言识别出来,因为是把0和1反向翻译成汇编语言,所以OD这个工具也叫做反汇编工具。
我们学破解,就是在反汇编的基础上通过对汇编代码的解读来了解软件的执行流程、验证流程、关键的代码位置。
二、内存和内存地址的意义
我想先问你,一段程序由计算机去执行,计算机会怎么做呢?
我们编写的程序代码在计算机眼里也是由不同的0和1的组合,都是数据,对吧。
另外你要先记住一点,所有的数据在计算机执行的时候都是在内存里。
内存你可以理解就是计算机对数据的存放和加工车间。
计算机会把这段程序的代码从硬盘上先拷贝到计算机的内存里,放到内存的哪里呢?
为了方便读取数据,计算机会把内存提前进行分区,看我用OD打开的一个软件:
text叫做代码区,里面放的就是这个软件的代码数据。
data叫做数据区,里面放的是这个软件在运行过程中使用的变量数据
rsrc叫做资源区,里面放的是这个软件的一些资源数据,如软件的图标、菜单等数据。
所以我们破解时分析代码,就要在代码区进行查看和分析。
你看上图的代码区的起始地址是401000,你这下就明白我们为什么搜索字符串的时候往往用先转到401000处再去搜索了吧。
我们再来进一步理解内存。
内存是用来存放数据的一块空间,对吧,就像是一块空地。
我们软件执行前,人为地把这块空地按照功能划分为住宅区(代码区)、商业区(数据区)、风景区(资源区)等。
那么,在住宅区内是不是还要标上楼号、房号等,我们统称为地址,否则你想找一个住家,该怎么找?
所以,为了便于管理数据,我们把内存进行了编号,按照一个字节(8个二进制数据)的大小做为一个地址。比如401000就是一个内存地址,这个地址里可以存放8个1。
这样一来,想找某个数据,就可以通过找到这个数据所在的地址就可以了。
我们再来看OD。
0054A058这个地址起始处开始存放call kernel32.GetVersion 这段代码数据,因为这段数据占用了6个字节,所以一直存到0054A05D这个位置,从0054A05E开始存放下一段代码数据。
明白了吗?
还有一个需要你明白的是。
代码区的数据在软件执行过程中是不变的,因为是已经写好的代码。
数据区的数据很多是可变的,会有很多软件执行过程中产生的中间数据和执行结果。
这些对于我们破解来说有什么意义呢?
我们破解主要修改的是代码区的数据,或者说是修改人家已经写好的代码,比如某个地址上的原汇编代码是jnz,你把它修改成jmp,你就修改了这个软件的源程序的执行流程。
所以,破解学什么?就是学如何快速有效地找到关键代码的地址。
那么修改数据区有意义吗?
对于破解而言,意义不大,因为数据区往往是中间数据或者叫临时数据,软件关闭后这些数据都没有了,软件的代码还是没有变。
但是,修改数据区对于做游戏外挂是很有意义的。
比如一个枪战游戏,一把枪限定有10颗子弹,子弹的颗数是存放在数据区中的一个地址上的,比如你已经打了9枪,那么这个地址上存放的就是1,。
在玩游戏的过程中,如果你把内存地址上这个1改成10或者100,是不是就NB了,这就是内存挂的原理。
就先写到这吧,有时间再写。
如果您觉得确实有帮助,请给支持,我会继续努力写下去,谢谢! 对于你们初学者来说可能觉得刚刚好,但对于我来说,不仅刚刚好,甚至还认真做好了笔记:loveliness: 以后就跟着您学了,老师。{:1_893:} 作为新手很实用 接地气 谢谢老师 很好的讲解, 谢谢老师,真是启蒙作品啊
一步步讲些。学习了。期望后续。
讲得很好,感谢大佬分享 谢谢分享,一路学下来,对新人很友好。 证明我来过了。