Delphi - XP扫雷外挂制作
2016-02-08 21:18
447 查看
技术交流,DH讲解.
本来之前就在写这个文章,还写了War3挂的教程,后来因为一些事就没有弄了.
现在过年在家又没有事就继续把这个写完吧.哈哈.
不要以为写个挂很容易,要想写个挂肯定要了解游戏呀.
我们现在来了解下地雷是怎么产生的?
其实只是我自己猜想的,毕竟这个游戏不是我写的...
1 用户选择了多大的棋盘,多少地雷后
棋盘应该是用一个二维数组来存储的,地雷数肯定是用一个全局变量来存储的.这点儿有异议没有?
没有我就继续往下说了...
2 生成地雷,肯定是随机的,那么一定会调用Rand函数咯.
a.首先判断地雷数是否为0 ---是0->结束生成过程
|
不是0
|
b.Rand产生X,Rand产生Y
|
c.判断二维数组中(X,Y)的值是否为有雷值---不是-->转到b
|
是
|
d.雷数减一---------->转到a
整个流程看懂了吧.
那么我们来实际分析呀,OD Time,从上面看我bp Rand然后进入步骤b,只要到了步骤c我们就能知道雷的内存区域了,是吧?
我们遍历区域就知道哪些格子是雷了塞.
下断点:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb.png)
当断点断下来了后 我们可以看到堆栈窗口:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_1.png)
选中第一个,然后回车.返回:
有点儿基础的朋友可以看出来,这里是它写了一个函数,先Rand一个数,然后整除另一个数,返回取余的结果.
其中这2个数是什么,上面那图我们看见2个返回到,是吧?那么选中第二个回车呗.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_2.png)
下断,单步走:我们就会发现压入栈的是1E=29,那么应该是30个,我们看一下是行还是列.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_3.png)
也就是这个这个函数传入的参数是行列数,哈哈因为这个C++的,所以PUSH那一下就是在传参数.好的看具体参数:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_4.png)
现在可以看出来,rand函数的参数用的返回地址,$010036D2,而rand出来值再对行列数取余,也就是[esp+4]就是这个30,这样就保证,最后这个值肯定小于30咯.
我们知道上面这些,我们就来看看具体某一个雷,当我们插了小旗子后有什么变化没有:
我们执行到010036E1这句时候发现:esi是$10也就是16,ecx是3,那么16-3是雷.我们让游戏运行起来.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_6.png)
将这个设置成有雷后,这个内存的值就是8F了.点上红旗后:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_7.png)
有雷且有红旗这个值就是$8E.那么要是没有雷又被点了红旗会是什么值呢?
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_8.png)
哈哈,$0E吧.记住了吧.我们来整理下.
1 有雷 $8F
2 无雷 $0F
3 红旗 $FE
1和3进行或,2和3进行或.
好,该Delphi了.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_5.png)
哈哈,读取出来了吧.这里只是显示.下一篇文章,我们去寻找点击的call,然后实现自动点击.嘿嘿,秒杀.
我是DH,今天就讲这么多了.
http://www.cnblogs.com/huangjacky/archive/2010/02/20/1669643.html
本来之前就在写这个文章,还写了War3挂的教程,后来因为一些事就没有弄了.
现在过年在家又没有事就继续把这个写完吧.哈哈.
不要以为写个挂很容易,要想写个挂肯定要了解游戏呀.
我们现在来了解下地雷是怎么产生的?
其实只是我自己猜想的,毕竟这个游戏不是我写的...
1 用户选择了多大的棋盘,多少地雷后
棋盘应该是用一个二维数组来存储的,地雷数肯定是用一个全局变量来存储的.这点儿有异议没有?
没有我就继续往下说了...
2 生成地雷,肯定是随机的,那么一定会调用Rand函数咯.
a.首先判断地雷数是否为0 ---是0->结束生成过程
|
不是0
|
b.Rand产生X,Rand产生Y
|
c.判断二维数组中(X,Y)的值是否为有雷值---不是-->转到b
|
是
|
d.雷数减一---------->转到a
整个流程看懂了吧.
那么我们来实际分析呀,OD Time,从上面看我bp Rand然后进入步骤b,只要到了步骤c我们就能知道雷的内存区域了,是吧?
我们遍历区域就知道哪些格子是雷了塞.
下断点:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb.png)
当断点断下来了后 我们可以看到堆栈窗口:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_1.png)
选中第一个,然后回车.返回:
其中这2个数是什么,上面那图我们看见2个返回到,是吧?那么选中第二个回车呗.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_2.png)
下断,单步走:我们就会发现压入栈的是1E=29,那么应该是30个,我们看一下是行还是列.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_3.png)
也就是这个这个函数传入的参数是行列数,哈哈因为这个C++的,所以PUSH那一下就是在传参数.好的看具体参数:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_4.png)
现在可以看出来,rand函数的参数用的返回地址,$010036D2,而rand出来值再对行列数取余,也就是[esp+4]就是这个30,这样就保证,最后这个值肯定小于30咯.
我们执行到010036E1这句时候发现:esi是$10也就是16,ecx是3,那么16-3是雷.我们让游戏运行起来.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_6.png)
将这个设置成有雷后,这个内存的值就是8F了.点上红旗后:
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_7.png)
有雷且有红旗这个值就是$8E.那么要是没有雷又被点了红旗会是什么值呢?
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_8.png)
哈哈,$0E吧.记住了吧.我们来整理下.
1 有雷 $8F
2 无雷 $0F
3 红旗 $FE
1和3进行或,2和3进行或.
好,该Delphi了.
![](http://images.cnblogs.com/cnblogs_com/huangjacky/WindowsLiveWriter/Delphi_678/image_thumb_5.png)
哈哈,读取出来了吧.这里只是显示.下一篇文章,我们去寻找点击的call,然后实现自动点击.嘿嘿,秒杀.
我是DH,今天就讲这么多了.
http://www.cnblogs.com/huangjacky/archive/2010/02/20/1669643.html
相关文章推荐
- Delphi - SEH研究
- Delphi - 闲来无事,自己写个Timer玩玩(多线程Timer)
- 先有Delphi内存对象,后有句柄(如果需要的话),最后再显示
- 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)
- Delphi 序列化、反序列化、串行化、持久化
- DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)
- Delphi体系内部的4种消息传递办法(Send,Post,Perform,Dispatch)
- delphi高手突破之异常及错误处理
- delphi如何加上spliter分割条,任意调整大小
- delphi高手突破学习笔记之面向对象类和对象的本质(有汇编解释 good)
- delphi模态窗体最小化会隐藏的问题
- 终于懂了:Delphi消息的Result完全是生造出来的,不是Windows消息自带的(Delphi对Windows编程体系的改造越大,学习收获就越大)
- 终于懂了:Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了,跟Windows消息虽然尽量保持一致,但其实相互没有特别大的关系。有了这个,就有了主动,带不带句柄完全看需要。
- WM_PAINT在微软官方定义中,wParam和lParam都没有使用,所以就被Delphi给重定义了这个消息,还增加了DC(Delphi可任意改写消息的结构,只需要保持前4个字节是消息即可,另外要携带微软定义的所有必要信息就行了)
- WM_PAINT中应该用BeginPaint与EndPaint这两个api,它们的功能正是使无效区域恢复(所以WM_PAINT里即使什么都不做,也必须写上BeginPaint与EndPaint)——Delphi里WM_PAINT消息的三个走向都做到了这一点
- Delphi和C++数据类型对照表
- Delphi中如何获得光标
- 利用Delphi编写Socket通信程序
- (delphi)DbgridEh排序
- ListView 百分比进度条(delphi版)