Вопрос Как достать полностью функцию из псевдокода?

Начинающий
Статус
Оффлайн
Регистрация
6 Мар 2020
Сообщения
59
Реакции[?]
5
Поинты[?]
0
Вот у меня есть например две функции

C:
int __thiscall sub_1002FFB0(int this, void *Block, int a3)
{
  int v3; // eax
  char v5; // bl
  int v6; // edi
  void *v8; // eax
  int v9; // [esp-8h] [ebp-E0h]
  int v10; // [esp-4h] [ebp-DCh]
  _DWORD v11[38]; // [esp+10h] [ebp-C8h] BYREF
  char v12[12]; // [esp+A8h] [ebp-30h] BYREF
  int v13; // [esp+B4h] [ebp-24h] BYREF
  int v14; // [esp+BCh] [ebp-1Ch]
  int v15[2]; // [esp+C0h] [ebp-18h] BYREF
  _DWORD **v16; // [esp+C8h] [ebp-10h]
  int v17; // [esp+D4h] [ebp-4h]
  int *Blocka; // [esp+E0h] [ebp+8h]

  v3 = *(_DWORD *)(this + 8);
  v16 = (_DWORD **)this;
  if ( !(_BYTE)v3 )
    return 0;
  if ( (unsigned __int8)v3 != 7 )
  {
    sub_100336A0(v11, v9, v10);
    v17 = 0;
    sub_1001AA50((int)v11, "in Json::Value::find(begin, end): requires objectValue or nullValue");
    v8 = sub_100335F0((int)v11, v12);
    LOBYTE(v17) = 1;
    sub_1002E240(v8);
  }
  v15[0] = (int)Block;
  v5 = 4 * (a3 - (_BYTE)Block);
  v15[1] = 4 * (a3 - (_DWORD)Block);
  v17 = 2;
  Blocka = *(int **)this;
  sub_10035100(*(int **)this, &v13, v15);
  v6 = v14;
  if ( *(_BYTE *)(v14 + 13) || sub_1002E350(v15, (int *)(v14 + 16)) )
    v6 = *Blocka;
  if ( v6 == **v16 )
  {
    if ( Block )
    {
      if ( (v5 & 3) == 1 )
        sub_10093397(Block);
    }
    return 0;
  }
  if ( Block && (v5 & 3) == 1 )
    sub_10093397(Block);
  return v6 + 24;
}

C:
bool __thiscall sub_10030140(void *this, void *Block)
{
  return sub_1002FFB0((int)this, Block, (int)Block + strlen((const char *)Block)) != 0;
}
Как мне понять какие именно это функции и как их достать?
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,996
Реакции[?]
1,275
Поинты[?]
5K
Тебе название псевдокод ни о чем не говорит? Псевдокод означает, то что ты сам должен понять что за что отвечает.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Вот у меня есть например две функции
IDA Pro это интерактивный дизассемблер, т.е. требует твоего активного участия, поэтому тебе нужно самому проставлять имена переменных и функций.
Смотрим первую функу sub_1002FFB0, в ней есть строка "in Json::Value::find(begin, end)..." после некоторой проверки, логично предположить что sub_1002FFB0 это и есть Json::Value::find, поэтому this это указатель на класс Json::Value*, a2(Block) это begin, a3 это end, конструкции вида a3 - (_DWORD)Block только подтверждают что a2 и a3 связаны между собой каким-то одним регионом.
Дальше, видим что строка "requires objectValue or nullValue" появляется после проверки некоторого значения по this + 0x8, и если оно = 0 значит функция возвращает 0, если 7 происходит какая-то логика, логично предположить что int this + 0x8 это некоторый тип узла json, при этом 0 = ноль (null), 7 = объект ({ ... }).
Описывать это можно долго, идею ты понял, что ты постепенно заполняешь пробелы и чем больше знаешь тем дальше двигаешься.
 
Начинающий
Статус
Оффлайн
Регистрация
6 Мар 2020
Сообщения
59
Реакции[?]
5
Поинты[?]
0
IDA Pro это интерактивный дизассемблер, т.е. требует твоего активного участия, поэтому тебе нужно самому проставлять имена переменных и функций.
Смотрим первую функу sub_1002FFB0, в ней есть строка "in Json::Value::find(begin, end)..." после некоторой проверки, логично предположить что sub_1002FFB0 это и есть Json::Value::find, поэтому this это указатель на класс Json::Value*, a2(Block) это begin, a3 это end, конструкции вида a3 - (_DWORD)Block только подтверждают что a2 и a3 связаны между собой каким-то одним регионом.
Дальше, видим что строка "requires objectValue or nullValue" появляется после проверки некоторого значения по this + 0x8, и если оно = 0 значит функция возвращает 0, если 7 происходит какая-то логика, логично предположить что int this + 0x8 это некоторый тип узла json, при этом 0 = ноль (null), 7 = объект ({ ... }).
Описывать это можно долго, идею ты понял, что ты постепенно заполняешь пробелы и чем больше знаешь тем дальше двигаешься.
спасибо, довольно всё понятно описал
 
Сверху Снизу