协议分析

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 SettingscombaApplication Dataduowanyy4.0C__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地址
   代理端口
   代理用户名称
   代理密码
}

原文地址:https://www.cnblogs.com/zeroone/p/8490623.html