逆向学习中扫雷第一阶段小结

函数整理

1、在最初的分析首先想到的就是整理整个过程的运行思路,在整个运行过程中。首先要知道的就是在整个过程中,运用了哪些函数。因此,下面整理了大部分的函数。

2、KillTimer 销毁计时器

SetTimer 创建计时器

BeginPaint 告诉显卡需要输出内容

EndPaint 输出结束

PostQuitMessage 终止线程

PtInRect 判断指定点是否在矩形内部

SetCapture 捕获鼠标信息

MapWindowPoints 该函数把相对于一个窗口的 坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点

PeekMessageW 为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。如果消息可得到,返回非零值;如果没有消息可得到,返回值是零

ReleaseCapture 解除鼠标捕获

SetDlgitemInt 将uValue的值设为对话框控件的文本

winhelpw

SetDlgitemText 设置对话框中控件的文本和标题

wsprintf 将一系列的 字符和数值输入到 缓冲区

lstrcpyw 复制一个 字符串到缓冲区

SendMessage 指定的消息发送到一个或多个窗口

Getdlgitem 检索指定的对话框中的控件句柄

GetSystemMetrics 用于得到被定义的系统数据或者系统配置信息

InvalidateRect 向指定的 窗体更新区域添加一个矩形,然后窗口客户区域的这一部分将被重新绘制

DialogBoxParam 根据对话框模板资源创建一个模态的对话框

ShowWindow 展示这个窗口

SetRect 设置矩形内容

SendMessageW 将指定的消息发送到一个或多个窗口

GetDC 使应用程序更多地控制在客户区域内如何或是否发生剪切

ReleaseDC 释放设备上下文环境(DC)供其他应用程序使用

setpixel 将指定坐标处的像素设为指定的颜色

DefWindowProcW 确保每一个消息得到处理

3、在这之后,整理了一些我觉得可能对分析有用的函数,如下:

InitCommonControlsEx 可以注册指定控件的窗口类。在使用SDK编写windows界面的时候,如果使用了月历控件,IP地址控件等高级控件,则需要调用此函数。说简单了就是创建窗口使得应用程序可视化

LoadIconW 载入当前文件中指定的图标资源

LoadCursorw 从一个与应用事例相关的可执行文件(EXE文件)中载入指定的光标资源

GetStockObject 检索预定义的备用笔、刷子、字体或者 调色板的句柄

RegisterClassW 注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的 窗口类

LoadMenuW 该函数从与应用程序实例相联系的 可执行文件(.EXE)中加载指定的菜单资源

LoadAcceleratorsW 函数功能:调入加速键表。该函数调入指定的加速键表(快捷键必用)

UpdateWindow 如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗口的客户区。函数绕过应用程序的 消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。

TranslateAccelerator 处理菜单命令中的加速键

TranslateMessage 将虚拟键消息转换为字符消息

DispatchMessage 调度一个消息给窗口程序

FindResource 确定指定模块中指定类型和名称的资源所在位置

LoadResource 装载指定资源到全局存储器

LockResource 锁定内存中的指定资源,说白了就是返回资源在内存中的地址

SelectObject 该函数选择一对象到指定的设备上下文环境中,新对象替换先前的相同类型的对象。

SetdiBitStoDevice 函数使用DIB位图和颜色数据对与目标设备环境相关的设备上的指定矩形中的像素进行设置

GetStockObject 检索预定义的备用笔、刷子、字体或者调色板的句柄

CreateCompatibleDC 该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。

OutputDebugStringA 使你的程序和 调试器进行交谈

CreateCompatibleBitmap 创建与指定的设备环境相关的设备兼容的位图。

ReleaseDC 释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。它只释放公用的和设备上下文环境,对于类或私有的则无效。

DeleteDC 该函数删除指定的设备上下文环境(Dc)

DeleteObject 函数删除一个逻辑笔、画笔、字体、 位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了

BitBlt 该函数对指定的源设备环境区域中的像素进行位(bit_block)转换,以传送到目标设备环境

SetROP2 设定当前前景色的混合模式

RegQueryValueExW 获取一个项的设置值  返回值

RegCreateKeyExW 指定项下创建新项的更复杂的方式

RegCloseKey 释放指定注册键的句柄

GetDesktopWindow 函数返回桌面窗口的句柄

GetDeviceCaps 获取指定设备的性能参数

RegSetValueExW 设置指定项的值

lstrlenW

rand 产生随机数的一个随机函数

LoadStringW 从 资源 里加载字符串资源到CString对象里

GetPrivateProfileIntW 为初始化文件中指定的条目获取一个整数值

GetTickCount 返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数,它的返回值是DWORD。

srand 随机数发生器的初始化函数。

CheckMenuItem 复选或撤消复选指定的菜单条目

Setmenu 分配一个新菜单到指定窗口

ShellAboutW 显示一个关于壳信息的对话框,四个参数。

GetModuleFileNameA 获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。

GetDlgItemInt 获取控件中里面字符串并转换成int类型返回

GetModuleHandleA 获取一个应用程序或 动态链接库的模块句柄

GetStartupInfoA 返回进程在启动时被指定的 STARTUPINFO 结构

msvcrt 一个dll,配合实现了许多功能

**_controlfp** 获取和设置浮点控制字

LoadLibraryA 载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源

GetProcAddress 获取进程地址

RegOpenKeyExA 打开一个指定的注册表键

无时间限定设置

1.在扫雷的计时方面,我们很容易想到的是通过系统所提供的计时器函数来实现。这个计时器为SetTimer,通过设置计时器我们来计算时间。因此我们通过OD的模块间函数调用来找到这个函数。

908755-20160518001642232-1415576923.png

2、我们把在这下断点。重新运行发现,不管是下什么类型的断点,都没法让时间和程序断下来。我查看了一些资料发现有的人说这个位置下断,重新运行后,每次鼠标点击都会产生中断,但是我实际走的过程中发现,不管我下什么点都无效,所以在这我也姑且相信自己的做的过程。

3、从这我们可以分析出,这个SetTimer并不是我们所要的记时间的内容,因此我们在这语句附近查找可疑语句,在这边我们可以想一下,如果不借助系统函数,通过语句来实现时间的计算,那我们很可能用的就是一个inc语句。这里我们看见如下

908755-20160518001658607-1716637598.png

4、从这条语句我们看出,这是一个地址内存单元,对内存中的数据进行递增操作,因此我们猜测这是计时的语句 inc dword ptr ds:[0x100579C],我们转到该内存单元,如我们所料,因此在这我们下一个内存写入断点(因为每当时间改变时,都必须把变换的时间写入该位置)

908755-20160518001712779-907005526.png

5、我们再次运行,首先我们看下运行之前的状态

908755-20160518001726654-529067435.png

6、我们重新运行发现时间跳变,在此运行时间在此跳变,因此我们确定这跳inc实现的就是时间的递增运算

908755-20160518001745951-1615735340.png

908755-20160518001756826-1391586252.png

7、在此我们把inc语句nop掉,并修改保存内容。之后运行修改后的程序,我们发现时间一直不变。

908755-20160518001826779-1966419950.png

雷区布置的内存区域查找

1、在这我们先给出雷区的内存地址,具体如何确定雷区的内存地址,这涉及到雷区绘制的函数,在这我们先不多做解释,具体说明会在之后的博客之中说明。

2、雷区内存地址为0x1005340

908755-20160518001900091-645099037.png

3、在这我们做如下说明,首先由上图,我们看到我们所选的是初级扫雷,因此具体的格子是9 9的方格(中级是16 16、高级是16*30、自定义看情况),因此我们看到内存单元中横向上是10 10 10 ……10组成了扫雷界面的上下边界,纵向上也是10 10 10……10组成左右边界。

4、在这有一个疑问,纵向中的10和10之间有0F存在,这个0F行是否是每行的分割线?如果是,为何纵向没有?

5、上述我们所说的是边界问题,接下来看一下具体框中数据,在初始生成扫雷的时候,我们可以看到,边界之中只有0F和8F两种数据,纵向是9列对应,横向为19行,去掉10行0F也是9行对应。这就表示与生成的9*9对应。于此同时有10个8F剩下的全是0F。所以对应于10个雷的位置。

6、在我们点了一个位置之后我们可以看到,内存会出现1 和2 还有空白的情况。而与之对应的内存单元中数据变成了41 42和40这就表示数据更改。

908755-20160518001916341-388216118.png

7、最后将内存中数据做了一下整理,如下图所示,可以看出我们原先所做的猜测是对的,雷区中雷的数据的确是8F,因此我们可以根据此时的内存中的情况,来完成扫雷,这样可以做到更快。

908755-20160518002036998-596508929.png

8、虽然还没接触扫雷的辅助软件,也未知道其具体的工作原理,但是在这也可以猜测一下是否可以通过内存单元中的数据内容做出对照表实现辅助,同时也可以修改代码以实现时间不变。

下周的学习内容

1、说明雷区内存查找的具体方式

2、分析随机数发生函数在雷区绘制中的最用,并分析是否可以从这个角度对具体的功能进行修改

3、分析上述的几个又用函数在总体结构中的作用以及流程中的作用。

4、同时也需要解决的一个问题就是:扫雷结束的判断的机理是什么?如何判断已经扫结束?是否可以根据未点的格子的个数和雷的个数的比较来判断?假如雷的个数是自定义的呢?

转载于:https://www.cnblogs.com/miaohj/p/5503793.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值