Bean For Programmer(2)一个幽默的标准转弯。

2007 八月 9
by Luin

记得前些日子我说有一个Bean For Programmer计划,不知道有没有人当真。现在这个计划已经有了一些小小的进展,能够读取地图了。换句话说,计划已经完成了0.01%—–很可观的数字。不过在此不着重谈这个,现在要说的是一个规则的实现方法。Bean For Programmer计划中详细地写出了规则:其中一条是:“8、主程序控制3个(或更多)棋子,并通知参赛机器人比赛开始并提供当前地图、棋子信息和位置”。问题来了,如何“向机器人提供当前地图”?或许有一种非常简单的方法:向机器人发送一个包含地图路径的信息。但是假如为了公平竞赛,不允许将地图保存在磁盘上而是单独提供一个EXE来保存地图该怎么办呢?下面我来演示一下:
1.建立一个保存地图的EXE(简称地图EXE),定义一个20*20(实际需要可能不止如此)的数组,里面包含两个值:1或0(为了以后丰富地图方便,我们把它声明为byte而不是Boolean):

Map: Array[1..20, 1..20] Of byte;

2.运行OllyDBG并定位到保存Map值的地方。

OllyDBG定位截图

OllyDBG定位截图

3.复制地址。

复制地址

复制地址

4.机器人部分:

HANO:=FindWindow(Nil, 'Bean for programmer'); //找窗口(地图EXE标题为'Bean for programmer)
If HANO=0 Then//寻找窗体,
    Begin
      MessageBox(0, '没有找到目标程序', '我敬爱的Bean', mb_ok);
      Exit
End;
    FromH:=$00454DA0;//开始地址
    GetWindowThreadProcessId(HANO, @Dw1);
    HANS:=OpenProcess(PROCESS_VM_READ, True, Dw1); //打开进程
    For i:=1 To 400 Do
    Begin
      inc(FromH);
If ReadProcessMemory(HANS, pointer(FromH-1), lpBuffer, 1, lpNumberOfBytesRead)      Then//对地图EXE的内存数据
s:=s+IntToStr(lpBuffer^);//这样我们就获得了包含地图EXE中Map数组的值。
    End;

5.根据s画出地图。下面我截取了地图EXE和机器人端画出的地图。
(1)机器人端

 

机器人端 截图

机器人端 截图

(2)地图EXE端

地图EXE端 截图

地图EXE端 截图

我们可以发现两幅地图完全一样,OK,大功告成。

相关日志

No comments yet

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS