Bir oyun için bot yazmak

19 May 2020
238
84
Merhaba,

browser tabanlı bir oyun için bot yazmaya başladım. siteye bağlandığımda cors poltikası gereki istekte bulunamıyorum, curl ile get veya post istekleri dahil. ayrıca giriş sayfasında arkaplanda gizli olarak çalışan hcaptcha mevcut, recaptcha değil "h"captcha. javascript ile trigger methoduyla kullanıcı taklidi veya elle doğrulama bile yapsanız, farklı bir sunucudan erişim sağladığım için, tüm istekleri daha yapmadan yok sayıyor. neyse doğrudan sunucuyla etkileşime geçtim bende, üst bilgi de doğrulama tokenlerini ve kendi kullandığı çeşitli anahtarlarla birlikte session bilgisini ileterek kalıcı olarak oturum elde ederek giriş yapmayı başardım.

bir noktada sorun yaşıyorum ama. oyun 2 ana dosyadan meydana geliyor, çalışan kısım php üzerine kurulu, istekleri yöneten ve arkaplanda çalışan hizmet ise javascript. bağlanılan oyun sunucuna göre 8080 portlu bir socket hizmetine istekte bulunuyor. örneğin enventer'ıma bakmak istedim;
öncesinde bir istek gönderiyor ve json olarak sonuç döndürüyor

JSON:
{
"inventory": {
"200_0": {
"player_id": "848935444",
"item_id": "200",
"instance_id": "0",
"item_key": "200_0",
"amount": "1",
"instance_data": null,
"new": "0"
},
"1001_0": {
"player_id": "848935444",
"item_id": "1001",
"instance_id": "0",
"item_key": "1001_0",
"amount": "1",
"instance_data": null,
"new": "0"
}
},
"data": {
"200_0": {
"item_id": 200,
"instance_id": 0,
"name": "Yeniden yerle\u015ftir",
"admin_name": "Yeniden yerle\u015ftir",
"image": "https:\/\/dstr.innogamescdn.com\/asset\/5a33db0f\/graphic\/items\/relocate.png",
"image_info": {
"hash": "e3653",
"width": 92,
"height": 92,
"has_retina": true,
"src": "items\/relocate.png"
},
"type": 2,
"category": 5,
"color": null,
"actions": [
{
"name": "Kullan",
"link": "javascript:Inventory.openItemDialog('%item_key%', 'choose_location')",
"allow_sitter": true
}
],
"links": [],
"tags": [
{
"type": "use_type",
"tag": 1
}
],
"descriptions": [
{
"text": "Mevcut k\u00f6y\u00fcn\u00fc yeni bir yere veya arkada\u015f\u0131n\u0131 yan\u0131na ta\u015f\u0131! Bu sadece tek k\u00f6y\u00fcn oldu\u011funda kullan\u0131labilir.",
"color": null,
"image": null
}
],
"new_count": "0"
},
"1001_0": {
"item_id": 1001,
"instance_id": 0,
"name": "Envanter ho\u015fgeldin paketi",
"admin_name": "Envanter ho\u015fgeldin paketi",
"image": "https:\/\/dstr.innogamescdn.com\/asset\/5a33db0f\/graphic\/items\/resources_percent.png",
"image_info": {
"hash": "a5ea1",
"width": 92,
"height": 92,
"has_retina": true,
"src": "items\/resources_percent.png"
},
"type": 2,
"category": 2,
"color": null,
"actions": [
{
"name": "Kullan",
"link": "javascript:Inventory.consumeItem('%item_key%')",
"allow_sitter": true
}
],
"links": [],
"tags": [
{
"type": "use_type",
"tag": 1
}
],
"descriptions": [
{
"text": "Envanterine ho\u015f geldin! Burada hediye edilebilir premium \u00f6zellikleri ve etkinlik bonuslar\u0131 gibi \u00f6\u011feleri bulabilirsin.",
"color": null,
"image": null
},
{
"text": "Depo kapasitesinin 10% kadar\u0131n\u0131 t\u00fcm k\u00f6ylerde kaynak olarak ekler.",
"color": null,
"image": null
}
],
"new_count": "0"
}
},
"expire": {
"200_0": [
"1631061497"
]
}
}

ardından sırasıyla 8080 portlu bir socket bağlantısı gerçekleştiriyor ve farklı isteklerde bulunuyor


Kod:
curl 'https://tr66.klanlar.org:8080/socket.io/?player_id=&village_id=27539&screen=inventory&EIO=3&transport=polling&t=NkwqhqM' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="92", "Opera";v="78"' \
  -H 'Accept: */*' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 OPR/78.0.4093.184' \
  -H 'Origin: https://tr66.klanlar.org' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Referer: https://tr66.klanlar.org/' \
  -H 'Accept-Language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'Cookie: cid=1826746381; locale=tr_TR; tr_auth=938e6209f8e5:dad3b2e1745cbd59c17e2c3020ded2f8b095d75d8bde7d8e27a45a83b0249aa7; sid=0%3Ad0b730fc253c599ffdbc5f906ef6bb20e8a78e65114610165426eb1836969868383ea2e9e1fde93bba1758bc6b7c6fd36ec4c9536462ddfcd4939772e68a1926; global_village_id=27539; websocket_available=true; io=pl7c9jdvJuIdddR4BaZu' \
  --compressed
sonuç:
JSON:
96:0{"sid":"QSMvZBp_GrQqUE-OBbar","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}2:40

2. istek ise

Kod:
curl 'https://tr66.klanlar.org:8080/socket.io/?player_id=&village_id=27539&screen=inventory&EIO=3&transport=polling&t=Nkwqhu0&sid=QSMvZBp_GrQqUE-OBbar' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="92", "Opera";v="78"' \
  -H 'Accept: */*' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 OPR/78.0.4093.184' \
  -H 'Content-type: text/plain;charset=UTF-8' \
  -H 'Origin: https://tr66.klanlar.org' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Referer: https://tr66.klanlar.org/' \
  -H 'Accept-Language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'Cookie: cid=1826746381; locale=tr_TR; tr_auth=938e6209f8e5:dad3b2e1745cbd59c17e2c3020ded2f8b095d75d8bde7d8e27a45a83b0249aa7; sid=0%3Ad0b730fc253c599ffdbc5f906ef6bb20e8a78e65114610165426eb1836969868383ea2e9e1fde93bba1758bc6b7c6fd36ec4c9536462ddfcd4939772e68a1926; global_village_id=27539; websocket_available=true; io=QSMvZBp_GrQqUE-OBbar' \
  --data-raw '53:40/game?player_id=&village_id=27539&screen=inventory,' \
  --compressed
sonuç:
JSON:
ok

Kod:
curl 'https://tr66.klanlar.org:8080/socket.io/?player_id=&village_id=27539&screen=inventory&EIO=3&transport=polling&t=Nkwqhu6&sid=QSMvZBp_GrQqUE-OBbar' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="92", "Opera";v="78"' \
  -H 'Accept: */*' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 OPR/78.0.4093.184' \
  -H 'Origin: https://tr66.klanlar.org' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Referer: https://tr66.klanlar.org/' \
  -H 'Accept-Language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'Cookie: cid=1826746381; locale=tr_TR; tr_auth=938e6209f8e5:dad3b2e1745cbd59c17e2c3020ded2f8b095d75d8bde7d8e27a45a83b0249aa7; sid=0%3Ad0b730fc253c599ffdbc5f906ef6bb20e8a78e65114610165426eb1836969868383ea2e9e1fde93bba1758bc6b7c6fd36ec4c9536462ddfcd4939772e68a1926; global_village_id=27539; websocket_available=true; io=QSMvZBp_GrQqUE-OBbar' \
  --compressed
sonuç:

JSON:
8:40/game,28:42/game,["chat/contacts", {}]
0: "chat/contacts"
1: {}

son olarak

Kod:
curl 'https://tr66.klanlar.org:8080/socket.io/?player_id=&village_id=27539&screen=inventory&EIO=3&transport=polling&t=NkwqhwE&sid=QSMvZBp_GrQqUE-OBbar' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="92", "Opera";v="78"' \
  -H 'Accept: */*' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 OPR/78.0.4093.184' \
  -H 'Origin: https://tr66.klanlar.org' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Referer: https://tr66.klanlar.org/' \
  -H 'Accept-Language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'Cookie: cid=1826746381; locale=tr_TR; tr_auth=938e6209f8e5:dad3b2e1745cbd59c17e2c3020ded2f8b095d75d8bde7d8e27a45a83b0249aa7; sid=0%3Ad0b730fc253c599ffdbc5f906ef6bb20e8a78e65114610165426eb1836969868383ea2e9e1fde93bba1758bc6b7c6fd36ec4c9536462ddfcd4939772e68a1926; global_village_id=27539; websocket_available=true; io=QSMvZBp_GrQqUE-OBbar' \
  --compressed
sonuç: 1:6

oyun motor niteliğinde javascript dosyasıda aşağıda, parametreleri ve istekleri otomatik olarak anlık kendisi oluşturuyor.


socket'e yapılan ilk istekte diğer bağlantılar için gerekli olan sid değerini alıyoruz önce arkasından gerisi geliyorda... bütün trafiği bir yerden sonra game.js dosyası yönetiyor. obusfactor işlemi yapılmamış kodlara gerçi, ama ihtiyaçta yok düzenleyenin bile belli bir noktadan sonra kafası dağılır yani. bu da çok önemli değil gerçi. mantığı ve işleyişi belli bir noktaya kadar kafamda tasarladım, ara istekler ile yanıtları geçerli hale getirebilirim. bir nevi istemci ve port arasında istekleri takip edip işleyecek bir kontrolcü yazabilirim. buraya kadar da sorun yok. ama game.js dosyasındaki istekleri takip edemiyorum. bu dosya içerisinde yapılan post ve get isteklerini takip edebileceğim bir yöntem düşünebilen var mı? game.js'yi düzenlemek istemiyorum.
 

Starzz

Üye
21 Haz 2015
238
58
Öncelikle tebrik ederim çok güzel düşünmüşsün. Gelelim soruya.

game.js dosyasına gelen istekleri (get,post,put vb) okuyabileceğimizi zannetmiyorum. Buraya gelen istekleri ayrıştırmak ve okumak için araya girip dinlemek gerek ama problem şurada, bu istekleri hangi cihazdan yapıyorlar. Yani araya girip dinlemem için okunan değil okuyan cihaza ihtiyacım var. Kısacası kaynak cihaza ihtiyacım var. Belki bir yolu vardır ancak bilmiyorum.

Aklıma basit bir yöntem geldi. O da senin istediğin gibi değil de, game.js dosyasını bir interval ile sürekli kontrol edip, string olarak yapılan değişikliği göstermek. Yani game.js dosyasında "console.log(event)" yazıyordu ancak daha sonra "console.log(eventListener)"'a çevirdiler. Bunu görebiliriz.

Örnek;
JavaScript:
function watchField(fieldId, callback) {
    var previousVal = null;

    return setInterval(function() {

        var field = document.getElementById(fieldId); //game js id
        var newValue = field.value;

        if(previousVal !== null && previousVal != newValue) {
            callback(fieldId, newValue, previousVal);
        }
        previousVal = newValue;

    }, 2000); // 2 saniyede bir işlem yap
};

var cancelListeneId = watchField("myField", function(field, newValue, previousValue) {
    console.log(newValue, previousValue);
});

// dinlemeyi iptal etmek için
// clearInterval(cancelListenerId);
 
19 May 2020
238
84
Öncelikle tebrik ederim çok güzel düşünmüşsün. Gelelim soruya.

game.js dosyasına gelen istekleri (get,post,put vb) okuyabileceğimizi zannetmiyorum. Buraya gelen istekleri ayrıştırmak ve okumak için araya girip dinlemek gerek ama problem şurada, bu istekleri hangi cihazdan yapıyorlar. Yani araya girip dinlemem için okunan değil okuyan cihaza ihtiyacım var. Kısacası kaynak cihaza ihtiyacım var. Belki bir yolu vardır ancak bilmiyorum.

Aklıma basit bir yöntem geldi. O da senin istediğin gibi değil de, game.js dosyasını bir interval ile sürekli kontrol edip, string olarak yapılan değişikliği göstermek. Yani game.js dosyasında "console.log(event)" yazıyordu ancak daha sonra "console.log(eventListener)"'a çevirdiler. Bunu görebiliriz.

Örnek;
JavaScript:
function watchField(fieldId, callback) {
    var previousVal = null;

    return setInterval(function() {

        var field = document.getElementById(fieldId); //game js id
        var newValue = field.value;

        if(previousVal !== null && previousVal != newValue) {
            callback(fieldId, newValue, previousVal);
        }
        previousVal = newValue;

    }, 2000); // 2 saniyede bir işlem yap
};

var cancelListeneId = watchField("myField", function(field, newValue, previousValue) {
    console.log(newValue, previousValue);
});

// dinlemeyi iptal etmek için
// clearInterval(cancelListenerId);
cevabın için teşekkür ederim, ama yaklaşımın çözümden uzak ayrıca okuyan cihaza erişim sağlandığında konu bot değil "kendi kendini oynayan bir oyun yazıyorum" olurdu. o zaman bot olmazdı yani bu : ) galiba socket'e iletilecek tüm istekleri önce bir php dosyasına yönlendirip parametreleri ayrıştırarak işlem için geçerli olan header içeriğini ekstra bir oturum ile ileterek, daha sonrasında ana bağlantıdan yanıtlanıyormuş gibi dönen değerleri yanıt olarak gösterebilirim. jquery ile birkaç doğru düzenleme bunu çözecektir sanırım. sonuç alırsam konuyu çözüldü olarak düzenlerim. bakalım istekleri kendi isteğim bağlantıya nasıl yönlendireceğim.
 
19 May 2020
238
84
evet bir süre uzak kalıp kafayı dinledikten sonra, game.js dosyasını didik didik edip host değerini dosyanın içerisinden almadığını fark ettim. daha sonrasında gerekli dosyaya erişip portu kaldırarak ve adresi değiştirerek bütün isteklerin yönetimini ele aldım : ) çözüldü

JavaScript:
Connection.connect('localhost', '', true)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.