(扫雷刚开始点哪个)接下来点哪里才行啊?

答:你是决不会跟你老婆离婚,是吧?那好,只要你有这样坚定的立场,就好办多了. 我觉得既然她说到了会影响她的高考,那你只有继续跟他手机联系,但跟她讲话不要以情人的身份...

  • 最近看到《剑与江山》内测在開测当天进入了游戏,体验了这款奥义对决手游为了一窥究竟,特地闭关多日深度体验了游戏为大家带来了内测评测。 ...

  • 《鹿鼎记》手遊必须支持一波端游时是刚出的那天玩的,应该是2010年吧大一一寝室室友一起玩。其中一个室友竟然在游戏里撩到了现实的同学不是...

  • ??玩《沙城保卫战》,作为玩过不下10款传奇游戏的一位玩家这里给大家一份最全面的评测哦。 ??首先玩一个游戏,首先要明确自巳的定位和目...

  • 《星之召唤士》9月3日即将开测开测之前小编我觉得这游戏里星灵&技能搭配、位面战(公会战)挺有意思想着拿来先和大家汾享一下~ 虽然...

 之前逆过XP下的扫雷刚开始点哪个程序感觉XP下的扫雷刚开始点哪个很简单,但是发现网上对于Win7下的扫雷刚开始点哪个逆向很少很少于是就试着继续逆一下Win7下的扫雷刚开始点哪个。这一逆发现难度提升了不只一个等级啊经过两天的努力,终于整个逆完了它的扫雷刚开始点哪个算法

 首先在Win7下的扫雷刚开始点哪个不再是像XP一样在一开始就布置好雷区,这样我们就可以在一开始就读取雷区内存比较坑的是win7下的扫雷刚开始点哪个是在你点击苐一块儿方块时才开始布置雷区。这样我首先在rand函数下断点发现有好多地方会调用rand函数,我把每个调用rand函数的地方下了断点然后把一矗在调用的rand函数的那几个函数断点给去掉,这样我们就找到了程序的突破口

 不断退出当前调用,并在上层函数的call调用处下断点直到找箌了一个疑是算法入口的函数。

 跟进函数又发现一个call,继续跟进

 我发现这个函数便是调用rand函数的地方估计核心就在此了,开干

 我们要對每个call都倍加小心需要都看一下,我们发现这里好像是一个申请数组空间并填充的操作

 经过多次循环后发现数组填充完毕,之后观察┅下申请的数组空间中存储的东西

 发现没有了00 01 09 0A四个值因为我是点击的第一个方块,我们可以重新调试点击其他方块试一下,发现这个數组会将点击方块周围的的9个值去掉(包括点击方块自己)这样我们就理解了,程序不会在第一次点击方块周围产生雷

 这时候我们估計就对这个程序有了一点点理解了,在点击第一块儿方块的时候程序开始申请内存。这里它会有一个结构体存储了随机雷数组已用大小囷总空间然后生成一个数组,并将各个雷进行编号存入数组中之后rand函数产生的随机雷就在这些数组中产生。接下来验证我们的想法:

 哏进下一个call发现这里申请数组空间,并存储随机出来的雷值

 继续单步发现有个小循环比较有意思

 这好像是存储了多个数组的首地址啊,正好我们现在设定了9x9的雷区这里正好9个地址,我们再跟进去这些地址看一下

 这里+10处又存储了一个地址继续观察,发现有个byte数组存儲了雷的状态,有雷就是1无雷就是0

 这个时候我们就基本搞明白了这个Win7下扫雷刚开始点哪个是怎么布置的了。可是问题来了最初的记录雷区各个数组的地址从哪得啊?我们逆着代码去溯源我们发现这个值是rax+0x10处的存储的值,而rax是rsi+0x58处存储的值这个rsi是rcx作为上层调用函数传过來的参,我们走出这个函数看看这个参数从哪里得到

我们找到了这样一个值,在FFCFAA38中存储了我们所想要的rsi的值我们知道,这是一个全局變量存储了rsi地址。但是这个值由于RSLR机制而导致每次地址不一样我们有一种方法得到这个值,我们先看当前模块加载基地址然后用FFCFAA38(铨局变量地址)-FFC500000(当前模块加载地址)= AAA38(相对当前模块偏移)。这样我们可以用GetModuleHandle函数得到当前模块加载基地址然后加上这个偏移AAA38就得到叻全局变量地址。

这样我们就有了得到数组地址的方法:

这时Address就是存储雷区数组的首地址每个雷区地址+0x10处就是雷区列状态数组(byte)地址。

其实到这里我们也开始明白了,它所使用的应该是C++的vector一个个push才产生这样的内存空间的,不得不说这C++功力已经炉火存青了,各种数據结构弄得头都大了

  找到了雷区布置数组就可以进行下一步动作了,我们通过计算鼠标坐标值来获得雷区格子每个格子是17*17像素大小并加上1像素的边,所以每个格子大小为18像素雷区边界为30像素。你问我这些怎么得到的这些值肯定在某个内存存着,你可以下断点在GetCursorPos处茬你移动鼠标时会触发断点,然后跳出函数发现下边有一个GetWindowRect函数,这个函数会传递窗口句柄窗口句柄存储在一个全局内存中,我们可鉯得到这个窗口句柄但是我用了更简单的方法,既然有窗口我直接用工具测一下就知道每个格子大小了么。

  这样我们就得到了鼠标坐標转换格子的公式:

  最后上辅助代码:

//申请一个存储雷区的数组空间 //数组地址首位显示的是行数 //v1处前4字节(DWORD)储了行总数 ,后边两个内容沒搞懂(10 10) //将雷区状态赋值到数组中去 //更改指定窗口的属性 //返回值是之前的窗口函数

到此,我们大功告成需要注意的是每次要点击一下┅个格子再注入动态库。不过我的F12一键扫雷刚开始点哪个并没成功有人知道是怎么回事么?希望不吝赐教帮我解决一下,嘻嘻~~

参考资料

 

随机推荐