一起来编程吧 #1 直播型游戏平台的抓包

in #cn7 years ago

自从加入到程序员的大家庭,头发也白了,生活也不规律了,字也不会写了。当然文章也很少发,因为交流通过贴代码就完成咯 ^_^。

最近没怎么上 Steemit,就是因为 在敲代码~ 今天看到好多群里的朋友 @justyy @oflyhigh @tvb 都在发些编程的文章,实在忍不住也想来上一篇。

代码架构是很早之前的啦~ 最初针对的是流行的某个在线Flash直播扑克游戏网站,类型就不说了,在国内经常被弹框。

代码的目的是得到每局游戏的扑克数据,这当然用分析数据包最好实现。我在Windows 下是通过Hook NewNtDeviceIoControlFile 函数的方式获取网络数据的。

NTSTATUS WINAPI NewNtDeviceIoControlFile(
    HANDLE FileHandle,
    HANDLE Event OPTIONAL,
    PVOID ApcRoutine OPTIONAL,
    PVOID ApcContext OPTIONAL,
    PVOID IoStatusBlock,
    ULONG IoControlCode,
    PVOID InputBuffer OPTIONAL,
    ULONG InputBufferLength,
    PVOID OutputBuffer OPTIONAL,
    ULONG OutputBufferLength
    )
{
    //先调用原始函数,得到数据包
    NTSTATUS Status;
    Status = pNtDeviceIoControl(FileHandle, Event, ApcRoutine, ApcContext,
        IoStatusBlock, IoControlCode, InputBuffer, InputBufferLength,
        OutputBuffer, OutputBufferLength);
    if (!NT_SUCCESS(Status))
    {
        return Status;
    }

    //检查是否为TCP收发指令
    if (IoControlCode != AFD_RECV)
    {
        return Status;
    }

    __try
    {
        //从InputBuffer得到Buffer和Len
        PAFD_INFO AfdInfo = (PAFD_INFO)InputBuffer;

        if (IoControlCode == AFD_RECV)
        {
            for (int i = 0; i < AfdInfo->BufferCount; i++)
            {
               // 具体分析数据包
                TryParse((BYTE*)AfdInfo->BufferArray[i].buf, AfdInfo->BufferArray[i].len);
            }
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
    }

    return Status;
}

真正麻烦的, 反而是对数据包的解析,因为我不知道这些二进制数据的真实含义,得不断地猜测,验证,再猜测 ....

如果是通过Flash 封装的协议,大部分都是AMF3格式的,还可以看看文档慢慢分析,后来做的的一些游戏,大部分都是自定义协议,分析起来简直太痛苦。

我分享一个小经验(如果有缘人能看到的话),就是扑克类型的,由于扑克本身是4种花色,每种花色 13 张牌,很多扑克都是这样表示每一张牌的: 扑克花色 * 13 + 扑克点数。然后在每局的数据包里去找这几个数,一般都能很快找到~

如果还找不到,请期待下篇文章:通过图像识别扑克。文笔不好,请多见谅~

Sort:  

赞一个, 看起来好复杂。。FLASH?是那个已经灭绝的FLASH动画么?

快要灭绝了,Flash除了做动画,也可以用了做游戏的。

Congratulations @idd! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!