Acme minechan
Upcoming SlideShare
Loading in...5

Acme minechan



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

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

Win32::GuiTest や Win32::Screenshot などのモジュールを利用して、Windows上で

Once upon a time, perl.exe was banned during a game by MMORPG.
I will explain how to create the Perl bot program which plays
automatically games on Windows using some modules such as
Win32::GuiTest and Win32::Screenshot.



Total Views
Views on SlideShare
Embed Views



7 Embeds 3,177 2688 470 11 3 2 2 1


Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.


15 of 6 Post a comment

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

Acme minechan Acme minechan Presentation Transcript

  • Perlで無理ゲーム攻略How to play Win32::GuiTest TAKESAKO <>
  • 昔むかしOnce upon a time
  • あるところに MMORPG がThere was a MMORPG
  • Perl.exe を遮断しましたperl.exe was banned
  • Perl.exe was banned…
  • Perl.exe was banned…
  • Why?どうして?
  • RMT (Real Money Trading) on MMORPGVirtual Money  Real Money
  • Making Bot (Computer game bot) with Perl
  • Hardware Bot
  • Hardware Bot
  • Making Software Bot1. 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)
  • s.a. @turugina 日常業務でperlを使おう
  • Demo
  • (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}");
  • SendKeys($keys) Name Action Name Action{BACKSPACE} Backspace {PRTSCR} Print screen{BS} Backspace {RIGHT} Right arrow{BKSP} Backspace {SCROLL} Scroll lock{BREAK} Break {TAB} Tab{CAPS} Caps Lock {UP} Up arrow{DELETE} Delete {PAUSE} Pause{DOWN} Down arrow {F1} Function Key 1{END} End ... ...{ENTER} Enter {F24} Function Key 24{ESCAPE} Escape {SPC} Spacebar{HELP} Help key {SPACE} Spacebar{HOME} Home {SPACEBAR} Spacebar{INSERT} Insert {LWI} Left Windows Key{LEFT} Left arrow {RWI} Right Windows Key{NUMLOCK} Num lock {APP} Open Context Menu{PGDN} Page down Key{PGUP} Page up
  • (2) FindWindowLike, GetWindowRectGetWindowText, GetClassNameuse 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";
  • (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
  • (4) Win32::GuiTest & Win32::ScreenshotCapture only “calc.exe” windowuse 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
  • (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
  • (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);}
  • (7) Win32::GuiTest でマウスをクリックするSendMouse($command)use Win32::GuiTest qw(:ALL);for (1..5) { SendMouse("{LEFTCLICK}"); sleep(1); SendMouse("{RIGHTCLICK}"); sleep(1);}
  • 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
  • 応用問題practical lesson
  • 無理ゲー攻略mission impossible
  • Acme::MineChan マイン ちゃん Minesweeper を ちゃんと解く。
  • Demo
  • 画像ファイルだけ、座標データは不要
  • FAQ. 役に立つの?新しいスクリーンセーバーとして鑑賞する Fun of the New Screen Saverタイピングソフトでハイスコアを出す Scoring champion for Key-Typing softwareWindowsアプリの自動テスト化 Automation Testing for Win32 Applicationsセキュリティ脆弱性検査 Fuzzingその他 etc.
  • How toDebug
  • 40
  • 暴走runaway
  • I Cannot control keyboard and mouse!
  • Oh…
  • Press Ctrl+C
  • infinite loooooooooooooop!!!(無限ループ)
  • I cannot use keyboard and mouse!!!
  • I want to kill
  • 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) は強制終 了されました。
  • How to kick?I cannot use keyboard and mouse…
  • USB! USB!
  • Perl Killer USB Memory!autorun.inf[Autorun]open=taskkill /F /IM perl.exe
  • Insert USB Memory…
  • Successful!
  • Assign Desktop Shortcut Key (Ctrl+Alt+?)KILLPERL.BAT  Shortcut  Desktop@echo offtaskkill /F /IM perl.exe
  • Ctrl + Alt + K
  • Perl is dead!
  • 以上
  • all your minesweeper are belong to us!
  • 61
  • 参考文献 Win32::GuiTest で Windows の GUI アプリをハックしよう(あまちゃん)  Win32::GUITest と Win32::Clipboard で GUI 操作を自動化する(xaicron)  How To Get a Window Handle Without Specifying an Exact Title  Minesweeper Clone  アプリケーションをショートカット キーで起動する  windows/041.aspx @turugina 日常業務でperlを使おう  @keroyonn_ Perlで次世代ゲーム開発 あらため Perl で次世代CUIゲーム開発 
  • 謝辞acknowledgement
  • CPAN++