首页
社区
课程
招聘
[原创]YY登录协议流程解析
发表于: 2013-11-20 00:06 39334

[原创]YY登录协议流程解析

2013-11-20 00:06
39334

给大家分享一点福利,从某款脱机协议分析出来的协议数据包

1.YY客户端发送登录请求,通过随机发送给5个IP  RequestCode = 0x00001401

023FDCF8  4D 00 00 00 01 14 00 00  C8 00 00 00 50 00 30 60  M.......?..P.0`
023FDD08  FF FF FF FF 09 00 69 6E  69 67 68 74 65 6C 66 00  ..7777.
023FDD18  00 04 08 00 00 01 00 00  00 00 00 00 00 03 00 00  ................
023FDD28  00 0E 11 67 99 77 93 86  1B 77 93 86 25 03 00 00  ...g檞搯.w搯%...
023FDD38  00 3D 9E F4 A2 77 93 86  0C 75 19 9D 95

2  .当客户端的版本过低时, 服务器响应版本过期的消息包  , ReponseCode = 0x00001501
0547AFDC  20 00 00 00 01 15 00 00  C8 00 00 00 97 01 00 00   .......?..?..
0547AFEC  00 00 00 00 00 00 00 00  28 FD B0 53 00 B1 A0 FF  ........(S.睜

3 .当客户端的版本符合服务器的版本, 服务器返回给客户端I可用的IP和端口列表消息包  , ReponseCode = 0x00001501
IP和端口列表包
0549C00C  48 00 00 00 01 15 00 00  C8 00 00 00 C8 00 00 00  H.......?..?..
0549C01C  02 00 00 00 77 93 86 1B  03 0E A2 11 00 00 03 00  ....w搯...?....
0549C02C  00 00 91 1F 39 04 51 00  79 0E F1 36 AD 0E A2 11  ..?9.Q.y.???
0549C03C  00 00 03 00 00 00 91 1F  39 04 51 00 00 00 00 00  ......?9.Q.....
0549C04C  01 00 12 00 71 60 E8 D3  

4. YY客户端从获取到的IP和端口列表中,倒数第二IP和端口,建立TCP连接,建立成功以后,YY客户端发送给服务器端的消息
建立TCP连接以后,YY客户端发送给服务器的第一条信息为: 加密密钥. RequestCode = 0x1104。RSA生成的公钥对

4F 00 00 00 04 11 00 00 C8 00 40 00 CF 08 02 0E
96 AA F9 2C C7 22 B1 FB B2 29 77 FF 62 30 17 E9
51 8D AC 9B 0D CA 58 51 47 28 80 58 1A F3 C2 74
97 2D ED FE 20 6B 11 2C 0E BA 36 AD 66 F0 45 36
FB 13 94 F8 C6 7D EB 93 F5 AE EB E7 01 00 03

公钥对: 服务器接下来会发送给YY客户端的经过该公钥对加密的RC4输入密码
n = CF 08 02 0E 96 AA F9 2C C7 22 B1 FB B2 29 77 FF 62 30 17 E9 51 8D AC 9B 0D CA 58 51 47 28 80 58
      1A F3 C2 74 97 2D ED FE 20 6B 11 2C 0E BA 36 AD 66 F0 45 36 FB 13 94 F8 C6 7D EB 93 F5 AE EB E7
e = 03

5. 服务器发送给YY客户端RC4密码,利用4步骤发送给服务的公钥对对该RC4密码进行加密。 ReponseCode = 0x1204
经过RSA加密过的RC4密码: 40 00 1C D9 B7 41 B3 19 58 AB 67 1D 48 20  61 74 6F EC 01 04 66 97 B9 CC 19 28 BC D5 4F 09  E6 8C 71 D6 D5 70 63 AC
                                           5A B9 24 3A 78 80 FF 1B  F5 CB 26 96 D4 8A C5 7C A5 F0 13 1C E0 35 44 44  37 C6 38 F3

、*******************************************************************
要写这篇文章估计要耗很长的时间,下次我先写Socket 网络连接YY的设计
先大概说一下YY的登录管理

YY的登录socket管理公用库为 netio.dll
管理Socket的方式为windows 的 IOCP技术

没有建立握手连接之前,采取的是Rsa非对称加密,服务器会利用客户端发送的Rsa公钥 加密即将发送给客户端的Rc4伪流媒体密码,该密码是对称加密的,从这以后,客户端和服务器段的通信都采取Rc4加解密。所以要分析协议,只需要设置断点在解密后和加密前的函数。就可以了
这里是解密的地址


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
  • 1.jpg (19.32kb,90次下载)
收藏
免费 5
支持
分享
最新回复 (61)
雪    币: 353
活跃值: (516)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
















上传的附件:
2013-11-20 00:16
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
要不就不做,要做就做好(也可能是我视力不好)
顺便膜拜一下楼主的基本功
2013-11-20 00:42
0
雪    币: 353
活跃值: (516)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
排版好麻烦啊!
2013-11-20 01:02
0
雪    币: 353
活跃值: (516)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
YY 语音登录协议分析
摘要:本文档详细记录了YY语音登录按钮事件所触发的一系列调用和相应库文件函数的调用,并对函数和类结构进行重命名,以简便记忆该名称,更详细的内容请参考反汇编文件.
登录按钮事件: 用户在登录界面,填写用户名和密码,单击登录按钮则触发本事件
yymainframe.dll
1. 0x6253FA8A ,YYLoginWidget::on_loginButton_clicked(void)
1.1. 获取控件上输入,判断登录用户名和密码是否为空,为空则给出相应的提示,并退出本函数
1.2. 调用0x6250A673 AccountInfoManager::GetAccountInfo(class AccountInfo const &) 获取账户信息
1.3. 调用0x6253F521 YYLoginWidget::_loginWithAccountInfo(AccountInfo const &) 依据账户信息登录
2. 0x6253F521 YYLoginWidget::_loginWithAccountInfo(AccountInfo const &)
1.1. 调用 0x6252DF52 AccountInfo::GetUserName(QString const & )const  获取账户名称
1.2. 调用0x62513A13 QCoreApplication::isAccountLogined(class QString const &) 判断当前的账户是否依据登录
1.3. 调用 0x62513A1B QCoreApplication::isAccountStartLogin(class QString const &) 判断当前用户是否正在登录之中,
1.4. 调用 0x62513B63 QCoreApplication::makeAccountStartLogin(class QString const &) 通过调用DuiWinAPI::createMutex 创建互斥对象,标识当前用户正在登录
1.5. 调用 0x6250A39B  AccountInfo::GetImStatus(void)const  获取IM 状态  (我在线 =00,游戏中= 05,离开 = 04,忙碌=03,隐身=02)
1.6. 调用0x6252DF52 AccountInfo::GetPassword(QString &) 获取加密过的密码
1.7. 调用 0x6252DF52 AccountInfo::GetUserName(QString const & )const  获取账户名称
1.8. 调用0x6253CAD2 YYLoginWidget::passportLogin(QString & UserName,String password &, enum IM_STATUS) 带加密过的密码用户登录
3. 0x6253CAD2  YYLoginWidget::passportLogin(QString & UserName,String password &, enum IM_STATUS)  
1.1. 调用0x6371E52F,CPassportSingletonWrap::Reset(void) 登录重置 (bizcore.dll)
1.2. 调用0x6371E455 CPassportSingletonWrap::SetUserName(char * UserName) 设置登录名称 (bizcore.dll)
1.3. 调用0x6371E48F CPassportSingletonWrap::SetPassword(char * Password) 设置登录密码 (bizcore.dll)
1.4. 调用0x6371E4CB CPassportSingletonWrap::SetIMStatus(int IM_Status) 设置登录状态 ImStatus (bizcore.dll)
1.5. 调用 0x6371E4DF CPassportSingletonWrap::SetProductVersion( char * ProductVersion) 设置YY客户端版本号 “"6.0.0.1” (bizcore.dll)
1.6. 调用 0x6371E557 CPassportSingletonWrap::asyncLogin(void) 异步登录 (bizcore.dll)
4. 0x6371E557 CPassportSingletonWrap::asyncLogin(void)  bizcore.dll
1.1. 调用0x6371E0B0 CPassportSingletonWrap::validateRealPassport(void) 当CPassportWrap 还没有创建时,则创建该对象,当该对象已经被创建时,则直接返回1
1.2. 调用 0x637190EA CPassportWrap::asyncLogin(void) 异步登录
5. 0x637190EA CPassportWrap::asyncLogin(void) 异步登录
1.1. 调用0x6370C597 CAsyncBase::Start(CMasterObject &,CObject &,void ** functionCallBack,int field,CObject &)  创建异步对象,并执行异步对象的主函数
6. 0x6370C597 CAsyncBase::Start(CMasterObject &,CObject &,void ** functionCallBack,int field,CObject &)
1.1. 调用0x6370C487 CAsync * CreateCAsync(CAsync & async,void ** functionCallBack,int field,CObject &) 创建CAsync 异步对象,返回值为CAsync对象的地址,当为登录的事件时CObject ==  CPassportWrap 对象
1.2. 调用0x6370CDDB  sub_6370CDDB ,本函数把调用传给0x6370CB25 CBizDriverMT::doPostFnToBiz(void)
7. 0x6370CB25 CBizDriverMT::doPostFnToBiz(void)
1.1. 调用0x6370C216 CPostFnToBiz::CPostFnToBiz(int field1,CObject &,CBizDriverMT &,CAsync &,String,int field2,int field3) CPostFnToBiz 构造函数,当为登录消息时 CObject ==  CPassportWrap 对象
1.2. 调用0x6370C547 CPostFnToBiz::CopyCPostFnToBiz(CPostFnToBiz &) 拷贝函数
1.3. 把CPostFnToBiz对象赋值给 ThreadParamterInfo线程函数参数
1.4. 调用SetEvent 函数置为有信号hEvent
8. 0x6370CC03  CBizDriverMT::threadProc(void) 线程函数等待hEvent 事件句柄是否有消息,有消息则调用相应的处理方法
1.1. 调用0x6370BD72 WaitFnDeqOnBiz() 等待hEvent 是否有消息
1.2. 当消息是登录消息时,则调用0x63707439 CAsync::bizLogin(void),
1.3. bizLogin() 函数里面对 0x6371553B CPassportWrap::bizLogin(void)进行调用
9. 0x6371553B CPassportWrap::bizLogin(void)  
1.1. 调用0x63531CE9,CLoginImp::Login(string UserName,string password,int Normal,int field1,int field2,int IM_Status,int yyLangNameID)  实现登录, UserName 为用户名, password 为用户密码, Normal 不为Email 则Normal = 1, IM_Status 为登录状态, yyLangNameID 为YY客户端语言版本代码 (login.dll)
10. 0x63531CE9 CLoginImp::Login(string UserName,string password,int Normal,int field1,int field2,int IM_Status,int yyLangNameID)
1.1. 调用0x635318A8 CLoginImp::doLogin(string UserName,string password,int Normal,int field1,int field2,int IM_Status,int yyLangNameID) 实现登录
11. 0x635318A8 CLoginImp::doLogin(string UserName,string password,int Normal,int field1,int field2,int IM_Status,int yyLangNameID)  
1.1. 会在”C:\Documents and Settings\comba\Application Data\duowan\yy4.0\C__Program_Files_duowan_yy_” 文件夹创建运行记录
1.2. 调用protocol4.dll 库里面函数对发送的数据进行加密
1.3. 调用netio.dll 库的函数把加密过的数据发送到服务器,其中调用到系统API 为0x632017B2 WSASendTo  (netio.dl)l
发送的数据包
39 00 00 00 01 14 00 00 C8 00 00 00 10 00 00 60
FF FF FF FF 09 00 69 6E 69 67 68 74 65 6C 66 00
00 04 08 00 00 01 00 00 00 00 00 00 00 01 00 00
00 B6 76 01 44 00 00 00 00
12. 未完待续
Enum ImStatus
{
  我在线   Online   00
  游戏中    05
  离开        04
  忙碌        03
  隐身        01
}
AccountInfo
{
QString UserName  //0x4,登录用户名称
  QString Password  //0x8,加密过的用户密码
  Bool IsRememberPassword  //0x0C,一个字节大小, 是否记住密码标识,1为记住,0为不记住,
  Bool IsAutoLogin //0x0D,一个字节大小, 是否自动登录,1为自动登录,0为不自动登录
  ImStatus  Status  //0x10, 四个字节,用户状态
  int Field  //0x14, 四个字节
  int Field  //0x18, 四个字节
  QString Field2 //0x1C, 四个字节
  QString Field3 //0x20, 四个字节
  QString Field4  //0x24, 四个字节
  QString  Field5 //0x28, 四个字节
  Byte  Field6  //0x2C, 一个字节
}
YYLoginWidget
{
    DuiLineEdit   UserName_LineEdit  //0x24,账户名称输入框
    DuiLineEdit   Password_LineEdit  //0x28,密码输入框
    CheckBox   IsRememberPassword_CheckBox  //0x2C,是否记住密码的CheckBox按钮
    CheckBox    IsAutoLogin_CheckBox     //0x30,是否自动登录的CheckBox 按钮
    AccountInfoManager  *lpAccountInfoManager; //0x48, AccountInfoManager 对象
}
AccountInfoManager
{
    AccountInfo   *lpAccountInfo  //0x0C, AccountInfo 对象
}
YYWindowManager
{
   int  MutexObject   //0x0B8, 标识用户正在登录的互斥对象
}
CPassportSingletonWrap
{
     CPassportWrap * lpPassportWrap //0x584,CPassportWrap 对象
}
CPassportSingletonWrap 成员函数列表
{
   CPassportSingletonWrap::SetUserName( char * Password ) //偏移地址 0x14, 设置登录名称 0x0x6371E455  
   CPassportSingletonWrap::SetPassword(char * Password) //偏移地址 0x1C, 设置登录密码  0x6371E48F
   CPassportSingletonWrap::SetIMStatus(int IM_Status) //偏移地址 0x28, 设置登录状态 IM_STATUS 0x6371E4CB  
   CPassportSingletonWrap::SetProductVersion( char *  ProductVersion) //偏移地址 0x2C, 设置YY客户端版本号0x6371E4DF  
    CPassportSingletonWrap::Reset(void) //偏移地址 0x3C,  登录重置 0x6371E52F  
    CPassportSingletonWrap::asyncLogin(void)  //偏移地址 0x44,  异步登录 0x6371E557   
}
CPassportWrap 成员变量
{
   String UserName  //0x6F4,用户名称
  String Password  // 0x72C,登录密码
  String  ProductVersion  //0x748,YY客户端版本号
   int  ResetFlag  //0x7B8,四个字节,重置标记
  int  IM_Status //0x7BC,四个字节,登录状态IMStatus
}
CPassportWrap 函数数组列表
{
  CPassportWrap::SetUserName(char * Password)  //偏移地址 0x14, 设置登录名称 0x6370AFF0  
  CPassportWrap::SetPassword(char * Password) //偏移地址 0x1C, 设置登录密码 0x6370B01B   
  CPassportWrap::SetIMStatus(int IM_Status)   //偏移地址 0x28, 设置登录状态 IM_STATUS 0x6370B040  
  CPassportWrap ::SetProductVersion( char *  ProductVersion)   //偏移地址 0x2C, 设置YY客户端版本号 0x6370B04D  
  CPassportWrap::Reset(int value)   //偏移地址 0x3C,  登录重置,设置CPassportWrap对象偏移地址为0x7B8的内容 0x6370B07D
  CPassportWrap::asyncLogin(void)    //偏移地址 0x44,  异步登录 0x637190EA
  }
CAsync
{
  //size = 0x18
   HANDLE   CAsyncVirtualFunction   //0x0 ,四个字节,虚函数表
    int  RefNum  //0x4,引用计数
   CObject  *lpCObject //0x8, CObject 对象
   HANDLE   *functionCallBack  //0x10, 回调函数
   int  Field1 = 0x0    //0x14,
}
CPostFnToBiz
{
    int  RefNum   //0x0,计数器
   Byte   field1 = 0x1   //0x4,一个字节
   CObject   CObject   //0x8,四个字节
    CBizDriverMT CBizDriverMT //0xC,CBizDriverMT 对象
   CAsync  CAsync   //0x10,CAsync对象
string  title   //0x14, 当前调用的函数字符串 "CPassport::asyncLogin:350"
  int  field2 = 0x01   //0x18,
  int  field3 = 0x00   //0x1C,
}
NET_PROXY_INFO
{
   代理类型
   代理IP地址
   代理端口
   代理用户名称
   代理密码
}
2013-11-20 01:04
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2013-11-20 01:48
0
雪    币: 137
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark,
2013-11-20 02:16
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
楼主应该多放点登录协议出来
2013-11-20 02:38
0
雪    币: 268
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark
2013-11-20 03:33
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
10
感谢楼主
2013-11-20 08:32
0
雪    币: 421
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
收藏一下!
2013-11-20 08:47
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mark
2013-11-20 08:59
0
雪    币: 492
活跃值: (51)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
这个只是交互密钥过程,后面的登录会话过程才是复杂的.
2013-11-20 09:08
0
雪    币: 225
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
收藏,能放个完整版吗?
2013-11-20 09:10
0
雪    币: 253
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
估计是精华。。
2013-11-20 13:05
0
雪    币: 9708
活跃值: (2511)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
YY登录协议流程解析 收下慢慢看
2013-11-20 13:39
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这个又是神马情况.....
2013-11-20 13:40
0
雪    币: 47147
活跃值: (20465)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
18
感觉太乱,建议直接上传word版本上来。
2013-11-20 17:48
0
雪    币: 124
活跃值: (469)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
mark ..
2013-11-20 20:05
0
雪    币: 353
活跃值: (516)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
20
要写这篇文章估计要耗很长的时间,下次我先写Socket 网络连接YY的设计
先大概说一下YY的登录管理

YY的登录socket管理公用库为 netio.dll
管理Socket的方式为windows 的 IOCP技术

没有建立握手连接之前,采取的是Rsa非对称加密,服务器会利用客户端发送的Rsa公钥 加密即将发送给客户端的Rc4伪流媒体密码,该密码是对称加密的,从这以后,客户端和服务器段的通信都采取Rc4加解密。所以要分析协议,只需要设置断点在解密后和加密前的函数。就可以了
这里是解密的地址
上传的附件:
2013-11-20 22:39
0
雪    币: 225
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
完整的
2013-11-21 16:34
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
Mark!
2013-11-22 18:36
0
雪    币: 242
活跃值: (1664)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
23
公开讨论的不多,研究下。
2013-11-22 22:07
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
除了顶, 我还能说什么呢. 感谢分享!
2013-11-23 03:53
0
雪    币: 6
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
深奥,看不懂,完全雾水。。膜拜吧
2013-11-23 17:58
0
游客
登录 | 注册 方可回帖
返回
//