VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 34958|回复: 13

[原创] gh0st源码分析

[复制链接]
001
05_avatar_middle
在线会员 发表于 2014-11-21 11:27:21 | 显示全部楼层 |阅读模式
本帖最后由 kissy286 于 2015-3-11 14:49 编辑

从论坛里面找到的一个gh0st源码 ,最近也在学习,就分析了一下。

下面是部分内容,不断更新中

数据接收
当新建立一个连接OnAccept()函数投递了一个 数据读取的异步IO。一旦客户端发送数据过来,iocp工作者线程就会 接收到 客户端发送过来的信息。
投递的写异步IO,调用OnClientReading接收数据 函数:
首先判断是否超时,超时那就移除客户端。
然后判断是否重新发送之前的命令。
对于投递异步读,每次接收数据之后都要投递一个异步读。不然完成端口不会给你接收数据。

将接收的数据保存在 缓冲区中 ,缓冲区之后再详细讲解。
根据数据包的结构,来判断是否接收到的数据是否完整。
如果数据包不完整,继续投递读,然后将数据保存到 缓冲区中 。
数据包的定义:
包头 + 整个包长度 + 原始数据长度+ 压缩后数据
当数据完全读取之后,将数据解压出来 ,还原成真正的信息。
通过m_pNotifyProc向主窗口发送消息完成信息。主窗口再通过消息类别处理消息。
bool CIOCPServer::OnClientReading(ClientContext* pContext, DWORD dwIoSize)
{
        CLock cs(CIOCPServer::m_cs, "OnClientReading");  //加锁,避免了多个线程一起读取数据
        try
        {
                //////////////////////////////////////////////////////////////////////////
                static DWORD nLastTick = GetTickCount();
                static DWORD nBytes = 0;
                nBytes += dwIoSize;
               
                if (GetTickCount() - nLastTick >= 1000)
                {
                        nLastTick = GetTickCount();
                        InterlockedExchange((LPLONG)&(m_nRecvKbps), nBytes);
                        nBytes = 0;
                }

                //////////////////////////////////////////////////////////////////////////

                if (dwIoSize == 0)
                {
                        RemoveStaleClient(pContext, FALSE);
                        return false;
                }

                if (dwIoSize == FLAG_SIZE && memcmp(pContext->m_byInBuffer, m_bPacketFlag, FLAG_SIZE) == 0)
                {
                        // 重新发送
                        Send(pContext, pContext->m_ResendWriteBuffer.GetBuffer(), pContext->m_ResendWriteBuffer.GetBufferLen());
                        // 必须再投递一个接收请求
                        PostRecv(pContext);
                        return true;
                }

                // Add the message to out message
                // Dont forget there could be a partial, 1, 1 or more + partial mesages
                pContext->m_CompressionBuffer.Write(pContext->m_byInBuffer,dwIoSize);  //接收数据dwIoSize字节
                       
                m_pNotifyProc((LPVOID) m_pFrame, pContext, NC_RECEIVE);                                //发送消息给主窗口 正在接收数据


                // Check real Data
                while (pContext->m_CompressionBuffer.GetBufferLen() > HDR_SIZE)
                {
                        BYTE bPacketFlag[FLAG_SIZE];
                        CopyMemory(bPacketFlag, pContext->m_CompressionBuffer.GetBuffer(), sizeof(bPacketFlag));

                        if (memcmp(m_bPacketFlag, bPacketFlag, sizeof(m_bPacketFlag)) != 0)
                                throw "bad buffer";

                        int nSize = 0;
                        CopyMemory(&nSize, pContext->m_CompressionBuffer.GetBuffer(FLAG_SIZE), sizeof(int));
                       
                        // Update Process Variable
                        pContext->m_nTransferProgress = pContext->m_CompressionBuffer.GetBufferLen() * 100 / nSize;

                        if (nSize && (pContext->m_CompressionBuffer.GetBufferLen()) >= nSize)
                        {
                                int nUnCompressLength = 0;
                                // Read off header
                                pContext->m_CompressionBuffer.Read((PBYTE) bPacketFlag, sizeof(bPacketFlag));

                                pContext->m_CompressionBuffer.Read((PBYTE) &nSize, sizeof(int));
                                pContext->m_CompressionBuffer.Read((PBYTE) &nUnCompressLength, sizeof(int));
                               
                                ////////////////////////////////////////////////////////
                                ////////////////////////////////////////////////////////
                                // SO you would process your data here
                                //
                                // I'm just going to post message so we can see the data
                                int        nCompressLength = nSize - HDR_SIZE;
                                PBYTE pData = new BYTE[nCompressLength];
                                PBYTE pDeCompressionData = new BYTE[nUnCompressLength];
                               
                                if (pData == NULL || pDeCompressionData == NULL)
                                        throw "bad Allocate";

                                pContext->m_CompressionBuffer.Read(pData, nCompressLength);

                                //////////////////////////////////////////////////////////////////////////
                                unsigned long        destLen = nUnCompressLength;
                                int        nRet = uncompress(pDeCompressionData, &destLen, pData, nCompressLength);
                                //////////////////////////////////////////////////////////////////////////
                                if (nRet == Z_OK)
                                {
                                        pContext->m_DeCompressionBuffer.ClearBuffer();
                                        pContext->m_DeCompressionBuffer.Write(pDeCompressionData, destLen);
                                        m_pNotifyProc((LPVOID) m_pFrame, pContext, NC_RECEIVE_COMPLETE);     //发送主窗口   消息接受完成信息,
                                }
                                else
                                {
                                        throw "bad buffer";
                                }

                                delete [] pData;
                                delete [] pDeCompressionData;
                                pContext->m_nMsgIn++;
                        }
                        else
                                break;
                }
                // Post to WSARecv Next
                PostRecv(pContext);
        }catch(...)
        {
                pContext->m_CompressionBuffer.ClearBuffer();
                // 要求重发,就发送0, 内核自动添加数包标志
                Send(pContext, NULL, 0);
                PostRecv(pContext);
        }

        return true;
}


到此,数据接收就分析完成了。

百度网盘地址,不定时更新

http://pan.baidu.com/s/1c0ldvrU



2013.pdf

262.08 KB, 下载次数: 41, 下载积分: 驿站币 -1





上一篇:招聘游戏编程人员
下一篇:c++学习之路(一) 老师的第一课
05_avatar_middle
ico_lz  楼主| 发表于 2014-11-21 16:10:42 | 显示全部楼层
本帖最后由 midle110 于 2014-11-21 16:41 编辑

http://pan.baidu.com/s/1c0ldvrU
51_avatar_middle
online_admins 发表于 2014-11-21 23:24:08 | 显示全部楼层
多谢楼主分享,也希望楼主不断的推出好的原创文章,发布到vc驿站,加精了!
05_avatar_middle
ico_lz  楼主| 发表于 2014-11-22 09:32:41 | 显示全部楼层
Syc 发表于 2014-11-21 23:24
多谢楼主分享,也希望楼主不断的推出好的原创文章,发布到vc驿站,加精了!

谢谢Syc , ghost会分析完的
80_avatar_middle
在线会员 发表于 2014-11-22 21:47:43 | 显示全部楼层
非常感谢楼主,分析超级棒
45_avatar_middle
在线会员 发表于 2015-4-5 03:30:39 | 显示全部楼层
从论坛里面找到的一个gh0st源码,地址多少
08_avatar_middle
在线会员 发表于 2015-6-2 11:13:29 | 显示全部楼层
gh0st源码分析
76_avatar_middle
在线会员 发表于 2015-8-1 20:18:51 | 显示全部楼层
不错哦,分析的很好,思路可以
95_avatar_middle
在线会员 发表于 2015-8-8 09:43:49 | 显示全部楼层
请问要想分析ghost,应该先学习哪些东西。
感觉你的分析之中好多没见过的名词
10_avatar_middle
在线会员 发表于 2015-8-22 13:49:56 | 显示全部楼层
gh0st...是那个木马吗?这都可以....厉害
05_avatar_middle
ico_lz  楼主| 发表于 2015-10-17 21:29:57 | 显示全部楼层
8970665 发表于 2015-4-5 03:30
从论坛里面找到的一个gh0st源码,地址多少

地址忘记了,当时随便找的一个
05_avatar_middle
ico_lz  楼主| 发表于 2015-10-17 21:30:58 | 显示全部楼层
Fathy 发表于 2015-8-8 09:43
请问要想分析ghost,应该先学习哪些东西。
感觉你的分析之中好多没见过的名词

可以看看 mfc,网络通信就差不多了。
网络通信可以看看  windows网络通信与程序设计,百度可以下载的
46_avatar_middle
在线会员 发表于 2016-2-20 12:31:11 | 显示全部楼层
多谢楼主分享,也希望楼主不断的推出好的原创文章,发布到vc驿站
21_avatar_middle
在线会员 发表于 2016-6-6 22:43:27 | 显示全部楼层
学习 学习 顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-1-21 06:24

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表