找回密码
 register

QQ登录

只需一步,快速开始

查看: 93|回复: 1

[游戏攻略] IDA反汇编 暗器重洗伪代码转C++代码记录 服务器用生成随机暗器技能

[复制链接]

[游戏攻略] IDA反汇编 暗器重洗伪代码转C++代码记录 服务器用生成随机暗器技能

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:151
  • 打卡月天数:24
  • 打卡总奖励:150
  • 最近打卡:2025-03-31 11:59:12
Waylee

主题

0

回帖

1万

积分

仙帝

积分
18922
Waylee 2025-3-1 22:30 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

文章性质:学习纯笔记

引擎代码无法独立使用

IDA9生成的伪代码:

// positive sp value has been detected, the output may be wrong!
BOOL __cdecl Item::AdjustDarkSkill(Item *const this)
{
  BOOL IsDark; // eax
  BOOL v2; // edx
  _ITEM *m_pItem; // eax
  unsigned int m_Level; // ecx
  int v6; // ebx
  int v7; // ecx
  INT v8; // ebx
  int v9; // edx
  char *v10; // eax
  BOOL IsEquip; // eax
  unsigned __int8 v12; // dl
  _ITEM *v13; // eax
  EQUIP_TB *EquipTB; // ebx
  UINT m_ReqLevel; // esi
  int v16; // eax
  int j; // edx
  int v18; // esi
  int v19; // ecx
  _DARK_SKILL_STRUCT *v20; // edx
  int v21; // eax
  int v22; // [esp+14h] [ebp-90h]
  unsigned int v23; // [esp+20h] [ebp-84h]
  int v24; // [esp+24h] [ebp-80h]
  INT v25; // [esp+38h] [ebp-6Ch]
  float v26; // [esp+3Ch] [ebp-68h]
  INT i; // [esp+40h] [ebp-64h]
  _DARK_SKILL_STRUCT sDarkSkillTmp; // [esp+4Ch] [ebp-58h] BYREF

  // 是否是暗器
  IsDark = Item::IsDark(this);
  v2 = 0;
  if ( !IsDark )
    return v2;
  if ( Item::IsDark(this) )
  {
    m_pItem = this->m_pItem;
    if ( m_pItem )
    {
      m_Level = m_pItem->m_DarksInfo.m_Level;
      goto LABEL_6;
    }
  }
  // 是否是装备
  IsEquip = Item::IsEquip(this);
  v12 = -1;
  if ( !IsEquip )
    goto LABEL_22;
  v13 = this->m_pItem;
  if ( !v13 )
    __assert__("./Item/Item.inl", 0x21u, "UINT Item::GetItemTableIndex() const", "m_pItem");
  EquipTB = ItemTable::GetEquipTB(&g_ItemTable, v13->m_ItemIndex);
  if ( EquipTB )
  {
    if ( Item::IsDark(this) )
    {
      m_ReqLevel = EquipTB->m_ReqLevel;
      if ( m_ReqLevel <= Item::GetDarkLevel(this) )
      {
        m_Level = (unsigned __int8)Item::GetDarkLevel(this);
        goto LABEL_6;
      }
    }
    v12 = EquipTB->m_ReqLevel;
LABEL_22:
    m_Level = v12;
    goto LABEL_6;
  }
  m_Level = 255;
LABEL_6:
  v2 = 0;
  if ( m_Level - 40 <= 0x78 )
  {
    i = 0;
    v23 = m_Level / 0xA;
    do
    {
      if ( Item::GetDarkSkillId(this, i) > 0 )
      {
        v6 = g_DarkSkillStudyTbl.m_DarkRateBase[i];
        v26 = (float)v6;
        v22 = (int)((long double)rand() * 4.6566129e-10 * v26);
        if ( v22 == v6 )
          --v22;
        v7 = 0;
        v8 = 0;
        if ( g_DarkSkillStudyTbl.m_Count > 0 )
        {
          v9 = 0;
          while ( 1 )
          {
            v10 = (char *)&g_DarkSkillStudyTbl.m_Table->m_Index + 4 * i + v9;
            v7 += *((_DWORD *)v10 + 4);
            if ( v22 <= v7 )
              break;
            ++v8;
            v9 += 28;
            if ( g_DarkSkillStudyTbl.m_Count <= v8 )
              goto LABEL_15;
          }
          v16 = *((_DWORD *)v10 + 1);
          for ( j = 0; j <= 15; ++j )
            sDarkSkillTmp.m_SkillIdOnLevel[j] = 0;
          if ( g_DarkSkillTbl.m_Table )
          {
            v25 = 0;
            if ( g_DarkSkillTbl.m_Count > 0 )
            {
              v24 = 0;
              v18 = 0;
              while ( 2 )
              {
                v19 = 0;
                v20 = &g_DarkSkillTbl.m_Table[v18];
                do
                {
                  if ( v20->m_SkillIdOnLevel[0] == v16 )
                  {
                    qmemcpy(&sDarkSkillTmp, &g_DarkSkillTbl.m_Table[v24], sizeof(sDarkSkillTmp));
                    goto LABEL_35;
                  }
                  ++v19;
                  v20 = (_DARK_SKILL_STRUCT *)((char *)v20 + 4);
                }
                while ( v19 <= 15 );
                ++v25;
                ++v18;
                ++v24;
                if ( g_DarkSkillTbl.m_Count > v25 )
                  continue;
                break;
              }
            }
          }
LABEL_35:
          v21 = v23 - 1;
          if ( (int)(v23 - 1) < 0 )
          {
            v21 = 0;
          }
          else if ( v21 > 15 )
          {
            v21 = 15;
          }
          Item::SetDarkSkillId(this, i, sDarkSkillTmp.m_SkillIdOnLevel[v21]);
        }
      }
LABEL_15:
      ++i;
    }
    while ( i <= 2 );
    return 1;
  }
  return v2;
}

转换为C++代码
初步测试可运行,未校验错误、没有对代码进行任何优化,保持IDA结构,仅仅排查了错误
***付费内容***

付费看帖
剩余 54% 内容需要支付 200.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
  • 打卡等级:热心大叔
  • 打卡总天数:151
  • 打卡月天数:24
  • 打卡总奖励:150
  • 最近打卡:2025-03-31 11:59:12
楼主
Waylee 楼主

主题

0

回帖

1万

积分

仙帝

积分
18922
Waylee 2025-3-2 10:18 | 显示全部楼层 | Google Chrome | Windows 10
***付费内容***
付费看帖
剩余 100% 内容需要支付 260.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-4-1 05:35 , Processed in 0.190675 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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