sniffer

Ces méthodes ont deux buts :

  • Possibilité d'envoyer au serveur du jeu un message de votre choix.

  • Possibilité de lire les messages reçus par le serveur et de les interpréter.

Exemple d'utilisation :

On va lancer ce script :

-- Charger le module JSON
JSONFile = script.folder().."\\JSON.lua"
JSON = (loadfile(JSONFile))()

-- Afficher les messages reçus et envoyés
function print_messages()
    while true do
        local messages = sniffer.messages()
        for _, msg in ipairs(messages) do
            if msg.received then
                console.print("[IN]  ["..msg.timestamp.."] "..msg.name.."\n"..msg.content, console.pink)
            else
                console.print("[OUT] ["..msg.timestamp.."] "..msg.name.."\n"..msg.content, console.cyan)
            end
        end
        global.delay(100)
    end
end

-- Start
function move()
    print_messages()
end

Ce script va nous afficher dans la console les messages échangés entre le client et le serveur du jeu.

Dans notre cas, nous avons envoyé dans le chat du jeu la phrase "Hello !".

Dans la console, on remarque l'envoi du message :

[16:09:09] [OUT] [1763392149499] jhp
{"fffs":{"fffc":[],"fffd":[],"fffe":{}},"ffft":"","fffu":"Hello !","fffv":0}
  • Le nom du message envoyé est : jhp

  • Le contenu du message envoyé est {"fffs":{"fffc":[],"fffd":[],"fffe":{}},"ffft":"","fffu":"Hello !","fffv":0}

Remarquez la présence de la phrase "Hello !" dans le contenu, maintenant, pour envoyer un message similaire au serveur du jeu, avec la phrase "blablabla" on fait comme ça :

sniffer.send('jhp', '{"fffs":{"fffc":[],"fffd":[],"fffe":{}},"ffft":"","fffu":"blablabla","fffv":0}')

Quand un joueur rentre dans la map, on remarque la réception du message :

[16:20:38] [IN]  [1763392838445] iiq
{"fbgt":[{"fhal":634655670566,"fham":{"fhae":{"fias":[80,5230,3391,5761,5762,3971,5764,5143],"fiat":0,"fiau":null,"fiav":[55],"fiaw":[31102310,46778825,64329260,83162348,98211174,114660908,117440512,145389890],"fiax":1,"fiay":[{"fgcy":0,"fgcz":{"fias":[],"fiat":0,"fiau":null,"fiav":[],"fiaw":[],"fiax":5994,"fiay":[]},"fgda":1,"fgdb":0,"fgdc":0}]},"fhaf":{"fgxe":null,"fgxf":null,"fgxg":0,"fgxh":false,"fgxi":null,"fgxj":null,"fgxk":{"fgvl":"Theodorus-Rex","fgvm":null,"fgvn":{"fguv":[11],"fguw":0,"fgux":null,"fguy":1,"fguz":[{"fgtz":null,"fgua":0,"fgub":false,"fguc":null,"fgud":null,"fgue":null,"fguf":null,"fgug":null,"fguh":null,"fgui":null,"fguj":{"fhvp":24640,"fhvq":"Les Papis Flinguer","fhvr":40,"fhvs":{"fhvj":null,"fhvk":{"fhcx":0,"fhcy":383,"fhcz":25,"fhda":11172162},"fhvl":null},"fhvt":0},"fguk":10},{"fgtz":null,"fgua":1,"fgub":true,"fguc":null,"fgud":null,"fgue":null,"fguf":null,"fgug":null,"fguh":null,"fgui":null,"fguj":null,"fguk":1}],"fgva":false,"fgvb":148594559,"fgvc":{"fifl":2,"fifm":null,"fifn":0,"fifo":0,"fifp":0,"fifq":200}},"fgvo":3},"fgxl":null,"fgxm":null,"fgxn":5},"fhag":null,"fhah":1},"fhan":null,"fhao":0,"fhap":{"ffui":0,"ffuj":0,"ffuk":0,"fful":false,"ffum":0,"ffun":false,"ffuo":490,"ffup":true}}],"fbgu":0}

Pour mieux comprendre la structure de ce JSON, copiez-collez le dans un outil comme https://jsonviewer.stack.hu/

Remarquez le nom du joueur et sa cellule.

Maintenant qu'on connait la structure, on peut passer à la lecture du message :

-- Charger le module JSON
JSONFile = script.folder().."\\JSON.lua"
JSON = (loadfile(JSONFile))()

-- Afficher les messages reçus et envoyés
function print_messages()
    while true do
        local messages = sniffer.messages()
        for _, msg in ipairs(messages) do
            if msg.received then
                if msg.name == "iiq" then
                    local obj = JSON:decode(msg.content)
                    if obj.fbgt[1].fham ~= nil and obj.fbgt[1].fham.fhaf ~= nil and obj.fbgt[1].fham.fhaf.fgxk ~= nil then
                        console.success("Le personnage "..obj.fbgt[1].fham.fhaf.fgxk.fgvl.." est apparut dans la cellule "..obj.fbgt[1].fhap.ffuo)
                    end
                end
            end
        end
        global.delay(100)
    end
end

-- Start
function move()
    print_messages()
end

Contraintes et difficultés

Comme vous l'avez remarqué, les noms des messages, ainsi que leurs contenus, sont obfusqués, cette obfusquation rend la tache très complexe, vous devez donc être familier avec le protocol du jeu pour pouvoir en profiter (remarquez les identifiants tel que les mapId, contextualId, GID, UID, questId, cellId, breedId, fightId, partyId, elementId ...).

Ankama fait des rotations de temps en temps, cela veut dire que les messages vont changer leurs noms, et les fields du contenu vont changer leurs noms et leurs ordres, et d'autres fields "mort" seront ajoutés ou supprimés, c'est à vous de maintenir vos scripts à jour.

Mis à jour