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:
orijinali aldıktan sonra get yerine set kullanrak oyunun wndproc'unu kendi virtual fonksiyonuma (VirtualWndProc) yonlendirdim:
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:
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.
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) :
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:
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;
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
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);
Kod:
SetWindowLongPtr(hGameHWND,GWLP_WNDPROC,(DWORD)&VirtualWndProc);
Kod:
LRESULT CALLBACK VirtualWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
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);
Kod:
#define WM_KOLEBOT 8095
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);
Kod:
case 6: //takip
if( lParam )
{ ...
böyle biseydi iste zamanında ugrasmısım
0 yorum:
Post a Comment