acme minechan

69
Perlで無理ゲーム攻略 How to play Win32::GuiTest TAKESAKO <[email protected]>

Upload: takesako

Post on 05-Dec-2014

6.471 views

Category:

Technology


6 download

DESCRIPTION

Perlで無理ゲーム攻略 (How to play Win32::GuiTest)http://yapcasia.org/2011/talk/32某MMORPGでゲーム中にPerlの同時起動を遮断する機能が追加されたことがありました。Win32::GuiTest や Win32::Screenshot などのモジュールを利用して、Windows上で動作するゲームを自動でプレイするPerlプログラムを作成する方法について解説します。Once upon a time, perl.exe was banned during a game by MMORPG.I will explain how to create the Perl bot program which playsautomatically games on Windows using some modules such asWin32::GuiTest and Win32::Screenshot.

TRANSCRIPT

Page 1: Acme minechan

Perlで無理ゲーム攻略 How to play Win32::GuiTest

TAKESAKO

<[email protected]>

Page 2: Acme minechan

Once upon a time

昔むかし

Page 3: Acme minechan

There was a MMORPG

あるところに MMORPG が

Page 4: Acme minechan

perl.exe was banned

Perl.exe を 遮断しました

Page 5: Acme minechan

http://www.ragnarokonline.jp/news/information/notice/item/7732

Page 6: Acme minechan

Perl.exe was banned…

Page 7: Acme minechan

Perl.exe was banned…

Page 8: Acme minechan
Page 9: Acme minechan

Why? どうして?

Page 10: Acme minechan

RMT (Real Money Trading) on MMORPG

Virtual Money Real Money

Page 11: Acme minechan

Making Bot (Computer game bot) with Perl

Page 12: Acme minechan

Hardware Bot

Page 13: Acme minechan

Hardware Bot

Page 14: Acme minechan

Making Software Bot

1. Network emulation

packet, socket, LWP (Perl)

2. Web Application

Selenium Core (JavaScript)

Selenium IDE (Firefox extension)

Selenium RC (Java/Python)

3. Windows Application

Win32::GuiTest (Perl)

Win32::Screenshot (Perl)

Page 15: Acme minechan

s.a. @turugina 日常業務でperlを使おう

http://yapcasia.org/2011/talk/109

Page 16: Acme minechan

Demo

Page 17: Acme minechan
Page 18: Acme minechan

(1) Win32::GuiTest

SendKeys($keys[,$delay])

use Win32::GuiTest qw(SendKeys); system("start notepad.exe"); # & sleep(1); SendKeys("foo{ENTER}"); SendKeys("bar{ENTER}"); SendKeys("bar{BS}z{ENTER}");

Page 19: Acme minechan

SendKeys($keys)

Name Action {BACKSPACE} Backspace {BS} Backspace {BKSP} Backspace {BREAK} Break {CAPS} Caps Lock {DELETE} Delete {DOWN} Down arrow {END} End {ENTER} Enter {ESCAPE} Escape {HELP} Help key {HOME} Home {INSERT} Insert {LEFT} Left arrow {NUMLOCK} Num lock {PGDN} Page down {PGUP} Page up

Name Action {PRTSCR} Print screen {RIGHT} Right arrow {SCROLL} Scroll lock {TAB} Tab {UP} Up arrow {PAUSE} Pause {F1} Function Key 1 ... ... {F24} Function Key 24 {SPC} Spacebar {SPACE} Spacebar {SPACEBAR} Spacebar {LWI} Left Windows Key {RWI} Right Windows Key {APP} Open Context Menu Key

Page 20: Acme minechan

(2) FindWindowLike, GetWindowRect

GetWindowText, GetClassName

use Win32::GuiTest qw(:ALL); system("start calc.exe"); sleep(1); my @id = FindWindowLike(undef,"^電卓","",undef,1);

my $id = $id[0]; print GetWindowText($id), "¥n"; print GetClassName ($id), "¥n"; my ($x1, $y1, $x2, $y2) = GetWindowRect($id); print "($x1, $y1)->($x2, $y2)", "¥n";

Page 21: Acme minechan

(3) Win32::Screenshot

CaputureRect #=> Image::Magick object

use Win32::Screenshot qw(CaptureRect); my $img = CaptureRect(20, 10, 800, 500); print $img; # Image::Magick=ARRAY(0xbeef) $img->Write("x.png"); # save system("start x.png"); # view

Page 22: Acme minechan

(4) Win32::GuiTest & Win32::Screenshot

Capture only “calc.exe” window

use Win32::GuiTest qw(:ALL); use Win32::Screenshot qw(CaptureRect); system("start calc.exe"); sleep(1); my @id = FindWindowLike(undef,"^電卓","",undef,1);

my ($x1, $y1, $x2, $y2) = GetWindowRect($id[0]); my $img = CaptureRect($x1,$y1, $x2-$x1,$y2-$y1); $img->Write("x.png"); # save system("start x.png"); # view

Page 23: Acme minechan
Page 24: Acme minechan

(5) {Image::Magick}->Get("signature")

Image binary SHA-256 digest string

use Win32::Screenshot qw(CaptureRect); my $img = CaptureRect(20, 10, 800, 500); $img; # Image::Magick=ARRAY(0xbeef) print $img->Get("signature"),"¥n"; # SHA-256 $img = new Image::Magick; $img->Read("x.png"); print $img->Get("signature"),"¥n"; # SHA-256

Page 25: Acme minechan
Page 26: Acme minechan

(6) Win32::GuiTest でマウスを操作する

MouseMoveAbsPix($x, $y)

use Win32::GuiTest qw(:ALL); for ($x = 0; $x < 900; $x += 2) { $y = sin($x / 60) * 300 + 400; MouseMoveAbsPix($x, $y); }

Page 27: Acme minechan

(7) Win32::GuiTest でマウスをクリックする

SendMouse($command)

use Win32::GuiTest qw(:ALL); for (1..5) { SendMouse("{LEFTCLICK}"); sleep(1); SendMouse("{RIGHTCLICK}"); sleep(1); }

Page 28: Acme minechan

Win32::GuiTest::SendMouse($command)

{LEFTDOWN} left button down {LEFTUP} left button up {MIDDLEDOWN} middle button down {MIDDLEUP} middle button up {RIGHTDOWN} right button down {RIGHTUP} right button up {LEFTCLICK} left button single click {MIDDLECLICK} middle button single click {RIGHTCLICK} right button single click {ABSx,y} move to absolute coordinate {RELx,y} move to relative coordinate

Page 29: Acme minechan
Page 30: Acme minechan

応用問題 practical lesson

Page 31: Acme minechan

無理ゲー攻略 mission impossible

Page 32: Acme minechan
Page 33: Acme minechan
Page 34: Acme minechan

Acme::MineChan

Minesweeper を ちゃんと解く。

マイン ちゃん

Page 35: Acme minechan

Demo

Page 36: Acme minechan

画像ファイルだけ、座標データは不要

Page 38: Acme minechan

FAQ. 役に立つの?

新しいスクリーンセーバーとして鑑賞する

Fun of the New Screen Saver

タイピングソフトでハイスコアを出す

Scoring champion for Key-Typing software

Windowsアプリの自動テスト化

Automation Testing for Win32 Applications

セキュリティ脆弱性検査

Fuzzing

その他 etc.

Page 39: Acme minechan

How to Debug

Page 40: Acme minechan

40

Page 41: Acme minechan

暴走 runaway

Page 42: Acme minechan

I Cannot control keyboard and mouse!

Page 43: Acme minechan

Oh…

Page 44: Acme minechan

Press Ctrl+C

Page 45: Acme minechan

infinite loooooooooooooop!!!(無限ループ)

Page 46: Acme minechan
Page 47: Acme minechan

I cannot use keyboard and mouse!!!

Page 48: Acme minechan

I want to kill

Page 49: Acme minechan

How to Kill the process on Win32

XP, 2003 Server …

New command line tools

tasklist

プロセスを一覧表示する

taskkill /F /IM notepad.exe

プロセスを kill する

成功: プロセス "notepad.exe" (PID 777) は強制終了されました。

Page 50: Acme minechan

How to kick?

I cannot use keyboard and mouse…

Page 51: Acme minechan
Page 52: Acme minechan

USB! USB!

Page 53: Acme minechan

Perl Killer USB Memory!

autorun.inf

[Autorun] open=taskkill /F /IM perl.exe

Page 54: Acme minechan

Insert USB Memory…

Page 55: Acme minechan

Successful!

Page 56: Acme minechan

Assign Desktop Shortcut Key (Ctrl+Alt+?)

KILLPERL.BAT Shortcut Desktop

@echo off taskkill /F /IM perl.exe

Page 57: Acme minechan

Ctrl + Alt + K

Page 58: Acme minechan

Perl is dead!

Page 59: Acme minechan

以上

Page 60: Acme minechan

all your minesweeper

are belong to us!

Page 61: Acme minechan

61

Page 62: Acme minechan

参考文献

Win32::GuiTest で Windows の GUI アプリをハックしよう(あまちゃん)

http://perl-users.jp/articles/advent-calendar/2008/13.html

Win32::GUITest と Win32::Clipboard で GUI 操作を自動化する(xaicron)

http://perl-users.jp/articles/advent-calendar/2010/win32/8

How To Get a Window Handle Without Specifying an Exact Title

http://support.microsoft.com/kb/147659/en

Minesweeper Clone

http://www.minesweeper.info/wiki/Minesweeper_Clone

アプリケーションをショートカット キーで起動する

http://www.microsoft.com/japan/athome/magazine/ucontents/users/tips/

windows/041.aspx

@turugina 日常業務でperlを使おう

http://yapcasia.org/2011/talk/109

@keroyonn_ Perlで次世代ゲーム開発 あらため Perl で次世代CUIゲーム開発

http://yapcasia.org/2011/talk/121

Page 63: Acme minechan

謝辞 acknowledgement

Page 66: Acme minechan
Page 67: Acme minechan
Page 69: Acme minechan

CPAN++