Serangan Klon: Teknologi Mengemudi Bot Modern

“Sekarang Anda menulis program yang paling sulit dalam hidup Anda, yang hanya akan menambah dua angka”
Irina Ryzhova


Permainan judi online yang cerdas adalah berita gembira untuk bot. Bahkan jika pengembang perangkat lunak gim menghabiskan banyak uang untuk menangkap bot, seperti di kamar poker online, misalnya, masih ada kemungkinan besar untuk menemukan "bot pintar", gim yang akan dimainkan satu lawan satu. Terutama jika bot itu benar-benar kebal ... Karena tidak ada uang yang akan melindungi sistem yang dilewati banyak uang.


Fig. 1. Botovody datang


Ancaman tersembunyi


Game online judi intelektual tidak aman. Terutama tidak aman adalah mereka di mana uang riil berputar. Ketidakamanan mereka dimanifestasikan terutama dalam kenyataan bahwa tidak mungkin untuk mengetahui dengan pasti dengan siapa Anda bermain: dengan orang yang hidup, atau dengan bot. Dalam kasus kedua, game akan berada dalam satu tujuan. Dalam permainan "bunga", - catur dan catur di mail.ru, misalnya, - pemilik game online melihat botovotirovanie melalui jari-jari mereka. Dalam permainan online multi-pemain, yang sampai batas tertentu menampilkan uang langsung, sedikit lebih banyak perhatian diberikan untuk menangkap bot. Namun, bahkan jika pendekatan untuk menekan botswood sangat serius - seperti yang dilakukan misalnya di kamar poker online - masih ada kemungkinan besar tersandung ke dalam bot.

Pengembang perangkat lunak poker menghabiskan banyak uang untuk mengekspos bot, dan bagaimanapun, botswana poker online sedang booming. Tanpa uang dapat melindungi sistem yang dilewati banyak uang. Botovodov dan penangkap bot, - menganalisis trik lawan dan mengambil tindakan balasan yang tepat, - secara bergantian menang. Seseorang mungkin berpikir bahwa pertempuran di antara mereka tidak akan pernah berakhir. Namun, ada skema mengemudi bot yang aman di depan yang dilewati para penangkap bot. Sangat menarik dalam hal itu, bahkan jika "pejuang keadilan" akan memiliki di tangan mereka secara rinci kode sumber bot yang berkomentar, mereka tidak akan dapat menetapkan fakta penggunaannya. Implementasi skema ini adalah peristiwa yang mahal, namun, karena potensi manfaatnya besar, skema ini cukup relevan.

#

– , . – , . ( , ), «-» ( , - ). , , , , -, . , . , , , - ( ); , .. - . - , . - (3, , , , ..). . . . – - -- ( , ). -, , , , , – . - – - , - ( . « »).




: , .Pertama, bot mengambil gambar dari kondisi permainan saat ini - baik dengan tangkapan layar atau dengan memotong lalu lintas jaringan. Kedua, bot memutuskan apa yang harus dilakukan dalam situasi tersebut, kadang-kadang beralih ke perangkat lunak pihak ketiga (misalnya, dalam hal catur, ia dapat berinteraksi dengan beberapa jenis mesin catur). Akhirnya, ketiga, bot mengemulasi interaksi pengguna dengan keyboard dan mouse. Lebih lanjut, siklus terner ini - yang ingin dilacak dan dilanggar oleh para penangkap bot - berulang. Dengan demikian, pertempuran antara botovodov dan "pejuang keadilan" terjadi di tiga front. Pertempuran ini memiliki sejarah yang panjang dan mengasyikkan, namun, kita hanya akan fokus pada duel terakhirnya, di mana "pejuang keadilan", dalam menghadapi bot yang benar-benar kebal, mengalami kegagalan tanpa syarat.

Bottechnology kebal dicapai melalui fotografi tak terlihat, analisis tak terlihat dan emulasi tak terlihat. Tidak mungkin melakukan ini di satu komputer. Pertama-tama, karena perangkat lunak poker modern memiliki elemen rootkit.

#

. , , , , - : « , ». - « » « » . , , – .

, . , . , – , , -. – .

, , , : «» , . , – , – , «- ».

– . , « », « » . , – , – . , , – .

, , . , , . , , , , - , . – «».


, .. , .Solusinya adalah meluncurkan bot bukan pada workstation tempat game dimainkan, tetapi pada komputer yang terpisah - sebuah emulator. Kemudian, dengan tunduk pada tiga kondisi paranoid, perangkat lunak poker tidak akan memiliki kesempatan untuk mengenali fakta persaingan: 1) stasiun kerja dan emulator seharusnya tidak dapat berkomunikasi melalui jaringan; 2) untuk memotret keadaan permainan saat ini, Anda harus menggunakan output analog dari kartu video, - terhubung ke "komputer screener" menggunakan kartu video capture; 3) untuk meniru keyboard dan mouse, Anda harus menggunakan gadget perangkat keras-perangkat lunak, yang inputnya terhubung ke komputer emulator, dan output - ke dua workstation PS / 2 dari mana game dimainkan. Ini adalah output video analog dan PS / 2 bahwa perangkat lunak poker tidak tahu bahwa beberapa peralatan tambahan terhubung ke komputer.



Saat meniru keyboard dan mouse, Anda harus mempertimbangkan keadaan biometrik dan teknometrik yang relevan, yang juga dapat dipantau oleh perangkat lunak poker. Sedangkan untuk biometrik, ketika meniru keyboard dan mouse, harus diperhatikan untuk meniru gerakan tubuh yang mirip dengan kebenaran. Harus diingat bahwa, pertama, orang yang hidup tidak dapat bermain dengan tempo yang stabil untuk waktu yang lama segera di 16 meja secara bersamaan - terutama pada monitor delapan inci. Kedua, orang yang hidup tidak bisa bermain 28 jam sehari, 6 hari seminggu. Akhirnya, ketiga, pergerakan orang yang hidup dapat berubah - tergantung pada berapa banyak waktu yang dihabiskannya di depan komputer. Untuk meniru keadaan biometrik yang masuk akal, Anda perlu: 1) "PS / 2-sniffer" - lotion perangkat lunak dan perangkat keras,yang akan mendengarkan aliran data yang dikirim oleh keyboard dan mouse ke port PS / 2, dan menyimpan semua yang didengar dalam file terpisah, yang selanjutnya akan digunakan untuk meniru keadaan biometrik yang masuk akal; 2) orang yang hidup yang benar-benar akan bermain poker online selama bot itu direncanakan untuk dimasukkan - itu adalah tindakannya yang akan direkam oleh "PS / 2-sniffer".

Sedangkan untuk teknologi, setiap keyboard dan mouse memiliki "tulisan tangan" yang unik. Itu dapat dilacak dengan menganalisis pada tingkat rendah aliran sinyal mentah yang datang dari mereka ke komputer. Oleh karena itu, jika beberapa workstation terlibat dalam mengemudi bot sekaligus, maka dalam persiapan untuk emulasi biometrik, untuk masing-masing diperlukan: 1) untuk mengatur penyadapan individu, - dengan keyboard dan mouse yang berbeda, 2) untuk menanam orang yang berbeda untuk setiap workstation yang tindakannya akan diperbaiki dengan "PS / 2 sniffer". Kebutuhan akan paragraf kedua disebabkan oleh fakta bahwa setiap orang menggunakan mouse dan keyboard secara terpisah. Dengan materi statistik yang cukup luas, dimungkinkan untuk menentukan dengan tingkat kepastian yang memadai siapa yang duduk di depan komputer, bahkan jika pengguna tidak diautentikasi.

# -

, , « »: , – , « ». , - « », , . , . , – «-» «-» – . -, , – , : , , , , . , , - , , .


Jadi, persiapan untuk emulasi dengan parameter biometrik dan teknometrik masuk akal dibuat. Sekarang tetap ingat keyboard dan mouse mana yang sesuai dengan pengguna mana - dan jangan pernah putus korespondensi ini. Mengabaikan biometrik dan teknologi atau emulasi yang tidak masuk akal dapat menyebabkan pemblokiran akun tanpa penjelasan. Tunduk pada semua tindakan pencegahan, tidak peduli seberapa paranoidnya, seseorang dapat mengandalkan pembotolan yang kebal.


Elemen bot yang kebal



Fig. 2. Bot yang

kebal Bot yang kebal adalah kompleks hardware-software yang mencakup seluruh armada komputer yang akan menyelesaikan 6 tugas yang berbeda secara mendasar. Ditambah beberapa lotion perangkat keras dan lunak. Ditambah dua orang yang hidup, untuk mengamati dan merespons situasi darurat.

1. Workstation (dengan IP khusus atau PROXY berkualitas tinggi), di mana 9 kamar poker diluncurkan pada saat yang sama. Seharusnya memiliki kartu video dengan output video analog definisi tinggi dan monitor besar, karena banyak ruangan pada monitor kecil terlihat mencurigakan. Secara ekonomis lebih hemat biaya untuk menggunakan bukan hanya satu workstation - tetapi sekitar sepuluh sekaligus. Dalam hal ini, bot dapat diluncurkan secara bersamaan di 90 kamar sekaligus.

2. Screener - komputer yang kuat dengan kartu video capture, yang terhubung melalui splitter video ke semua workstation. Tugas screener adalah mengenali sinyal yang diterima dan menerjemahkannya ke dalam bentuk struktural. Data ini selanjutnya akan digunakan untuk 1) menulis ke database, 2) analitik dan 3) membuat keputusan untuk tindakan.

3. Analis - komputer yang kuat yang bekerja berdasarkan prinsip server meteorologi, tetapi bukannya fenomena alam yang mengakumulasi semua data poker yang mungkin - menceritakan. Bahkan, ada lebih banyak jitu di poker komputer daripada di poker langsung. Tetapi masalahnya adalah bahwa tanpa perangkat lunak tambahan hampir tidak mungkin untuk melacak mereka. Dan penggunaan perangkat lunak seperti itu dihentikan dalam segala cara yang mungkin - Anda bisa mendapatkan larangan jika Anda menggunakannya di workstation.

4. Memata-matai - memisahkan akun dari mana permainan tidak dimainkan, tetapi hanya koleksi berurutan dari semua informasi yang tersedia dari semua kamar yang tersedia. Seharusnya ada beberapa mata-mata, karena jika akun yang sama masuk bersama dengan permainan kami dan log off di akhir, itu bisa melempar koin sistematis ke celengan kecurigaan, dan ketika celengan ini penuh, kami hanya menutup akun tanpa memberikan alasan apa pun. Seorang "mata-mata" harus bekerja dengan prinsip yang sama dengan "workstation". Tampaknya ada cukup banyak layar perangkat lunak dan emulasi perangkat lunak dari mouse dengan keyboard. Namun, karena perangkat lunak poker berpotensi mengikat perangkat keras dan akun kelinci berikutnya, penyaringan dan persaingan perangkat keras harus dilakukan untuk mata-mata - juga untuk workstation.

5. Emulator - komputer yang kekuatannya tidak mendasar. Terhubung ke beberapa splitter untuk mouse dan keyboard. Dari splitter ini, kabel menuju input PS / 2 untuk mouse dan keyboard ke masing-masing stasiun kerja dan mata-mata. Komputer ini menerima perintah dari analis dan mengirimkannya ke workstation. Memperhatikan fitur perangkat keras mouse dan keyboard, dan karakteristik fisiologis dari perilaku orang yang bekerja di belakangnya (biometrik dan teknologi).

6. Dua pengamat yang hidup. Ini bukan lagi komputer, yaitu manusia hidup. Mereka diperlukan, karena pengembang perangkat lunak poker tidak tidur, dan kapan saja mereka dapat menjalankan beberapa tes unik, untuk mengidentifikasi driver bot. Satu orang saja tidak cukup - karena ia dapat pergi sesuai kebutuhan atau membedaki hidungnya, dan pada saat ini akan muncul situasi darurat. Ada situasi di mana semuanya ditentukan oleh detik. Karena itu, penting agar seseorang selalu berada di dekat mesin. Sehingga ketika "tombol merah menyala" (ketika analis menemukan perilaku yang tidak dikenal), seseorang dapat mengatakan kepadanya apa yang harus dilakukan (menulis sesuatu dalam obrolan atau menutup jendela). Dan dalam hal apapun Anda tidak dapat langsung pergi ke workstation, agar tidak merusak model perilaku yang sesuai dari keyboard dan mouse.Tindakan harus dilakukan hanya melalui "pos komando".

7. Command post - komputer yang kekuatannya juga tidak mendasar. Seharusnya hanya terhubung ke emulator. Ini persis mesin di mana dua pengamat hidup duduk dan melaluinya mereka, jika perlu, melakukan penyesuaian yang diperlukan untuk perilaku bot.


Sentuhan akhir


Jadi, ini adalah 7 elemen bot yang kebal. Ketika menghubungkan mereka, perlu dicatat bahwa screener, analis dan emulator bertukar data melalui jaringan. Interaksi dengan workstation dan mata-mata berlangsung ketat melalui output analog kartu video dan PS / 2. Selain itu, komputer ini harus dipisahkan secara fisik dari orang lain. Tidak ada pembicaraan komunikasi antara mereka melalui jaringan. Karena kompleksitas perangkat lunak dan perangkat keras yang sedemikian kompleks, penting juga untuk berhati-hati untuk meminimalkan kesalahan yang terkait dengan faktor manusia. Untuk melakukan ini, emulator, antara lain, mengurus peluncuran semua perangkat lunak yang diperlukan pada workstation dan mata-mata. Screener, analis, dan emulator harus waspada segera setelah dinyalakan - perangkat lunak yang sesuai harus hanya pada saat startup.


Harapan baru



Fig. 3. Harapan baru

Skema mengemudi bot yang dideskripsikan, bahkan dengan pengenalan yang dangkal dengannya, bukan untuk orang yang lemah hati. Tetapi di atas diberikan, meskipun rinci, tetapi masih - deskripsi dangkal. Untuk implementasinya, seseorang harus tidak memiliki kualifikasi teknis yang kuat, baik dalam pemrograman dan elektronik. Ketika pemrograman, pengembang akan membutuhkan pengetahuan dari berbagai bidang seperti matematika diskrit, pendekatan spline, transformasi wavelet, jaringan saraf, mesin negara, logika fuzzy, pemrograman multi-threaded, pemrosesan sinyal digital. Saat mengimplementasikan perangkat keras bot, pengembang akan membutuhkan pengetahuan dari berbagai bidang seperti sistem mikroprosesor, teknologi digital dan mikroprosesor, bekerja dengan mikrokontroler dan FPGA, dasar-dasar teknik listrik, pemrograman driver tingkat rendah, arsitektur OS, dan arsitektur prosesor.

#

– , « ». , – , , – , . , . , – SetWindowsHookEx, CreateToolHelpSnapshot32, EnumProcessModules, – . . , : , PokerStars , Visual Studio.


Jadi, ini adalah skema mengemudi bot yang aman. Seperti yang dikatakan di awal, sangat menarik dalam hal itu, bahkan jika "pejuang untuk keadilan" akan memiliki di tangan mereka secara rinci mengomentari kode sumber untuk bot, mereka tidak akan dapat menetapkan fakta penggunaannya. Sedangkan bot biasa - tanpa fungsi tembus pandang - "pejuang keadilan" dapat melacak, bahkan tanpa sumbernya. Teknologi modern, khususnya rootkit, yang sangat diharapkan oleh pengembang perangkat lunak poker, memungkinkan mereka menggali lebih dalam ke sistem operasi, dan sebagainya. bertindak berdasarkan prinsip "duduk tinggi, melihat jauh." Dengan pengembangan rootkit dan teknologi perlindungan lainnya, "pejuang keadilan" memiliki harapan baru untuk kemenangan tanpa syarat. Namun, skema mengemudi bot aman di atas mengurangi semua harapan ini menjadi sia-sia.Implementasi skema ini adalah peristiwa yang mahal, namun, karena potensi manfaatnya besar, skema ini cukup relevan. Jadi masuk akal untuk berani.


Revenge of the Sith


Tidak lebih cepat dikatakan daripada dilakukan. Berani! Tetapi apakah itu layak untuk menghabiskan waktu untuk sisa artikel? Seorang insinyur IT kelas satu, yang berafiliasi dengan liga top X-scene dikonfirmasi oleh sesuatu yang lebih penting daripada hanya segel indah dalam diploma, jelas tidak sepadan. Dalam arsenal X-nya, sudah ada trik mistik yang cukup untuk "membalas" bot tua tanpa bantuan orang lain, yang pernah memblokir oksigen di "sisi terang pasukan".

Pengembang tingkat lanjut, yang keterlibatannya dengan adegan-X hanya karena penguasaan C ++ dan assembler yang hebat, tidak boleh membuang waktu, tetapi karena alasan yang berbeda, mereka tidak akan melakukannya. Tingkat perincian materi yang disajikan tidak mencukupi bagi mereka, karena dalam artikel ini tidak hanya banyak tugas pemrograman sepele yang sengaja ditinggalkan (pengembang maju berurusan dengan mereka satu-dua-tiga), tetapi juga beberapa konsep teknik dasar. Adapun skrip skrip, yang bahkan tidak berbicara percakapan C ++ dan assembler, tidak ada pertanyaan tentang manfaat artikel ini bagi mereka.

Namun, seorang insinyur rata-rata, yang telah meninggalkan perkembangan remaja (yang telah mengembangkan sedikit kecerdikan teknik), tetapi belum memasuki usia rekayasa dewasa, akan menemukan di sini ide-ide menarik yang akan membantunya mewujudkan bot yang kebal. Sejauh dia sudah dapat menemukan solusi sederhana untuk tugas-tugas yang tampaknya rumit, menggunakan sumber daya yang tersedia. Dan inilah tepatnya kekuatan mistis yang dihargai pada adegan-X, baik pada sisi terang maupun sisi gelapnya. Kemampuan untuk memilikinya itulah yang membedakan seorang insinyur dari seorang pengembang. Jadi, mari kita mengatur "pejuang untuk keadilan" panas, menunjukkan apa sisi gelap kekuatan yang mampu.


Empire menyerang balik



Fig. 4. The Empire Strikes Back Kabar

baiknya: bagian tersulit sudah berakhir. Rencana aksi strategis, yang juga merupakan pernyataan tidak resmi dari masalah, sudah siap. Sekarang tinggal sedikit menentukan dan merinci - untuk menggambarkan dalam tindakan taktis. Pada tahap perincian, hal yang paling penting adalah berjalan dengan tenang "dari umum ke khusus", dan seterusnya. untuk membentuk kerangka proyek masa depan. Pada saat yang sama, tanpa masuk ke detail implementasi unit fungsional tertentu, tetapi hanya memperbaikinya. Kami akan mengurus perincian mereka nanti, ketika bingkai sudah sepenuhnya siap.

#

, – . , – . 99- . 10- , , , , : « , ». , IDE .


Untuk kejelasan yang lebih besar, kita akan menggunakan sintaks bahasa Fort (jangan dikacaukan dengan Fortran). Ini adalah bahasa unik yang secara alami lebih menyukai gerakan rasional teknik. Keindahan dari pendekatan "Pinjam Fort" adalah bahwa semua kekurangan konseptual proyek diidentifikasi di pantai, dan bukan di tengah implementasinya, yang sejak awal berkontribusi pada pengembangan berkualitas tinggi. Tanpa perlu refactoring berikutnya. Jadi, kerangka kerja "dari umum ke khusus":
Kerangka kerja "dari umum ke khusus"
: -
  - -
  - -
  - --
  -
;

: --
  - !!!!!!
  - !!!!!!
  - !!!!!!
  - 
  - -
;

: -
   --
  - -
  --
;

: -
  - --
  - -
  --
;

: !!!!!!
  --- -
  -- -
  --
;

: -
  ---
  -----
  --
;

: --
  -- -
  - -
  - -
  - -
  - -
  ---
  - 
;

: !!!!!!
  -- --
  -- -
  -- -
  -- --
  -
  --
  ---
  --
;

: !!!!!!
  ---
  --
  -
  -
  --
;

: !!!!!!
  --
  ---
;

: !!!-!!!
  --
  ---
;

: --
  --
  ---
  ---
;


Keuntungan lain menggunakan sintaksis bahasa Fort ketika menyusun kerangka umum proyek adalah kemampuan untuk segera mengkompilasi teks tertulis. Karena teks ini sendiri merupakan program. Pada prinsipnya, jika Anda menerapkan semua node fungsional yang hilang menggunakan bahasa Fort dan menambahkannya ke kerangka kerja di atas, Anda mendapatkan bot kebal yang sama yang sedang kami kerjakan. Ini akan menjadi sangat singkat. Namun, cuplikan kode di bawah ini akan ditulis dalam bahasa yang lebih tradisional - C ++ dan assembler. Presentasi "pinjaman yang dipinjam" dalam kasus ini menarik hanya untuk tujuan ilustrasi dari kerangka umum proyek. Jadi, “tenang dari umum ke tertentu” dilalui, sekarang kita akan mempertimbangkan secara lebih rinci rincian implementasi beberapa node fungsional bot.


Fotografi Tak Terlihat


Di sini kita memiliki tiga tugas mendasar: 1) menemukan solusi perangkat keras yang dapat diterima, 2) mengembangkan struktur data yang akan dibaca dari foto, 3) menerapkan fungsi pengenalan. Hasil dari fase memotret harus berupa struktur data yang lengkap dan redundan, yang didasarkan pada otomat logika yang secara unik dapat mengidentifikasi kondisi permainan saat ini - untuk jumlah pemotretan berurutan sekecil mungkin.

1. Adapun solusi perangkat keras, opsi ideal (dari sudut pandang ekonomi dan dari sudut pandang kemudahan pemrograman berikutnya) adalah bahwa semua sinyal video bertemu pada satu pembagi video, yang dapat dialihkan dari komputer. Dalam hal ini, tugas screener dapat dilakukan oleh satu komputer dengan satu kartu video capture. Untuk setiap mata-mata dan workstation dalam hal ini akan diperlukan untuk membuat satu folder - tangkapan layar yang sesuai akan disimpan di sana. Jika opsi ini tidak dapat diterapkan (karena tidak dapat diaksesnya peralatan yang sesuai dan / atau karena kualifikasi teknis yang tidak memadai untuk menyesuaikan peralatan yang ada dengan kebutuhan Anda sendiri), maka Anda dapat menggunakan beberapa komputer yang terhubung ke jaringan lokal,di masing-masing akan ada beberapa kartu video capture - satu untuk setiap "mata-mata" dan "workstation". Dalam hal ini, Anda harus menambahkan semua bitmap yang dipindai ke folder jaringan bersama, atau menulis di soket aplikasi client-server, yang akan mengumpulkan semua bitmap di satu tempat. Untuk mengunduh bitmap, untuk tujuan pengenalan selanjutnya, Anda dapat menggunakan kode berikut:
Unduh Bitmap
void LoadRamaFromFile(LPCSTR lpcszFileName, HDC *lphdcRama)
{
  HANDLE hBitmap = LoadImage(0, lpcszFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  *lphdcRama = CreateCompatibleDC(NULL); //    
  SelectObject(*lphdcRama, hBitmap);   //    
  DeleteObject(hBitmap);         //  
}


2. Adapun struktur data, dapat sebagai berikut:
Struktur data
// 
typedef enum ROUND
{
  RES_WAITINGBLINDS, //   ( )
  RES_FLOPHIDDEN,  //  ,      ()
  PREFLOP,      // 
  FLOP,       // 
  TURN,       // 
  RIVER,       // 
  UNKNOWN,      // 
  ZSTATE
} *LPROUND;

//                         //
typedef enum ACTION
{
  AC_POSTSB,   //   
  AC_POSTBB,   //   
  AC_POSTSBANDBB,
  AC_CHECK,    //    
  AC_BET,     //   
  AC_RAISE,    //   
  AC_CALL,    //   
  AC_FOLD,    //  
  AC_ALLIN,    //  
  AC_SITOUT,   //            
  AC_MUCK,    //   
  AC_SHOWCARDS,  //   
  AC_NONE,    //  ,     (  )
  AC_TNB,     //    ( )
  AC_ZSTATE
} *LPACTION;

//    
typedef struct tagSITA_UVACHA
{
  char  szNickname[STR_SIZE_NICKNAME];  // 
  char  szStack[STR_SIZE_STACK];     //  
  char  szHoleCards[STR_SIZE_HOLECARDS]; //     ( )
  ACTION  action;
} SITA_UVACHA, *LPSITA_UVACHA;

//    
typedef struct tagRAMA_UVACHA
{
  SITA_UVACHA  sita[MAX_COUNT_SITA];   //    
  DWORD  dwCountSita;           //    
  DWORD  dwBUPos;             //  
  char  szPOT[STR_SIZE_POT];       //  
  char  szBoardCards[STR_SIZE_HOLECARDS]; // ,    
  ROUND  round;              //  
} RAMA_UVACHA, *LPRAMA_UVACHA;

////////////////////////////

typedef struct tagKRISHNA_UVACHA
{
  RAMA_UVACHA  rama;
  DWORD    dwFirstSaid;    //      
  DWORD    dwLastSaid;     //      
  ACTION    last_action;    //     
} KRISHNA_UVACHA, *LPKRISHNA_UVACHA;


3. Salah satu opsi yang mungkin untuk fungsi pengenalan adalah mengkonfigurasi jaringan saraf untuk ini. Topik ini layak dibahas secara terpisah, oleh karena itu kami tidak akan berbicara tentang pendekatan jaringan saraf dalam artikel ini. Opsi yang lebih sederhana adalah melampirkan bitmap yang sesuai. Berikut ini struktur data yang sesuai:

Struktur Data Pengakuan
typedef struct tagSURJA_CRAPH_DATA
{
  BYTE  PATTERN_LETTER[COUNT_LETTERS][SIZE_PATTERN_LETTER];       //  
  BYTE  LETTER_CODE[COUNT_LETTERS];                   //  
  BYTE  LETTER_SIZE[COUNT_LETTERS];                   //  

  BYTE  PATTERN_INSCRIPT[COUNT_INSCRIPTIONS][SIZE_PATTERN_INSCRIPTION]; //   
  char  INSCRIPTION_TEXT[COUNT_INSCRIPTIONS][SIZE_INSCRIPTION_TEXT];  //  
  BYTE  PATTERN_CARD[COUNT_CARDS][SIZE_PATTERN_CARD];          //  
  char  CARD_TEXT[COUNT_CARDS][SIZE_CARD_TEXT];             //  
  BYTE  PATTERN_HOLEHIDDEN[COUNT_HOLEHIDDEN][SIZE_PATTERN_HOLEHIDDEN]; //    
  char  HOLEHIDDEN_TEXT[COUNT_HOLEHIDDEN][SIZE_HOLEHIDDEN_TEXT];    //     
} SURJA_CRAPH_DATA, *LPSURJA_GRAPH_DATA;


Cara termudah untuk mengisinya adalah manual. Cukup ambil tangkapan layar, buka di Photoshop, aktifkan alat pipet dan tulis ulang angka dari bidang yang menarik bagi kami. Keputusan ini tidak bisa disebut ringkas bahkan dengan bentangan besar. Selain itu, ia memiliki batasan yang signifikan - bahkan perubahan paling kecil dalam jadwal perangkat lunak poker akan menyebabkan bot berhenti bekerja. Namun, jika kualifikasi teknis tidak memungkinkan Anda untuk menghasilkan sesuatu yang lebih berharga, maka inilah persiapan untuk "pengenalan manual" seperti ini (di sini hanya ada sedikit pilihan dari kode hampir 2000 baris):
Pengakuan manual
BOOL LoadGraphData()
{
//=====================     ================
  memset(m_BramaGraphData.ptRamaCoords,  0,  sizeof(POINT)*COUNT_VARRIOUS_RAMA*COUNT_RAMA_VALUES);
  memset(m_BramaGraphData.ptSitaCoords,  0,  sizeof(POINT)*COUNT_VARRIOUS_RAMA*MAX_COUNT_SITA*COUNT_SITA_VALUES);
  memset(m_BramaGraphData.ptRecognizeSize,0,  sizeof(POINT)*COUNT_VAL_SIZE);
//=====================  9-  ===============
  m_BramaGraphData.ptRamaCoords[INDEX_RAMA_AT_9_SITA][INDEX_VAL_RAMA_POT].x  = 210;
  m_BramaGraphData.ptRamaCoords[INDEX_RAMA_AT_9_SITA][INDEX_VAL_RAMA_POT].y  = 34;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][0][INDEX_VAL_SITA_NICKNAME].x    = 340;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][0][INDEX_VAL_SITA_NICKNAME].y    = 44;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][1][INDEX_VAL_SITA_NICKNAME].x    = 423;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][1][INDEX_VAL_SITA_NICKNAME].y    = 77;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][2][INDEX_VAL_SITA_INSCRIPTION].x  = 438;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][2][INDEX_VAL_SITA_INSCRIPTION].y  = 165;
//=====================  10-  ==============
//=====================    ==================
  m_BramaGraphData.PATTERN_LETTER[PAT_0][0] = b01111000;
  m_BramaGraphData.PATTERN_LETTER[PAT_0][1] = b10000100;
  m_BramaGraphData.PATTERN_LETTER[PAT_8][2] = b10100100;
  m_BramaGraphData.PATTERN_LETTER[PAT_8][3] = b01011000;
  m_BramaGraphData.LETTER_CODE[PAT_0] = '0';
  m_BramaGraphData.LETTER_CODE[PAT_1] = '1';
  m_BramaGraphData.LETTER_CODE[PAT_2] = '2';
//=====================     ================
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][0]  = 55;
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][1]  = 56;
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][2]  = 124;
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][3]  = 215;
//=====================     ==================
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_SEATOPEN],  "SEATOPEN");
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_EMPTYSEAT],  "EMPTYSEAT");
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_CALL],    "CALL");
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_BET],      "BET");
//=====================    =======================
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_EMPTY][0] = 30;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_EMPTY][1] = 30;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_EMPTY][2] = 30;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_HIDE][6] = 188;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_HIDE][7] = 151;
//=====================    ==================
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_EMPTY],  "");
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_HIDE],  "hid");
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_2C],  "2C");
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_4H],  "4H");
//=====================     =================
//=====================      ===
  lstrcpy(m_BramaGraphData.HOLEHIDDEN_TEXT[PAT_HOLEHIDDEN_EMPTY],  "");
  lstrcpy(m_BramaGraphData.HOLEHIDDEN_TEXT[PAT_HOLEHIDDEN_ONE],  "one-hidden");
  lstrcpy(m_BramaGraphData.HOLEHIDDEN_TEXT[PAT_HOLEHIDDEN_TWO],  "hidden");
//=====================   ===========================
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][0] = 216;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][1] = 72;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][2] = 8;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][3] = 151;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][4] = 221;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][5] = 194;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][6] = 231;

  return TRUE;
}


Dan di sini adalah contoh kode yang menggunakan bitmap untuk pengakuan:
Contoh Kode Pengakuan
typedef struct tagSURJA_CRAPH_DATA
{
  BYTE  PATTERN_LETTER[COUNT_LETTERS][SIZE_PATTERN_LETTER];       //  
  BYTE  LETTER_CODE[COUNT_LETTERS];                   //  
  BYTE  LETTER_SIZE[COUNT_LETTERS];                   //  

  BYTE  PATTERN_INSCRIPT[COUNT_INSCRIPTIONS][SIZE_PATTERN_INSCRIPTION]; //   
  char  INSCRIPTION_TEXT[COUNT_INSCRIPTIONS][SIZE_INSCRIPTION_TEXT];  //  
  BYTE  PATTERN_CARD[COUNT_CARDS][SIZE_PATTERN_CARD];          //  
  char  CARD_TEXT[COUNT_CARDS][SIZE_CARD_TEXT];             //  
  BYTE  PATTERN_HOLEHIDDEN[COUNT_HOLEHIDDEN][SIZE_PATTERN_HOLEHIDDEN]; //    
  char  HOLEHIDDEN_TEXT[COUNT_HOLEHIDDEN][SIZE_HOLEHIDDEN_TEXT];    //     
} SURJA_CRAPH_DATA, *LPSURJA_GRAPH_DATA;



Dengan satu atau lain cara - walaupun kita menggunakan jaringan saraf, setidaknya dengan tangan kita, setidaknya dengan sesuatu yang ketiga - sebagai pengakuan, empat bidang yang secara fundamental berbeda harus diperhitungkan: 1) statis (yang mana, menurut teori, tidak pernah terjadi apa-apa); termasuk eksternal untuk perangkat lunak poker (misalnya, beberapa jenis tindakan muncul di luar klien poker, diduga dari sistem Windows, tetapi pada kenyataannya - memeriksa botabilitas); 2) dinamis sangat informatif (ukuran tumpukan, pemain saat ini, kartu di atas meja, dll.); 3) dinamis yang kurang informatif (tempat pesan jarang muncul dan mengobrol); 4) dinamis tidak informatif (misalnya, area di mana animasi distribusi kartu terjadi).


Analisis tak terlihat


Bagian analitis bot, dalam kasus poker, adalah mekanisme untuk berinteraksi dengan database - karena hampir semua "memberitahu" yang relevan dengan poker online bergantung pada analisis model perilaku lawan-lawan game. Pilihan ideal di sini adalah Oracle di rumah Anda sendiri, yang sangat diperlukan dalam pekerjaan intensif dengan database besar yang mencakup ratusan ribu catatan. Yaitu, akan ada begitu banyak dari mereka jika Anda berencana untuk terlibat dalam pertanian botani secara serius dan untuk waktu yang lama. Jika Anda hanya perlu bot untuk memanjakan diri, maka Anda tidak dapat menghabiskan uang untuk Oracle. MS Access DBMS juga sangat cocok - Anda dapat dengan mudah menghubunginya dari program Anda, misalnya melalui ODBC. Begini tampilannya:
Interaksi dengan MS Access
BOOL InitODBC()
{
  SQLRETURN    ret;
  SQLSMALLINT    Length;

  ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_HANDLE_NULL, &hEnv);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, NULL);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  lstrcpyn(szConnect, STR_CONNECT, MAXSIZE_CONNECTSTR);
  ret = SQLDriverConnect(hConn, NULL, (SQLTCHAR *) szConnect, lstrlen(szConnect), (SQLTCHAR *) szConnect, MAXSIZE_CONNECTSTR, &Length, SQL_DRIVER_COMPLETE);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  return TRUE;
}

void DoneODBC()
{
  SQLDisconnect(hConn);
  SQLFreeHandle(SQL_HANDLE_DBC, hConn);
  SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}



BOOL InsertInDB(LPCSTR lpcszText, LPCSTR lpcszTitle, DWORD dwLocale)
{
  SQLHANDLE  hStmt;
  SQLRETURN  ret;
  char    szTitle[SIZE_TITLE];
  char    szQuery[MAXSIZE_QUERYSTR];


  //          //
  ret = SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  wsprintf(szQuery, "INSERT INTO index (text, title, locale) VALUES ('%s', '%s', %d)", lpcszText, szTitle, dwLocale);

  ret = SQLExecDirect(hStmt, (SQLTCHAR *) szQuery, lstrlen(szQuery));

  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;
  SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

  return TRUE;
}


Jika ini bukan tentang poker, tetapi catur, misalnya, maka pertukaran dengan mesin catur pihak ketiga dapat diimplementasikan sebagai bagian analitis. Misalnya, inilah cara berinteraksi dengan Fritz:
Interaksi dengan mesin analitis
BOOL SendData2Fritz(char szFritz[100])
//    //
{
  if (!FritzStr2Clipboard(szFritz))
    return FALSE;
  SendMessage(m_hwndFritz, WM_COMMAND, MAKELONG(IDM_PASTE_POSITION, 0), 0); 
  Sleep(2);
  SendMessage(m_hwndFritz, WM_COMMAND, MAKELONG(IDM_MOVE_NOW, 0), 0); 

  return TRUE;
}


BOOL ReceiveDataFromFritz(int busy[8][8], LPBOOL lpbEndGame)
//     //
{
  char szFritz[100];

  *lpbEndGame = FALSE;

  SendMessage(m_hwndFritz, WM_COMMAND, MAKELONG(IDM_COPY_POSITION, 0), 0);
  if (!Clipboard2FritzStr(szFritz))
    return FALSE;
  return TRUE;
}

BOOL FritzStr2Clipboard(LPCSTR lpcszFritz)
//         //
{
  HGLOBAL hGlobalMemory;    //   
  LPVOID pGlobalMemory;     //   

  hGlobalMemory = GlobalAlloc(GHND, lstrlen(lpcszFritz)+1);
  if (hGlobalMemory == NULL)
    return FALSE;
  pGlobalMemory = GlobalLock(hGlobalMemory);
  lstrcpy((LPSTR) pGlobalMemory, lpcszFritz);
  GlobalUnlock(hGlobalMemory);

  if (!OpenClipboard(NULL))
    return FALSE;
  if (!EmptyClipboard())
    return FALSE;
  SetClipboardData(CF_TEXT, hGlobalMemory);
  CloseClipboard();

  return TRUE;
}

BOOL Clipboard2FritzStr(LPSTR lpszFritz)
//        //
{
  HANDLE hClipMemory;    //   
  LPVOID pClipMemory;    //     

  if (IsClipboardFormatAvailable(CF_TEXT))
  {
    if (!OpenClipboard(NULL))
      return FALSE;
    hClipMemory = GetClipboardData(CF_TEXT);
    if (hClipMemory == NULL)
      return FALSE;
    pClipMemory = GlobalLock(hClipMemory);
    lstrcpyn(lpszFritz, (LPSTR) pClipMemory, 100);
    GlobalUnlock(hClipMemory);
    CloseClipboard();
  }
  return TRUE;
}



Alat lain yang dapat berguna ketika pemrograman analitik disebut. "Mesin negara terbatas". Inilah cara mereka dapat digunakan dalam game multi-pemain online (ini adalah bagian dari bot untuk game "Keepers of Power"):
Contoh Mesin Negara
typedef enum AUTOMATA_BATLE
{
  //  
  AS_BATLE_BEGIN,
  AS_BATLE_END,
  AS_BATLE_ERROR,

  AS_BATLE_TEST2MOB,     // ,    
  AS_BATLE_WAIT2NICK,    //    
  AS_BATLE_WAIT2MOB,     //   
  AS_BATLE_PROCESS,     //   ,    
  AS_BATLE_CLICK2OK_1,    //  OK
  AS_BATLE_WAITCHANGE,    //   
  AS_BATLE_CLICK2MONEY,   //    ""
  AS_BATLE_TEST2DROP,    //     (  "")
  AS_BATLE_CLICK2DROP,    //    ""
  AS_BATLE_CLICK2CLOSE,   //    ""
  AS_BATLE_WAIT2DROP,    //     
  AS_BATLE_CLICK2TAKEALL,  //  " "
  AS_BATLE_WAIT2CONFIRM,   //  
  AS_BATLE_CLICK2OK_2,    //  
  AS_BATLE_WAIT2BACK,    //   
  AS_BATLE_CLICK2BACK,    //  ""
  AS_BATLE_WAIT2STARTWINDOW, //    
  AS_BATLE_WAIT2NEXT     //  30 
};



AUTOMATA_BATLE CAutomataBatle::GoStep(HDC hdc)
{
  char szMessage[255];

  switch (m_automata_batle)
  {
  //        //
  case AS_BATLE_BEGIN:
    m_automata_batle = AS_BATLE_WAIT2STARTWINDOW;
    SetWindowText(m_hwndControl, "  ");
    break;
  case AS_BATLE_WAIT2STARTWINDOW:
    if (IsStartPresent(hdc))
    {
      SetWindowText(m_hwndControl, " ");
      m_automata_batle = AS_BATLE_TEST2MOB;
    }
    break;
  case AS_BATLE_TEST2MOB:
    if (IsMechPresent(hdc))
      if (!ClickMenuItem(INDEX_GOBATLE))
        return AS_BATLE_ERROR;
    if (IsCellEmpty(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_END;
    }
    else
    {
      hwndBatle = NULL;
      EnumChildWindows(m_hwndMain, EnumWindowsProcBatle, NULL);

      if (NULL != hwndBatle)
      {
        SetWindowText(m_hwndControl, "  ");
        m_automata_batle = AS_BATLE_WAIT2NICK;
      }
    }
    break;
  case AS_BATLE_WAIT2NICK:
    if (IsNickPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_WAIT2MOB;
    }
    break;
  case AS_BATLE_WAIT2MOB:
    if (!IsNickOpEmpty(hdc))
    {
      SetWindowText(m_hwndControl, " ");
      m_automata_batle = AS_BATLE_PROCESS;
    }
    break;
  case AS_BATLE_PROCESS:
    if (!IsBatleEnd(hdc))
    {
      if (!ClickMenuItem2Window(hwndBatle, INDEX_STRIKE))
        return AS_BATLE_ERROR;
    }
    else
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_CLICK2OK_1;
    }
    break;
  case AS_BATLE_CLICK2OK_1:
    if (!ClickMenuItem2Window(hwndBatle, INDEX_OK2BATLEEND))
      return AS_BATLE_ERROR;
    SetWindowText(m_hwndControl, "  ");
    m_automata_batle = AS_BATLE_WAITCHANGE;
    break;
  case AS_BATLE_WAITCHANGE:
    if (IsChangePresent(hdc))
    {
      SetWindowText(m_hwndControl, " ");
      m_automata_batle = AS_BATLE_CLICK2MONEY;
    }
    break;
  case AS_BATLE_CLICK2MONEY:
    if (!ClickMenuItem(INDEX_MONEY))
      return AS_BATLE_ERROR;
      SetWindowText(m_hwndControl, " ");
    m_automata_batle = AS_BATLE_TEST2DROP;
    break;
  case AS_BATLE_TEST2DROP:
    if (IsButtonDropPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  \"\"");
      m_automata_batle = AS_BATLE_CLICK2DROP;
    }
    else if (IsButtonClosePresent(hdc))
    {
      SetWindowText(m_hwndControl, " ,   \"\"");
      m_automata_batle = AS_BATLE_CLICK2CLOSE;
    }
    break;
  case AS_BATLE_CLICK2DROP:
    if (IsButtonDropPresent(hdc))
    {
      if (!ClickMenuItem(INDEX_DROP))
        return AS_BATLE_ERROR;
    }
    else
    if (IsDropPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_WAIT2DROP;
    }
    else if (IsStartPresent(hdc))
      m_automata_batle = AS_BATLE_WAIT2STARTWINDOW;
    break;
  case AS_BATLE_CLICK2CLOSE:
    if (!ClickMenuItem(INDEX_CLOSE))
      return AS_BATLE_ERROR;
    if (IsStartPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_dwWait = 0;
      m_automata_batle = AS_BATLE_WAIT2NEXT;
    }
    break;
  case AS_BATLE_WAIT2DROP:
    if (IsDropPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_CLICK2TAKEALL;
    }
    break;
  case AS_BATLE_CLICK2TAKEALL:
    if (!ClickMenuItem(INDEX_TAKEALL))
      return AS_BATLE_ERROR;
    SetWindowText(m_hwndControl, "  ");
    m_automata_batle = AS_BATLE_WAIT2CONFIRM;
    break;
  case AS_BATLE_WAIT2CONFIRM:
    if (IsConfirmPresent(hdc))
    {
      SetWindowText(m_hwndControl, "");
      m_automata_batle = AS_BATLE_CLICK2OK_2;
    }
    break;
  case AS_BATLE_CLICK2OK_2:
    if (!ClickMenuItem(INDEX_OK2TAKEALL))
      return AS_BATLE_ERROR;
    if (!IsConfirmPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  \"\"");
      m_automata_batle = AS_BATLE_WAIT2BACK;
    }
    break;
  case AS_BATLE_WAIT2BACK:
    if (IsBackPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  \"\"");
      m_automata_batle = AS_BATLE_CLICK2BACK;
    }
    break;
  case AS_BATLE_CLICK2BACK:
    if (!ClickMenuItem(INDEX_BACK))
      return AS_BATLE_ERROR;
    if (IsStartPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_dwWait = 0;
      m_automata_batle = AS_BATLE_WAIT2NEXT;
    }
    break;
  case AS_BATLE_WAIT2NEXT:
    if (m_dwWait >= WAIT_2NEXTBATTLE)
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_WAIT2STARTWINDOW;
    }
    else
    {
      wsprintf(szMessage, "(%d  %d) ...", m_dwWait/2, WAIT_2NEXTBATTLE/2);
      SetWindowText(m_hwndControl, szMessage);
      m_dwWait++;
    }
    break;
  case AS_BATLE_END:
    m_automata_batle = AS_BATLE_BEGIN;
    break;
  }




Emulasi tak terlihat


Ada dua tahap - persiapan dan operasional. Baik yang satu maupun yang lain menyiratkan tidak hanya menulis program yang sesuai, tetapi juga bekerja dengan besi. Di sini Anda tidak dapat melakukan tanpa perendaman dalam mikrokontroler. Untungnya, tidak perlu menemukan kembali roda - ada solusi perangkat lunak dan perangkat keras yang siap pakai yang dapat dengan mudah ditemukan di Internet. Termasuk kode sumber program untuk mikrokontroler, yang dapat dengan mudah disesuaikan dengan kebutuhan Anda.

Sedangkan untuk tahap persiapan (merekam jam kerja dengan mouse dan keyboard), di sini, jika Anda mau, Anda dapat melakukannya tanpa gadget perangkat keras. Anda dapat menulis filter driver yang menangkap panggilan ke IOCTL_INTERNAL_I8042_HOOK_KEYBOARD. Sebagai dasar, Anda dapat mengambil program ctrl2cap, kode sumbernya tersedia di DDK. Namun, solusi ini tidak universal - lebih baik menggunakan sniffer perangkat keras.

Sedangkan untuk tahap operasional, pasti tidak ada cara untuk dilakukan tanpa gadget perangkat keras. Salah satu solusi yang mungkin dapat dilakukan adalah komunikasi dengan perangkat mikrokontroler (yang juga akan menjadi splitter dalam kombinasi) di satu sisi melalui RS-232, dan di sisi lain melalui karangan PS / 2. Untuk bekerja dengan RS-232, ada dua opsi - Anda bisa menggunakan alat Windows biasa dan menggunakan CreateFile / ReadFile / WriteFile untuk berkomunikasi dengan port RS-232, atau langsung melalui port I / O. Dalam kasus kedua, Anda harus menulis driver sederhana yang membuka akses ke port I / O, karena secara default di Windows akses ke mereka ditutup. Jauhkan dari dosa. Jika Anda masih berhasil mengakses port input / output, maka di sini adalah kode untuk bertukar data melalui RS-232:
Kode RS-232
#define dataport  0x02F8   //   COM2
#define irport   0x02F9   //       
#define manager   0x02FB   //  
#define statline  0x02FD   //  
#define upr1    0x00BB      
#define upr2    0x003B
#define freq    0x000C   //    (9600 )

DWORD OpenPort()
/*  COM- */
{
  __asm
  {
    mov  eax, upr1    //   0  1    
    mov  edx, manager
    out  dx, al

    mov  eax, freq    //    
    mov  edx, dataport
    out  dx, al     //       

    mov  al, ah
    mov  edx, irport
    out  dx, al     //       

    mov  eax, upr2
    mov  edx, manager
    out  dx, al

    mov  al, 0      //  
    mov  edx, irport
    out  dx, al
  }
}

DWORD WriteByte(BYTE data)
/*    COM- */
{
  __asm
  {
    mov  al, data    //    
    mov  edx, dataport
    out  dx, al     //     
waitout:
    mov  edx, statline
    in   al, dx     //   
    mov  ah, al
    and  al, 0x40    // ,    
    jz   waitout     //   – 
  }
} // void WriteByte

BOOL ReadByte(BYTE data)
/*    COM- */
{
  int cntWait = 0;

  __asm
  {
    mov  edx, statline
    xor  ecx, ecx
waitread:
    add  cntWait, 1
    cmp  cntWait, 0xFFFF
    jz   error
    in   al, dx     //   
    mov  bl, al     // ,   
    and  eax, 1
    jz   waitread    //    –  
    mov  edx, dataport  //   –   
    xor  eax, eax
    in   al, dx     //     
    mov  data, al
error:
  }
  if (cntWait != 0xFFFF)
    return TRUE;
  else
    return FALSE;
} // BYTE ReadByte


Jadi, mekanisme untuk mencegat dan mengemulasi sinyal keyboard dengan mouse dapat dipahami, tetap hanya untuk mengetahui cara membuat model perilaku yang dapat dipercaya dari sudut pandang biometrik dari aliran terus-menerus data keyboard dan mouse yang diterima dari sniffer. Selain itu, salah satu tugas paling menarik pada tahap ini adalah cara memindahkan mouse dari titik awal ke titik lainnya, yang secara khusus diatur.

Salah satu solusi yang mungkin mencakup dua elemen: 1) mengkonfigurasi jaringan saraf, 2) untuk menyesuaikan gerakan dan mengajar jaringan saraf untuk bekerja bersama dengan "screener". Dengan pendekatan ini, dimungkinkan untuk melatih jaringan saraf dengan keterlibatan manusia minimal. Algoritma pelatihan jaringan saraf dapat sebagai berikut:
  1. Kami memilih koordinat acak di mana mouse harus dipindahkan.
  2. Kami memberi mereka makan bersama dengan koordinat saat ini ke jaringan saraf.
  3. Kami melihat betapa jaringan saraf itu keliru.
  4. Kami menyesuaikan jaringan saraf.
  5. Ulangi 1-4 hingga menang. Mengingat data yang diterima dari sniffer perangkat keras, sehingga jaringan saraf tidak hanya secara akurat menggerakkan kursor mouse, tetapi juga melakukannya secara biometrik masuk akal.



Apa selanjutnya


Implementasi skema jaringan saraf ini, serta skema pengenalan layar jaringan saraf yang disebutkan di atas, adalah topik untuk diskusi terpisah yang berada di luar cakupan artikel ini. Dua tugas yang melampaui ruang lingkup artikel ini adalah "konsep rekayasa fundamental" yang "diselesaikan oleh insinyur menengah" untuk diselesaikan secara mandiri. Adapun "masalah pemrograman sepele", implementasi sebagian besar dari mereka juga tidak termasuk dalam artikel ini. 10 daftar yang tercantum dalam artikel hanyalah sebuah benih, yang dirancang untuk membantu menumbuhkan selera teknik.

Poin penting lainnya. Menggunakan artikel ini ketika mengembangkan bot Anda sendiri, Anda harus mengerti: ketika beberapa opsi alternatif (ideal dan beberapa kompromi) ditawarkan untuk mengimplementasikan node fungsional tertentu, pilihannya adalah retorika. Dipahami bahwa opsi ideal akan digunakan. Jika Anda melakukan kompromi, meskipun hanya satu, maka bot akan rentan terhadap serangan balik dari "sisi terang pasukan."


Kembalinya Jedi



Fig. 5. Kembalinya Jedi

Jadi, skema yang disebutkan di atas dari mengemudi bot kebal, yang dalam menghadapi "pejuang keadilan" - mengklaim sebagai kemenangan pamungkas dan tidak dapat dibatalkan. Namun, akan membosankan jika Jedi dari "sisi terang kekuasaan" tidak memiliki kesempatan untuk menentang apa pun kepada wanita bot itu. Selain itu, jika ini tidak mungkin, penulis - yang berusaha untuk mematuhi "sisi terang dari kekuatan" - tidak akan mempublikasikan skema ini. Selain itu, saya ingin percaya bahwa sebagian besar pembaca juga menganut "sisi terang dari kekuatan" dan minat mereka bukan pada penyalahgunaan skema ini, tetapi bagaimana menentangnya. Artikel ini tidak menyediakan kode sumber terperinci dan menghilangkan beberapa konsep rekayasa mendasar - tepatnya untuk menghindari penyalahgunaan.

Beberapa kata tentang bagaimana Anda dapat menolak skema produksi botani yang dijelaskan. Dia praktis kebal. Namun, kemungkinan teoretis dari penemuannya tetap ada. Fitur ini dikaitkan dengan pelacakan perilaku mouse yang tidak lazim yang dapat terpeleset, bahkan dalam kasus emulasi berkualitas tinggi. Faktanya adalah bahwa mouse membawa banyak "biometric memberitahu" di ekornya, - diekspresikan dalam bahasa poker. Dia paling dekat dengan orang itu. Gerakan otot sekecil apa pun yang disebabkan oleh perubahan latar belakang emosional - semua ini memengaruhi cara kita memegang mouse di tangan kita.

Dalam hal ini, penulis artikel memiliki studi bionik asli, di bawah judul kerja "Arsitektur Terpadu Homo Sapiens", yang mencakup deskripsi fisiologi dan jiwa seseorang - dalam model yang cocok untuk operasi TI. Berkat hasil positif dari penelitian ini, saya merasakan hak moral untuk mempublikasikan skema mengemudi bot yang “kebal”, karena "sisi terang kekuasaan" memiliki peluang untuk menang. Dari penelitian ini, antara lain, orang dapat memahami bagaimana penggunaan mouse kita, melalui antarmuka sumsum tulang belakang, terkait dengan aktivitas mental kita. Sampai batas tertentu, ini memungkinkan, secara kiasan, untuk membaca pikiran orang yang meletakkan tangannya di atas mouse. Dalam "pembacaan pikiran" inilah vektor kemungkinan serangan balik dari "para pejuang keadilan" terlihat.

T.O. pertempuran antara sisi gelap dan terang dari kekuatan berlanjut. Beberapa mencoba berpura-pura menjadi orang, sementara yang lain memantau perilaku tidak biasa dari mouse. Menciptakan emulator mouse virtuoso seperti membuat lightsaber Jedi. Dan untuk menemukan fakta emulasi virtuoso sama dengan memukul mundur pukulan pedang ini dengan lightsaber lain. Jadi siapa yang akan lebih kuat?


Kebangkitan kekuatan



Fig. 6. Kebangkitan kekuatan

Dengan satu atau lain cara, tidak peduli sisi mana yang kita ambil - untuk bot atau melawan mereka - kita perlu meningkatkan teknik memiliki lightsaber. Dalam artian mengembangkan otot dari kecerdikan dalam diri seseorang. Komponen utamanya adalah kemampuan untuk berkonsentrasi pada tugas, untuk "di sini dan sekarang." Pada dasarnya, kesempurnaan yoga ini adalah samadhi. Samadhi dalam bahasa Sansekerta berarti - konsentrasi penuh pada satu subjek. Konsentrasi penuh! Jika Anda mengambil sinar matahari dengan lensa, maka permukaan tempat Anda mengarahkannya dinyalakan. Demikian pula dalam bidang teknik. Semua energi yang kita miliki, kita harus berkonsentrasi sebagai lensa, dan menggunakannya dalam rekayasa. Tapi jangan gunakan energinya untuk merugikan, seperti anak-anak yang mengambil lensa dan mulai membakar semut. Energi kreatif harus digunakan untuk kebaikan.

# #

-, – , – IDE , , : «#define QUESTION bb || !bb». « – », . – 5000 , – , : , – « ». , «-», «-». , , , , . . , « », 1880- , , . – - ,apa yang dapat dibaca secara terperinci di halaman Srimad-Bhagavatam, yang bersesuaian dengan suara OM dengan cara yang hampir sama dengan bahasa pemrograman tingkat tinggi modern yang berhubungan dengan assembler (untuk lebih jelasnya lihat "Kode # kode" ).


Dasar konsentrasi adalah inti spiritual, untuk mengasah yang Anda dapat menggunakan gadget berteknologi tinggi sebagai "buku". Buku spiritual yang bagus, tentu saja. "Buku" adalah kata terakhir dalam teknologi: 1) dibuka dengan gerakan pergelangan tangan, 2) dilengkapi dengan layar bebas kedipan, 3) ia memiliki daya baterai yang kekal. Untuk penulis artikel, ini adalah Srimad-Bhagavatam (dilarang keras di zaman Soviet). Anda dapat membacanya di artikel “Misi Bhagavatam .

Selain itu, untuk konsentrasi, tidak peduli seberapa biasa, Anda perlu nada sehat dari tubuh dan jiwa. Ada banyak cara untuk meningkatkan nada. Untuk penulis artikel ini, misalnya, ini adalah diet vegetarian (masakan Veda), pakaian olahraga (kmc untuk bermain ski) dan meditasi mantra (pembacaan Hare Krsna, Hare Krsna, Krsna Krsna, Hare Hare / Hare Rama, Hare Rama, Rama Rama, Hare Hare). Anda dapat membaca tentang mantra ini dalam artikel "Prinsip Mantra Hare Krishna . " Anda dapat menggunakan pengalaman saya, atau menggunakan sesuatu dari pengalaman Anda sendiri. Dan semoga kekuatan datang bersama kita.

Source: https://habr.com/ru/post/id389433/


All Articles