WinXP下 扫雷程序逆向分析 --扫雷辅助(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz709196484/article/details/78588441

逐步走向逆向的坑 , 慢慢的锻炼 也算是一种兴趣爱好吧

突然起兴 , (及时行乐) 就想着尝试分析一下扫雷
这次就用 winxp自带的扫雷试试
mine

查壳

使用peid 直接拖进去
PEID
可以看到 是使用VC 编写 而且 是 debug 版本
(M$ 还是比较厚道)

OD分析

直接拖进 OD
API 编程的逆向优势在于 调用的 api 函数 是直接可以查找到符号的
除非自己编写实现同样功能的代码
所以其实 API 程序比 DOS程序好分析多了

hint:
慢慢发现 着手分析一个程序的时候思路很重要 , 不然看着冰凉的汇编 也无法下手
这次主要的目的是 实现一个近似于一件扫雷的功能 , 那么雷的分布 固然很重要
每次的雷的位置 又是随机的 所以这样 假想 使用了 Rand 这个 api, 这个API 就成了要点
二话不说 先下断

bp rand
//或者使用插件进行下断

Rand

这里 OD 已经自动的帮我们下了断点

BP
一路跑 , 就执行到了这里

这个 idiv 是除法, 关键怎么除的有点懵 , 果断百度之
>

 字节操作:16位被除数在AX,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为
   (AL)<-(AX)/(SRC) 的商
   (AH)<-(AX)/(SRC) 的余数
  字操作:32位被除数放在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16位端在AX中,16位余数在DX中。表示为
  (AX)<-(DX,AX)/(SRC) 的商
  (DX)<-(DX,AX)/(SRC) 的余数
  双字操作:64位被除数在EDX,EAX中,其中EDX为高位双字,32位除数为源操作数,结果的32位商在EAX中,32位余数在EDX中,表示为
  (EAX)<-(EDX,EAX)/(SRC) 的商
  (EDX)<-(EDX,EAX)/(SRC) 的余数。

IDIV 之于 DIV 是带符号的除法, 其他相同
这样一看 这个意图 就很明显了

DIV

EAX = (EDX,EAX) % 9 
这里就是得到 0~8 的随机数!

随后 赋值给eax 作为返回值, ret 返回.

inc

这里把 长 宽(9*9)压栈保存
之后 esi+1 (eax 得到的是0~8) , 为了描述行(列)数 , 这里把它加一
然后下面又是一次 call winmine.01003940 (就是上面的随机函数 , 地址眼熟)
这里不赘述 , 就是即系生成一个随机的 行(列)值(0~8) , 之后加一

xy

下面我门回到 程序领空 这里可以看到 esi 和 ecx 分别保存着我们的

观察验证 (x,y)且(1~9 , 1~9)

shl 逻辑左移指令
这里比较重要, 就相当于把 ecx的值 乘以 0x20 (32D)

这句 ecx + esi + 0x1005340 就是比较重要了, 这个 0x1005340 就是雷区的基地址
ecx 已经 左移5位 esi 没有 所以 ,他们加起来就是
ecx * 0x20 + esi + 0x1005340

然后这里 与 0x80 进行 test (与)
1000 0000 如果首位不是 0 就 jnz 了


again
这里再把 eax左移5位
eax * 0x20 + esi + 0x1005340
注意 : 刚刚的 ecx 是由 eax inc 之后得到的 所以 这里 有 ecx - eax == 0x20

lea (Load effect address)
其实这点没懂 为啥编译出来一个 lea 还多请赐教
直接一样 ds:[eax+esi+0*1005340]就好啊
or 就把数据的 最高位 置 1
(这里就是置雷!!!)

这里有 dec
* [0x01005330] == 9 // 每过一个大循环就减一
* [0x01005338] == 9
当 其减到0 之后 说明初始化结束!(藏雷完毕!)

尚不完善, 夜深睡觉, 待续

猜你喜欢

转载自blog.csdn.net/zz709196484/article/details/78588441