Sunday, August 25, 2013


kolebot interclient mantığı



[postlink]http://net4story.blogspot.com/2013/08/kolebot-interclient-mantg.html[/postlink]ana mantık: bot yuklenince oyunun wndproc adresini değiştirip kendi özel fonk.una yönlendirir, bu özel fonk usko window'una gelen mesajları süzer ve gereklileri alıp işler. daha sonra mesajı geri orijinal wndproc'a yönlendirir.

interclient ise diğer usko pencerelerinin hepsinin hwnd'lerini alır, o pencerelere mesaj göndererek (sendnotifymessage api'si) işlem yapmalarını sağlar.

ilk olarak bot oyuna girince oyunun orijinal wndproc adresini sakladım:

GetWindowLongPtr api'si bi hwnd nin parametreye göre istenen özelliginin alınmasını saglıyor. wndproc adresini istedim:


Kod:
dwGameWndProc = (WNDPROC)GetWindowLongPtr(hGameHWND,GWLP_WNDPROC);
orijinali aldıktan sonra get yerine set kullanrak oyunun wndproc'unu kendi virtual fonksiyonuma (VirtualWndProc) yonlendirdim:

Kod:
SetWindowLongPtr(hGameHWND,GWLP_WNDPROC,(DWORD)&VirtualWndProc);
herhangi bir window'un wndproc u lresult olarak tanımlı oldugu icin kendi fonksiyonumun da tıpatıp aynısı olması lazım. dolayısıyla bu fonksiyon su sekilde tanımlı header'de:

Kod:
LRESULT CALLBACK VirtualWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
dolayısıyla artık usko'ya gelen tum window mesajları benim bu fonksiyonuma yonlenicek once ve işlem yapıcam. mantık aynen oyunun paketlerini süzdügümüz recv hook mantıgıdır.

bu noktadan sonra pencereye gelen mesajlar alınır. suzgec fonksiyona goz atalım.

Kod:
LRESULT CALLBACK VirtualWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 switch (uMsg)
 {
  case WM_KOLEBOT:
  {
   switch(wParam)
   {
    case 0: //bot baslat
    frmBot->btnstartClick(NULL);
    break;

    case 1: //bot durdur
    StopBot();
    break;
...
...

return CallWindowProcA((FARPROC)frmBot->dwGameWndProc,hwnd,uMsg,wParam,lParam);
fonksiyonun ana hatları böyleydi. WM_KOLEBOT tarafımdan tanımlanan bir window message id'dir. pencereye gelen mesajın diğer bir kolebottan gelip gelmediğini süzmek icin. bu da su sekilde tanımlıydı (not: 8095 lise numaramdır hic bir onemi yok) :

Kod:
#define WM_KOLEBOT 8095
fonksiyonda goreceginiz uzere pencereye gelen msj id'si 8095 ise kolebottan gelmistir. dolayısıyla isleme koyulur. wparam kontrol edilir. 0 -> bot baslat 1-> bot durdur.... gibi kendi belirledigim numaralara gore islem yaptırmısım. mesaj alma & isleme bu sekilde. sonunda ise return etmisim. tabiki CallWindowProcA api'sini kullanarak. (mesajla isim bittigi icin usko orijinal wndproc'a yönlendirdim. dwGameWndProc olarak saklamıstım en basta orijinal adresi.)

mesaj isleme böyle. simdi mesaj göndermeye örnek verelim:

mesela bir yerde söyle bir sey yapmısım:

Kod:
SendNotifyMessage(hWindowArray[0],WM_KOLEBOT,6,dwMyID);
hWinddowArray[0] burada acık olan diger usko clientlerinden birisinin hwnd'sidir. ilginc olan su ki mesajda bir de lparam olarak yani ek olarak kendi char id'sini gondermisim (dwMyID). ve 6. mesaj id si ile. ve tabiki wm_kolebot olarak. bakalım 6 ne anlama gelıyormus;

Kod:
    case 6: //takip
    if( lParam )
    { ...
gördügümüz gibi takipis. yani diğer clientlere kendisini takip etmesini söyleyen prosüdür. burada wm_kolebot ise wparam kontrol edilmis, 6 ise yani takip ise, lparam yani id alınmıs ve takibe baslanmıs. emir yerine getirilmis.

böyle biseydi iste zamanında ugrasmısım

0 yorum:

Post a Comment