Показать сообщение отдельно
Старый 11.03.2013, 18:15   #3
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Сори, на работе сидел и колупал без IDA, исходя из текста
для полноты картины, вот функция чтения pagetextcache
Код:
int __thiscall sub_7ACBD0(void *this, int a2, int a3)
{
  void *v3; // esi@1
  int v4; // eax@1
  int v5; // ST04_4@1
  int v6; // eax@1
  int v7; // ebx@1
  int result; // eax@1
  int v9; // [sp+10h] [bp-4h]@1

  v3 = this;
  v9 = 0;
  CDataStore::GetInt32(&v9);
  *(_DWORD *)v3 = v9;
  a2 = 0;
  CDataStore::GetInt32(&a2);
  v4 = a2;
  LOBYTE(a2) = 0;
  v5 = a2;
  *((_DWORD *)v3 + 1) = v4;
  LOWORD(v9) = 2048;
  v6 = sub_744280(v5);
  v7 = v6;
  *((_DWORD *)v3 + 2) = v6;
  result = sub_410310((char *)v3 + 8, v6);
  *((_BYTE *)v3 + v7 + 8) = 0;
  return result;
}
а уже из нее вызывается функция получения длины строки:
Код:
int __thiscall sub_744280(int this, int a2)
{
  int v2; // edi@1
  char v3; // cl@1
  unsigned int v4; // eax@2
  unsigned int v5; // esi@3
  int v7; // [sp+Ah] [bp-6h]@0
  unsigned __int8 v8; // [sp+Eh] [bp-2h]@3
  unsigned __int8 v9; // [sp+Fh] [bp-1h]@2

  v2 = this;
  v3 = *(_BYTE *)(this + 5);
  if ( v3 == 8 )
  {
    v9 = 0;
    CDataStore::GetInt8(&v9);
    v4 = v9;
  }
  else
  {
    v5 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
    v8 = 0;
    CDataStore::GetInt8(&v8);
    v4 = (v5 << *(_BYTE *)(v2 + 5)) | ((unsigned int)v8 >> (8 - *(_BYTE *)(v2 + 5)));
    *(_BYTE *)(v2 + 4) = v8 << *(_BYTE *)(v2 + 5);
  }
  LOBYTE(v7) = 0;
  return 16 * v4 | sub_725A90(v7);
}
а та в свою очередь содержит еще часть
Код:
unsigned int __thiscall sub_725A90(int this, int a2)
{
  int v2; // esi@1
  unsigned __int8 v3; // cl@1
  unsigned __int8 v4; // dl@2
  unsigned int result; // eax@2
  unsigned int v6; // edi@5
  unsigned __int8 v7; // bl@5
  char v8; // dl@5
  unsigned int v9; // eax@5
  char v10; // cl@5
  unsigned __int8 v11; // [sp+7h] [bp-1h]@3

  v2 = this;
  v3 = *(_BYTE *)(this + 5);
  if ( v3 > 4u )
  {
    v11 = 0;
    if ( v3 == 8 )
    {
      CDataStore::GetInt8(&v11);
      result = (unsigned int)v11 >> 4;
      *(_BYTE *)(v2 + 4) = 16 * v11;
      *(_BYTE *)(v2 + 5) = 4;
    }
    else
    {
      v6 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
      CDataStore::GetInt8(&v11);
      v7 = v11;
      v8 = *(_BYTE *)(v2 + 5) - 4;
      v9 = (unsigned int)v11 >> (8 - v8);
      v10 = *(_BYTE *)(v2 + 5) - 4;
      *(_BYTE *)(v2 + 5) = v8;
      result = (v6 << v10) | v9;
      *(_BYTE *)(v2 + 4) = v7 << v10;
    }
  }
  else
  {
    v4 = *(_BYTE *)(v2 + 4);
    result = (unsigned int)v4 >> 4;
    *(_BYTE *)(v2 + 4) = 16 * v4;
    *(_BYTE *)(v2 + 5) = v3 + 4;
  }
  return result;
}
__________________
Konctantin вне форума   Ответить с цитированием