免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:5.第二阶段x86游戏实战2-认识内存
上一个内存里写了关于内存的东西,最主要的是最后的写那一幅画面,脑子里一定要有那幅画面,不管在计算机中看到的内存是什么样都套那幅画面搞起来会很简单,本次写的是程序的流程,既然是要逆向,那就要知道一个程序的流程,要知道一个正向程序员是怎样写的代码,他/她写代码是个怎样的流程,这就需要有一个了解
先不写关于代码的,先写一个生活当中的流程
比如早上醒了然后起床然后洗漱(假设都洗漱)然后吃饭(假设都会吃早饭)然后生活(工作的工作上学的上学这种)然后忙了一天睡觉
简化的流程就是 醒了 -》起床-》洗漱-》吃饭-》生活-》睡觉,这就是一个流程大纲然后就会按部就班的一步一步去做
然后 醒了 -》起床-》洗漱-》吃饭-》生活-》睡觉 这是一个流程大纲,再细化一点比如起床,怎么起床?起床大众的过程是掀开被子然后坐起来然后下床然后穿衣服然后穿鞋然后就完成起床这个过程,然后可以说起床是由 掀开被子然后坐起来然后下床然后穿衣服然后穿鞋 这些动作组成的
然后来到写游戏代码中,它也和起床睡觉一个道理,比如打怪物,首先要寻路到有怪物的位置然后选择怪物然后打怪然后捡怪物的掉落物
简化的流程 寻路到有怪物的位置-》选择怪物-》打怪物-》捡怪物的掉落物 这样的一个流程
然后寻路到有怪物的位置它就由 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这样的一个流程组成,这些流程都做完了寻路到有怪物的位置就算完成了,然后选择怪物、打怪物、捡怪物的掉落物也就是这样的一个道理,然后 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这每一个步骤都是一段代码,然后代码它也是有内存地址的,也就是会有代码的头部(代码刚开始的位置),然后看下图红框,当代码执行到 寻路到有怪物的位置位置之后,它就会跳转到 上坐骑的代码,然后上坐骑的代码执行完再执行打开地图的代码直到执行完下坐骑的代码,然后执行完下坐骑的代码之后代码就会跳到选择怪物的哪里再执行选择怪物的代码,其它的也是这个道理,这样的一个步骤叫做call(函数调用,或者说调用函数)
然后就有一个问题,既然 寻路到有怪物的位置 这个东西是 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这个流程组成的为什么不直接写成下图的样子?这时因为 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这一段流程不只有寻路到有怪物的位置会用,这能还会有寻路到某个NPC某个玩家身边会用到 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这个流程,如果按照下图中的写法会重复写 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 它们的代码,按照上图的写法只需要写寻路到有怪物的位置就可以,不需要写重复写 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这一段流程,这一段流程只需要写一次就行了,比如写寻路到某个NPC时直接去用 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑这一段流程就可以,比如寻路直接告诉寻路到哪去就行,就不需要再写寻路到NPC的代码,这样就会节省很多很多时间,少写很多很多代码
以上是正向程序的开发流程,不理解、看不懂也没事,后面直接看逆向过程,多看看就能明白了
然后是常量和变量
常量意思是程序运行过程中不会变化的数据,或者说只要数据存在了就不会变了,或者说整个程序运行过程中只会发生一次变化
变量意思是程序运行过程中会发生变化的数据
进程和线程
进程在 3.第二阶段x86游戏实战2-认识强大的CE找血量(什么是进程) 里写了,现在对它再做一个补充,进程里面的数据有代码有常量和变量,变量一般就是比如qq里的网名、聊天数据、好友信息这种,常量的数据表面上一般看不到,然后双击一个exe文件会启动一个进程这个进程不会重复,如果双击两次exe文件也就是运行两次程序这样的是两个完全不相关的进程,不算是重复的进程,然后每个进程都会有一个进程id,如下图
然后进程指的是程序的代码(代码也属于数据的一种)、程序的数据等这些,也仅仅是数据,这意思就是进程并不会执行(或者说运行)代码,进程只是一个内存空间,内存空间里有程序所需要的数据和代码,并不会使用数据和代码,那谁来使用?这里又有新的概念了,线程,线程会执行进程里的代码,执行了代码也就使用了数据,一个进程里会默认有一个线程,这个线程被称为主线程,一个进程里可以有多个线程(线程有很多由操作系统控制),多线程的进程,比如现在想起床和洗漱一起做,如果只用主线程去做它就只能先起床再洗漱或者先洗漱再起床,这时可以开启一个新的线程,让新的线程做洗漱,让主线程做起床,这样就能边起床边洗漱了,当然线程执行代码也不是这样简单的,现在先这样理解