作者NDark (溺於黑暗)
看板GameDesign
标题[心得] "How i built ... poker bot?"心得(下)
时间Thu Jan 14 18:32:31 2010
浏览"How i built a working online poker bot?"心得(下)
作者:NDark
时间:20100113
参考网站:
http://www.codingthewheel.com/archives/how-i-built-a-working-poker-bot
(续前文)
重点内容
前面提到的input-processing-output
这三个系统的元件应该互相保持最低的了解。以下分述如下。
input是指撷取资讯的方式,可以使用的方式是
1.自萤幕撷取:screenshot analysis,从图片去分析。
2.自windows底层拦截:作者使用的方式。
3.自网路封包拦截:制作一个假的扑克软体与server沟通:intercept network packedge
要收集的资讯有(document)
a.目前桌上牌的资讯状态-table information
b.目前下牌的状态文字-summary text ,
c.聊天资讯-chat data
d.玩家的历史-player history
e.整个系统的历史-system history
这个部分Devlin说明的重点是怎麽利用视窗(就是windows)底层的机制
-"DLL injection"来撷取视窗软体的内部运作。
这边需要相当多的视窗程式设计的背景知识,
不过Devlin先强调一点
"DLL injection isn't a hack"
DLL injection是一个普遍观察视窗软体的方式(并不是骇客),
因为这是微软提供来处理视窗程式的公开方法。
至少有六种DLL injection的方法
1) via the Registry
2) using Windows hooks ,作者使用的方法
3) as a Debugger
4) with Remote Threads
5) by creating a Trojan DLL
6) CreateProcess/WriteProcessMemory
Devlin认为这方法并不难
"DLL injection isn't particularly difficult to implement"
最重要的是扑克客户端软体无法宣告所有的DLL都是非法的
(只能用一些关键字盯上一些已知的DLL)
有关撷取的方法简单来讲是先透过一个hook DLL
把自己挂到电脑上所有正在执行的程式中,
判断该程式是不是我们想要找的扑克客户端程式,
如果是,则把撷取资讯的DLL动态挂进来。
这边会需要去了解视窗程式设计的
"Windwos Hook","CBT Hook","SetWindowsHookEx"
http://msdn.microsoft.com/en-us/library/ms997537.aspx
http://msdn.microsoft.com/en-us/library/ms644977(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms644990.aspx
以及如何把DLL动态读入的方法
(Load another DLL when Injector load by Poker Program)
"LoadLibrary"
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
然後抓取到该视窗的handle之後就是分析你要抓的资讯在哪里?
这里又分成假如对方的程式是利用基本的视窗元件作的,那麽工作会简单得多。
如果对方的程式是自订的元件,那麽你就需要比较多的"观察"来找到目标的位置。
这边提到一个已经现成的分析软体Detours
http://research.microsoft.com/en-us/projects/detours/
http://research.microsoft.com/apps/pubs/default.aspx?id=68568
以及Spy++
Using Spy++ or Winspector to get basic information from the poker client
Spy++ and Winspector are useful window analysis and debugging tools which
allow you to view window properties and messages for any window in the system
http://www.windows-spy.com/
要挖的部分大概是"文字内容"的部分,也就是线上扑克程式给玩家的资讯栏位。
当然,你不一定要即时取得视窗资讯,
有时候扑克程式会把资料存起来,到那些档案挖也是可以的。
Devlin在这部分着墨很多,
主要是监控windows的底层函式库(API hooking)撷取原本呼叫的资料後
再把修改後的结果传给正确的函式。
"hook the core windows api DrawText(), replace the previous one"
API hooking : When your "preprocessing" is done, you'll pass control back
to the original API the poker application thought it was calling in the
first place so that everything works transparently.
因此"我要透过api hooking取得哪些控制项?",
答案是以下:桌的状态,文字栏位,按钮,纪录档,下/出牌的纪录,
程式呼叫的一些底层函式库等。
这边Devlin释出了两个范例
XMonitorBot 取得资讯的bot专案。
XFileMonitor 取得程式存取档案的监控程式。
有关第二部分
processing是处理资料决定判断的分歧有两个,
决定是否要盖牌认输,决定要怎麽出牌获胜。
也就是"侦测牌桌状态,侦测目前的策略,决定是否要盖牌,机率统计"流程的三四步骤
这个部分具体要完成的工作是
1.需要一个UI程式用来显示目前所有bot的资讯。
2.需要一个dll用来处理撷取资讯与处理资料。
有关如何出牌是一们大学问,网路上有很多牌局理论的社群。
Devlin自己撰写了一个网路Open Source算牌程式的收集程式来当作此部分的基底。
这个部分会形成你的算牌计算群组。会有以下的元件
Simulators , Hand Evaluators , History Analyzers , Poker Calculators
但是这部分的程式设计就他所说应该是撰写一个
rules-based systems / poker bot frameworks
或说是可抽换的AI设计(Pluggable Intelligence)或多性格的设计(multi-agent system)
譬如说可以决定这个bot是
积极与不积极的AI,高选择性与低选择性的AI,唬人的与诚实的AI。
这边提到一个网路上的工具Poker Tracker
可以用来来建置你的data base,分析你的对手或是本身的策略及漏洞.
所以你的各种AI策略就会包成一些DLL,由广泛至限缩
1.对於各种扑克的DLL
2.对於线上扑克的DLL
3.对於特种线上软体的扑克DLL
这边就有提到几个简单的bot范例
譬如说FoldBots(含程式)就是只会盖牌的程式:不积极,低选择性,唬人的。
TrashBots只要遇到垃圾牌就盖牌:不积极,低选择性,诚实的。
FoldBots工作流程是 :
. Inject the botting DLL into the poker client's address space.
Step 1: Inject the DLL : inject a DLL (XPokerBot.Hook.dll) into the poker
client process
. Respond to (poker table) window create notifications via the CBT hook.
Step 2: Detect the opening and closing of poker windows
. Subclass the poker table's (RichEdit control) chat window.
Step 3: Subclass the Chat Window
. Intercept chat window text by listening for and parsing EM_STREAMIN
messages.
Step 4: Intercept chat window text
. Parse the text using simple regular expressions.
Step 5: Parse the Chat Text
. Simulate input (clicking the Fold button) at the right time, based on those
messages.
Step 6: Simulate User Input
. Transmit hole card and table information to the poker bot GUI via simple
IPC.
Step 7: Update the GUI
其中step 6是最後一部分-模拟输出的部分。这部分提的比较少。
分为几种方法
逆向工程破解网路封包(假的客户端)
Reverse-engineer the network protocol and communicate directly with the poker
server.
透过视窗的底层
Hook into the poker client just beneath the user-interface. In this scenario,
you don't simulate mouse clicks; you figure out what internal function(s)
handle those mouse clicks, and call those functions directly.
用键盘精灵
Simulate user input - mouse clicks, keyboard input, whatever - at the
operating system or even the driver level.
不只是盖牌或是下牌,
甚至你必须把预设的字串打出去让你的bot可以与其他玩家作简单的对谈。
所以我们不只要取得文字的资讯,你还要能够把文字加入视窗程式的元件内容中。
这些细节在原作者的文章中都有提到。这边就不多作解释。
结论
经过这些分析,我们就比较清楚要完成这个专案,需要的是不同领域的知识结合,
大致上包含
视窗程式底层的工程师,人工智能的软体工程师,以及算牌的数学工程师。
如果你只有其中之一,或是都没有这样的人才能辅佐你,
要完成这专案就必须付出相当多的金钱,甚至付出之後成果也有可能不是自己的。
就算完成了专案,也都还要继续与那些线上扑克网站继续周旋-bot的反制与与反反制。
如果与人合夥,那也要特别注意合夥的法律问题与财务问题,这就不在本篇讨论的内容。
--
"May the Balance be with U"(愿平衡与你同在)
视窗介面游戏设计教学(
http://0rz.tw/V28It ),讨论,分享。欢迎来信。
视窗程式设计(Windows CLR Form)游戏架构设计(Game Application Framework)
游戏工具设计(Game App. Tool Design )
电脑图学架构及研究(Computer Graphics)论文代读(含投影片制作)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.96.77.176
1F:推 asoedarren:现在线上博奕似乎较少用client app 大多转用web flash 01/14 20:41
2F:→ NDark:这可能也是反制与反反制的一部分 01/14 20:49
3F:推 ddavid:然而最大宗之一的PokerStars依然是使用Client App 01/14 21:58
4F:推 etrexetrex:好棒 01/14 22:23
5F:→ yoco315:我猜版上不少人都跟我一样有能力独立作一个 O_O 01/15 00:50
6F:→ yoco315:只是後续需要不断的周旋才是真正吃时间的地方.. 01/15 00:51
7F:→ yoco315:另外前面说的是对的,好的 AI 玩起来超强的..真的会赚钱.. 01/15 00:51
8F:推 wangm4a1:推 01/15 08:02
9F:推 DreamYeh:推 01/15 22:52
10F:推 newcinka:推 01/16 11:13
11F:→ netsphere:能独立做出POKER BOT真强 演算法,系统,网路知识都需要 01/18 15:04
12F:推 etrexetrex:我作不出来QQ 01/18 15:25
13F:推 Kerlifw:推 很有趣 01/24 22:07