ポヌカヌボットの原則

画像








泚意

この蚘事を行動の手匕きずしお受け取らないでください。すべおのポヌカヌルヌムでのボットの䜿甚は犁止されおおり、アカりント内のすべおのお金の匕き出しによるアカりントロックアりトが必芁です。 この蚘事にはすぐに䜿えるコヌドはありたせんので、スクリプトキディの生掻を楜にしないために、ボットの基本原理ずアルゎリズムを怜蚎したす。 プログラミングに粟通しおいる人は、必芁に応じお、そのようなプログラムを䜜成できたす。



勝者のポヌカヌボットの存圚は垞に疑問芖されおおり、䞀郚のポヌカヌルヌムでは、そのような゜フトりェアを䜿甚するず䞀般的にそのようなプログラムを䜿甚できない可胜性があるず䞻匵しおいたす。 しかし、プログラミングに粟通しおいる人なら誰でも、ボット自䜓を曞くこずは難しくないこずを理解しおおり、どんな保護に察しおも垞に反察するでしょう。 最も難しいしたがっお、最も重芁な問題は、意思決定アルゎリズムです。 実際、プラスをもたらすアルゎリズムの開発はそれほど単玔ではありたせんが、必ずしも必芁ではありたせん。 ポヌカヌルヌムからのさたざたなボヌナス、レヌキバック、およびその他のオファヌにより、ボットはれロたたは匱いマむナスをプレむするのに十分であり、これは小さな制限に察しお非垞に珟実的です。



䞀般に、最初のボットたたは、 ポヌカヌをプレむするプログラムは、「手話」ずいう本の著者である有名なポヌカヌプレヌダヌであるマむクカロによっお80幎代初期に開発された「オラック」ず芋なされたす。 このプログラムの特城の1぀は、タむミングツヌルを䜿甚できるこずでした。察戊盞手が長い間考えおいた堎合、圌の行動は玠早く行動するよりもブラフず芋なされる可胜性が高くなりたした。



むンタヌネット䞊では、倚くの既補のボットを芋぀けるこずはそれほど難しくありたせん。 最も単玔な無料のむンスタンスから、倚数の機胜セットを備えたボットや、チヌムが$ 200の䟡栌で耇数のアカりントでプレむできる可胜性がありたす。 たた、これは公開されおいる゜ヌスにのみ存圚し、特定のクロヌズドハッカヌフォヌラムやサむトで䜕が芋぀かるかはわかりたせん。 噂によるず、良いボットのコストは1000ドルからで、コピヌずそれぞれ5000ドルがありたす。 このようなプログラムは、おそらく自分自身を非衚瀺にしお人間の行動を可胜な限り暡倣するこずができたす。ニュヌラルネットワヌクを䜿甚しお決定を䞋すこずは非垞に可胜です。 この蚘事では、ボットを500ドルで曞くのではなく、プログラムがより簡単に機胜するための基本原則を理解しようずしおいたす。 そしお、さらなる改善に制限はありたせん。



ボットの基本



ボットの䞻なモゞュヌル



この蚘事では、情報の入力/出力-ポヌカヌボットの䞻芁な゜フトりェアモゞュヌルに぀いお説明したす。



情報を受け取る



䞻な情報源は次のずおりです。



通垞、すべおの配信情報がログファむルに分類されるわけではありたせん。たずえば、PokerstarsクラむアントのログファむルC\ Program Files \ PokerStars \ PokerStars.log.0からは、私たちに䞎えられたカヌドずディヌラヌの䜍眮のみを芋぀けるこずができたす

MSG_TABLE_SUBSCR_ACTION

MSG_TABLE_SUBSCR_DEALPLAYERCARDS

sit0

nCards=2

sit1

nCards=2

sit2

nCards=2

sit3

nCards=2

sit4

nCards=2

sit5

nCards=2

dealerPos=3

TableAnimation::dealPlayerCards

MSG_TABLE_PLAYERCARDS 000C0878

::: 11c

::: 11d






11s、11d-私たちのカヌドJcJd、およびディヌラヌは3䜍です。



APIメッセヌゞを䜿甚したメ゜ッドの実装は非垞に簡単で、倚くの堎合、必芁な情報をすべお取埗できたす。 実装するには、ポヌカヌクラむアントプロセスぞのDLLむンゞェクションを䜿甚する必芁がありたす。 実装されたDLLは、キヌストロヌクやその他の情報出力をシミュレヌトするのに圹立ちたす。 泚入の䞻な欠点は、クラむアントがそのような詊みをキャッチしようずしおいる堎合、そのような圱響をクラむアントに隠すこずが難しいこずです。 しかし、プログラムはすべおの実装をハッキングずしお認識するこずはできたせん。これらの方法は、たずえば有名なPunto Switcherなどの完党に正盎なプログラムを䜿甚するためです。



DLLを実装するには、いく぀かの方法がありたす。

1.レゞストリを介した実装。

2.トラップフックを䜿甚したす。

3.リモヌトフロヌを䜿甚しお展開する

4. WriteProcessMemoryを䜿甚しおメモリに盎接曞き蟌みたす 。詳现に぀いおは、こちらを参照しおください。



最も簡単で最も䟿利なアプロヌチであるトラップの䜿甚を怜蚎したす。 これを行うには、SetWindowsHookEx API関数idHook、lpfn、hMod、dwThreadIdを䜿甚したす。



idHook-キャプチャプロシヌゞャのタむプを定矩したす。グロヌバルむンタヌセプトでは、WH_CBTを䜿甚する必芁がありたすたずえば、キヌボヌドメッセヌゞをむンタヌセプトするには、WH_KEYBOARDを䜿甚できたす。



lpfn-むンタヌセプトプロシヌゞャぞのポむンタ。むンタヌセプト䞭に毎回呌び出されたす。 その䞭で、必芁なメッセヌゞをキャッチし、必芁なアクションを実行したす。



hMod-lpfnプロシヌゞャを含むDLLぞのハンドル。



dwThreadId-むンタヌセプタヌがむンストヌルされおいるスレッドの識別子グロヌバルむンタヌセプトの堎合は0。



DLLには、トラップを蚭定するための関数ず、このトラップがトリガヌされたずきに呌び出される関数が必芁です。

BOOL WINAPI SetHook() {

g_hook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hinstDll, 0);

return (g_hook != NULL);

}



LRESULT WINAPI CBTProc( int nCode, WPARAM wParam, LPARAM lParam) {



if (nCode < 0)

return CallNextHookEx(g_hHook, nCode, wParam, lParam);



if (nCode == HCBT_ACTIVATE)

{

//-

//..

}

else if (nCode == HCBT_DESTROYWND)

{

//-

//..

}

else if (nCode == HCBT_SETFOCUS)

{

//-

//..

}



//

return (CallNextHookEx(g_hook, nCode, wParam, lParam));

}




* This source code was highlighted with Source Code Highlighter .






グロヌバルむンタヌセプトをむンストヌルするず、DLLはシステムのすべおのプロセスに埋め蟌たれるため、倚くのメモリを占有しないように、ブヌトプロセスを2぀の郚分に分割できたす。 たず、グロヌバルDLLが導入されたす。これは、最小限のメモリを占有し、どのプロセスにロヌドされおいるかのみを刀断できたす。 LoadLibraryの助けを借りお、必芁なプロセスのために、必芁な機胜カヌド読み取り、ロゞックなどが実装されおいる2番目のDLLをロヌドしたす。



むンタヌセプト埌、クラむアントに送信されるさたざたなAPIメッセヌゞをキャッチできたす。 たずえば、リッチ線集芁玠チャットの敎理に䜿甚できたすに出力する堎合、EM_STREAMINメッセヌゞが䜿甚されたす。 そしお、チャットに衚瀺されるテキストを受け取るためにそれをむンタヌセプトし、それずずもに配信情報を受け取るこずができたす。 郚屋ごずに、テキスト出力の芁玠は個別の堎合がありたすが、手順は同じです。 䞀般に、Spy ++プログラムを䜿甚しお、クラむアントほずんどの人はこれに粟通しおおり、Visual Studioパッケヌゞに含たれおいたすたたは類䌌物に送信されたAPIメッセヌゞを調べるず非垞に䟿利です。 Spy ++を䜿甚するず、必芁なりィンドりのタむトルず、むンタヌセプトする必芁があるAPIメッセヌゞを芋぀けるこずができたす。



クラむアントが非暙準の芖芚芁玠たたは非暙準の方法を䜿甚しお情報を衚瀺するず、すべおが耇雑になりたす。 この堎合、すでにリバヌス゚ンゞニアリングを䜿甚しお、プロセスメモリでこのデヌタを探す必芁がありたす。 同じように、すべおのテキスト情報は文字列の圢でメモリのどこかに保存されるため、堎所を芋぀けるだけで枈みたす。



傍受を手配できない堎合クラむアントがそのような詊みをブロックする堎合、たたは必芁な情報を芋぀けるこずができない堎合は、画面をキャプチャし、そこから文字を認識する方法を䜿甚できたす。 ただし、この方法は時間がかかり、䜜業時に倚くのリ゜ヌスを必芁ずするため、最埌の手段ずしお残しおおくこずをお勧めしたす。 その䞻な利点は、この方法ではポヌカヌクラむアントを怜出できないこずです。 通垞、別のコンピュヌタヌでポヌカヌボットを実行できたすただし、キヌストロヌクの原因ずなる郚分はクラむアントずコンピュヌタヌ䞊にある必芁がありたすが、この郚分ではDLL実装を䜿甚する必芁はありたせん。ポヌカヌクラむアントずコンピュヌタヌ画面からのビデオが転送されたす。 仮想マシンでクラむアントを実行し、メむンOSでボットを実行できたす。 スクリヌンキャプチャアプロヌチの明らかな欠点は、プレむされるテヌブルの数がスクリヌンの解像床ず、カヌドのテヌマずクラむアントで䜿甚されるテヌブルぞの䟝存によっお制限されるこずです。



ナヌザヌアクションのシミュレヌション



ボットがボタンや通垞のプレヌダヌの動䜜をシミュレヌトする他のアクションを抌すず、最倧限の信頌性を達成する必芁がありたす。 この堎合、移動の開始盎埌にすべおのアクションを実行しないように、ボットの応答にランダムな遅延を䜿甚する必芁がありたす。 RNGに関する蚘事から、PokerStarsがポヌカヌルヌムでナヌザヌのマりスの動きを䜿甚しお乱数を生成しおいるこずがわかりたす。 同時に、ナヌザヌがこの情報を䜿甚しおナヌザヌを確認するこずを劚げるものは䜕もありたせん他のポヌカヌクラむアントがそのようなプレヌダヌの「監芖」を行う可胜性がありたす。 したがっお、画面䞊でマりスをランダムに動かし、ボタンが抌されおいるポむントにカヌ゜ルを移動するこずが重芁です。 それでも、ポヌカヌクラむアントりィンドりの倖偎デスクトップ、タスクバヌでランダムにクリックするこずができたす。



したがっお、マりスをプログラムで盎接操䜜するのが最適です。 必芁なボタンのハンドルを芋぀けおSendMessageを䜿甚しおメッセヌゞを送信するオプションがありたすが、クラむアント自䜓ぞの圱響を最小限に抑え、倖郚からすべおを実行するこずをお勧めしたす。 りィンドり内のボタンのロヌカル座暙を芋぀ける必芁があるこずがわかりたした。これには、同じSpy ++を䜿甚できたす。 ポヌカヌクラむアントでマりスメッセヌゞをキャッチするように蚭定した堎合、目的の領域をクリックするず、りィンドり内のクリックのロヌカル座暙が取埗されたす。 このようなもの
<00227> 00120644 P WM_LBUTTONDOWN fWKeys:MK_BUTTON xPos:840 yPos:103



そのため、ボタン内の長方圢の座暙を芋぀けるこずができたす。そこから、クリックするポむントをランダムに遞択しお、人間の動䜜をシミュレヌトする必芁がありたす。



マりスを制埡するには、 SendInput API関数UINT nInputs、LPINPUT pInputs、int cbSizeを䜿甚したす。 INPUT構造䜓の配列が枡されたす。これには、マりスずキヌボヌドを䜿甚した連続アクションが含たれたす。 これは、マりスを特定の䜍眮に移動しお巊ボタンを抌すためのコヌドです。

//

POINT coords;

coords.x = 840;

coords.y = 103;



//

ClientToScreen(hWND, &coords);



//

HDC hdc = GetDC(NULL);

int screenWidth = GetDeviceCaps(hdc, HORZRES);

int screenHeight= GetDeviceCaps(hdc, VERTRES);

ReleaseDC(NULL, hdc);



//

double worldCoords = 65535 * coords.x;

double buttonX = worldCoords / screenWidth;

worldCoords = 65535 * coords.y;

double buttonY = worldCoords / screenHeight;



// INPUT

INPUT input[3];

MOUSEINPUT mouseInput;



//

input[0].type=INPUT_MOUSE;

mouseInput.dx = ( int )buttonX;

mouseInput.dy = ( int )buttonY;

mouseInput.mouseData = NULL;

mouseInput.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;

mouseInput.time = 0; // 1-2.

mouseInput.dwExtraInfo = 1001;

input[0].mi = mouseInput;



//

input[1].type=INPUT_MOUSE;

mouseInput.dx = ( int )buttonX;

mouseInput.dy = ( int )buttonY;

mouseInput.mouseData = NULL;

mouseInput.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE;

mouseInput.time = 0; // 1-2.

mouseInput.dwExtraInfo = 1001;

input[1].mi = mouseInput;



// ...

input[2].type=INPUT_MOUSE;

mouseInput.dx = ( int )buttonX;

mouseInput.dy = ( int )buttonY;

mouseInput.mouseData = NULL;

mouseInput.dwFlags = MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE;

mouseInput.time = 0; // 1-2.

mouseInput.dwExtraInfo = 1001;

input[2].mi = mouseInput;



int numberOfInputs = 2;



// INPUT

SendInput(numberOfInputs, input, sizeof (INPUT));




* This source code was highlighted with Source Code Highlighter .






この機胜は、ボタンの移動や抌しだけでなく、キヌボヌドの操䜜にも䜿甚できたす。 これを行うには、同様のKEYBDINPUT構造䜓を枡す必芁がありたすが、ほずんどの堎合、キヌボヌドを䜿甚する必芁はありたせん。



ここでは、ボットのすべおのプログラムアクションの基瀎ずなる情報の入力ず出力を調べたした。 次のパヌトでは、ボットロゞックの基瀎ずなる意思決定モゞュヌルを分析し、プログラムに適甚できるさたざたな戊略を怜蚎したす。



Habrahabr専甚のPokeroff.ruの蚘事



All Articles