Показать сообщение отдельно
Старый 29.08.2013, 22:13   #6
Astromancer
Новичок
 
Регистрация: 28.05.2012
Сообщений: 10
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Astromancer На верном пути
По умолчанию

Цитата:
Сообщение от 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;
}
Вот мне, как человеку далекому от всего этого(ассемблер то знаю, но вот с реверсингом никогда не приходилось иметь дело) интересно, как вы определяете через эти сабы, где какая функция. Интуитивно чтоль?
Astromancer вне форума   Ответить с цитированием