软件解密学习交流 群:
入门系列(四)-内存断点
作者:
还记得上一篇《入门系列(三)-函数参考》中的内容吗?在那篇文章中我们分析后发现一个7寄存器值不知是从什么地方产生的,要弄清这个问题必须要找
到生成这个7值的计算部分。今天我们的任务就是使用7的内存断点功能找到这个地方,搞清楚这个值是如何算出来的。这次分析的目标程序还是上一篇的那
个7,附件我就不再上传了,用上篇中的附件就可以了。下面我们开始:
还记得我们上篇中所说的关键代码的地方吗?温习一下:
!""#$%&'()*+,-./012*!34*+,-./012*!
!5!""64关键,要按 7 键跟进去
%&!894比较
75$:;6)164不等则完蛋
我们重新用7载入目标程序,7 运行来到上面代码所在的地方(你上次设的断点应该没删吧?),我们向上看看能不能找到那个7寄存器中最近是在哪里赋的
值。哈哈,原来就在附近啊:
我们现在知道7寄存器的值是从内存地址7中送过来的,那内存地址7中的数据是什么时候产生的呢?大家注意,我这里信息窗口中显示的是 7<
=>?77 !!,你那可能是7<=>?88888888,这里的788888888表示的是其它的值,就是说与我这里显示的 777 !!不一样。我们按上图的操作在数
据窗口中看一下:
从上图我们可以看出内存地址7处的值已经有了,说明早就算过了。现在怎么办呢?我们考虑一下,看情况程序是把这个值算出来以后写在这个内存地址,那我
们要是能让7在程序开始往这个内存地址写东西的时候中断下来,不就有可能知道目标程序是怎么算出这个值的吗?说干就干,我们在 7的菜单上点7调试@
3重新开始,或者按71)A7组合键(还可以点击工具栏上的那个有两个实心左箭头的图标)来重新载入程序。这时会跳出一个“进程仍处于激活状态”的对话框(我们可
以在在调试选项的安全标签下把“终止活动进程时警告”这条前面的勾去掉,这样下次就不会出现这个对话框了),问我们是否要终止进程。这里我们选“是”,程序被重新
载入,我们停在下面这一句上:
3BC!&(64D%/.?:(""
现在我们就要来设内存断点了。在7中一般我们用到的内存断点有内存访问和内存写入断点。内存访问断点就是指程序访问内存中我们指定的内存地址时中断,
内存写入断点就是指程序往我们指定的内存地址中写东西时中断。更多关于断点的知识大家可以参考 7论坛精华 @3基础知识@3断点技巧@3断点原理7这篇7"-E兄弟写的
《如何对抗硬件断点之一7@@@调试寄存器》文章,也可以看这个帖:FGD<BBED.,/BEF/0*F.DFDH*F.,.? 。根据当前我们调试的具体程序的情况,我们选
用内存写入断点。还记得前面我叫大家记住的那个7内存地址吗?现在我们要用上了。我们先在7的数据窗口中左键点击一下,再右击,会弹出一个如下图
所示的菜单。我们选择其中的转到@3表达式(也可以左键点击数据窗口后按71)A组合键)。如下图:
现在将会出现这样一个对话框: