主要内容:使用OllyDBG分析windows自带的32位扫雷游戏;
介绍:学习windows逆向分析的简单例子之一;
1,下画图的API断点(比如BeginPaint等等之类的api)
2,点击F9,看是否断在api上,然后返回调用此api的函数:
3,确定调用BeginPaint周边有没有可以函数,并且测试功能:
4,测试可疑函数01002AC3
5,进入01002AC3,测试里面所有call
010026a7是画方块的地方;
6,分析函数010026a7
分析代码
//local.1 是实际的x坐标 local.2实际的Y坐标
//esi是相互的x坐标,eax是相互的y坐标
eax = 0
eax = eax+1
ds:[0x1005338] == 9
local.2 = 0x37 ==55
local.3 =eax//eax是y坐标
ebx== 0x1005360//循环的起始地址,方块数据存储的起始地址
while(eax<= 9)
{
esi = 0
esi = esi+1
local.1 = 12
while(esi <= 9)//ds:[0x1005334] == 9
{
eax = 0
eax = ds:[ebx+esi] //0x1005360 + esi; 只能得到2种值 0f 8f 取不到10,esi+1的
// 0f && 0x1f 0000 1111&&0001 1111 =f 0f && 0x8f 0000 1111&&1000 1111 =f
eax = eax && 0x1f// 结果只有1种: f
//ds:[eax*4+0x1005A20] [f*4+0x1005A20]= [1005A5C] == 0x3A010E9D;
//这个0x3A010E9D画出的是方块的样子,游戏开始的时候全都一样
call BitBltlocal.1 =local.1 + 16 //local.1 增加16(x增加一个方块大小)
esi =esi+1//x坐标++
}
local.3 = local.3+1
eax =local.3 //y坐标++
local.2 = local.2+16 //local.2 增加16(y增加一个方块大小)
ebx = ebx+32 //每次循环后,下一次的循环起始+32字节
}
7,分析:扫雷9*9,起始地址:0x1005360
更改三个框里的8F为0f,第三个框全8f
运行游戏,游戏前2行没有出现雷,第三行全是雷;
总结:
方块数据存储的起始地址:0x1005360
游戏开始时:两个0x01之间表示是数据区域,区域里面0x8f 表示是雷 ,0x0f 表示不是雷;
游戏结束后:0x40是空白 0x42是对应的数字(表示2) ,0xcc表示触发的雷,0x8f 表示表示未触发的雷