破解一个程序的时候我们可以通过搜索字符串的方式来寻找关键点,那么假如我们在编写一个程序的时候,怎么提防这种简单的暴破方式呢?
上一篇文章中已经提到过od里面实现搜索字符串功能是一个插件,视频中的作者给我们展示了一下这个插件的源码,下图是插件的核心函数:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
可以看出,该函数显示读取整个模块的内存,然后开始寻找push,mov,lea指令,并读取他们的操作数,当他读到’\0’的时候就认为这是一个字符串,但是问题也来了,如下图
在这里插入图片描述
我们可以看到,上图的push ebp中的ebp是以\0结尾的,但是很明显,这并不是一个字符串,而是一个结构体。但是他却读到’\0’的时候就停止了并判定这是一个字符串,这样就导致了真正的字符串并没有读取,只读取了\0就结束了。而ida则是直接通过搜索pe文件的。

说了这么多,那么我们到底该如何防止搜索字符串呢?我们新建一个vs windows控制台程序,然后在od中的地址栏中右键修改二进制
在这里插入图片描述
然后输入注册失败,接着修改它的值,将14中的1改为0,
在这里插入图片描述
然后将字符串的二进制复制下来。(点击二进制,然后赋值二进制)粘贴在刚刚新建的vs中(说的这么麻烦,其实就是修改一下字符串的值,添加了一个\0,然后将十六进制复制到了我们写的的VS中)
在这里插入图片描述
写好了,接下来找到生成的exe拖入od中,再次搜索,芜湖,查找失败,用ida试一下,芜湖,也是查找失败。其实,废话这么多,原理很简单,因为我们是以十六进制的方式输入的字符串,od当然就查找不到了。。。。(主要记一下操作步骤)。
但是,当我们将str[]定义成全局变量时,却发现又可以查找出来了。
为什么呢?老师没有讲,而是当作思考题留了下来,说实话我想不出来T^T,以后有思路了再来更新吧。
在这里插入图片描述
字符串查完了又牵扯出了昨天的一个遗留问题,关于多线程的问题,什么是多线程呢?个人理解就是每个计算机程序都是一个进程,而每个进程都由一个或多个线程组成。(这里有个文章讲的很详细 https://blog.csdn.net/beidaol/article/details/89135277
言归正传,我们之前分析的都是一个单线程的exe,可当我们碰到多线程的时候就会出现这种情况。如下图:

在这里插入图片描述
我们会卡到reet这里无法执行,遇到这种情况直接点击t窗口右键回复所有线程就可以了,我们接着往下单步执行,过了一会儿,我们发现地址怎么一下子变得这么大,直接由004变为了7开头。我们看一下上面那个标题,发现我们现在在kernal模块里,这明显不对啊,我们按-号退回一步,
在这里插入图片描述
退回一步以后:
在这里插入图片描述
出现了这种代码,这里我们一定要记住这种样子的代码,这种代码就是多线程的代码。也是e语言里面典型的线程特征。那么我们来看一下e语言如何写多线程exe。
在这里插入图片描述
既然知道这是多线程了,那我们怎么找到我们想要进的线程呢?
在这里插入图片描述
然后选择绿色的,红色的是我们当前cpu所在的的位置
在这里插入图片描述
然后就能轻松找到关键点了。

接下来就该使用破解补丁工具了
当我们在破解一个程序时,如果遇到这种情况的话,就该使用到我们的补丁破解工具了。

在这里插入图片描述
我们记住要修改的内存地址

然后打开xh补丁制作工具。
在这里插入图片描述
输入地址和我们想要修改成的内容,然后把目标文件拖拽进去。ok,生成成功。

第二个工具是pyg官方补丁工具,操作过程都一样,但是这个工具却给我们生成了一个dll文件。啊这,怎么运行嘞?我们先把生成的dll文件拖到我们破解的exe文件的路径下,然后就发现exe文件破解成功了,为什么呢?是因为每一个程序在运行的时候都会加载很多的dll文件,而我们把生成的dll文件放到exe文件的路径下的话,exe文件就会优先加载我们放入的dll文件,而而不是继续去系统里面寻找dll文件,这种方法也叫dll劫持。